Vấn đề tương thích với iOS 9 – những việc tôi nghĩ chúng ta cần làm

Người dịch : Phan Hoàng Minh

Nguồn : iOS9対応でやろうと思っていることまとめ - NSBlogger


![ios-9-logo1.jpg](/uploads/18b720ca-1175-4865-90dc-83a8c14c3927.jpg)

iOS 9 sắp ra mắt

iOS 9 sẽ release vào khoảng quý 3 năm nay nên chúng ta cần chuẩn bị cho việc đối ứng với nó.

Nếu giống như các lần release trước, năm sau (2016) nếu chúng ta không build bằng iOS 9 SDK thì app thậm chí còn không thể submit được.

Tôi đã tổng hợp những gì mà tôi nghĩ cần phải làm để khiến 1 app đã tương thích với iOS 8 có thể tương thích với iOS 9.

Ngoài ra còn gì cần bổ sung thì mong các bạn hãy cho tôi biết.

Tương thích với iOS 9 nghĩa là gì?

Nghĩa là 1 app xây dựng bằng Xcode 7 và build với Base SDK là iOS 9.

20150901213308.jpg

Tuy nhiên, khi build bạn nhiều khả năng sẽ gặp lỗi nên chúng ta phải giải quyết những lỗi đó.

Để làm chuyện đó, dưới đây là một số vấn đề quan trọng bạn nên biết.

1. Tương thích với URL scheme


Vấn đề

Từ iOS 9 bạn sẽ không thể sử dụng method canOpenURL.

Nếu bạn dùng sẽ bị báo lỗi “This app is not allowed to query for scheme original scheme”.

Giải pháp

<key>LSApplicationQueriesSchemes</key>
<array>
    <string>hogehoge1</string>
    <string>hogehoge2</string>
</array>

Thêm LSApplicationQueriesSchemes vào trong info.plist và thêm URL scheme bạn muốn sử dụng vào trong đó.

Tham khảo

iOS 9 : Chú ý trong trường hợp URL scheme của bạn bị fail - Qiita

iOS 9 : Cách enable canOpenURL - NSBlogger

2. Chỉ định Simulator


Vấn đề

TARGET_IPHONE_SIMULATOR sẽ trở thành deprecated, mặc dù có vẻ nó vẫn hoạt động. Thêm vào đó, tên device của simulator trở thành “iPhone” thay vì “iPhone Simulator”.

Giải pháp

Dùng TARGET_OS_SIMULATOR.

#if TARGET_OS_SIMULATOR
    //simulator
#else
    //device
#endif

3. Hiển thị status bar


Vấn đề

Những gì liên quan đến deeplink trên iOS 9 đã được cải thiện để có thể sử dụng một cách thuận tiện hơn.

Chúng ta có thể quay lại app (mà trước khi chúng ta ấn vào deeplink) bằng cách tap vào ngoài cùng bên trái status bar, như hình dưới đây.

20150618190946.gif

Vì vậy, việc hiển thị status bar trở thành một việc cần phải làm, tất nhiên trừ trường hợp bạn có lí do đặc biệt để không hiển thị nó.

Giải pháp

Tổng hợp những gì liên quan đến status bar

4. Thay thế dylib bằng tbd


Vấn đề

Khi ta build bằng iOS 9 thì những thư viện đuôi dylib sẽ bị lỗi.

Giải pháp

Tôi thay tất cả đuôi dylib bằng đuôi tbd thì thấy build được bình thường, không biết cách giải quyết như vậy có ổn không?

Tham khảo

Why Xcode 7 shows *.tbd instead of *.dylib? - StackOverFlow

How do I link against .tbd files in Xcode 7? - Positive Thinking

Về lỗi library not found khi debug trên máy thật của XCode 7 beta - Apple Developer Forums

5. Tương thích SplitView trên iPad


![20150901220637.png](/uploads/ae8604b6-537b-47a4-9da8-0d3b5bb09b2c.png)

Vấn đề

Với Split View trên iOS 9 thì màn hình iPad sẽ chia làm hai. Việc điều chỉnh kích thước của màn hình sẽ trở thành một vấn đề.

Đây là một chuyện khá lằng nhằng vì có nhiều tình huống sẽ xảy ra. Trong một vài trường hợp cử động của app sẽ trở nên biến dị, gây cảm giác khó chịu cho người dùng.

Tại thời điểm hiện tại thì Split View mới chỉ hoạt động trên iPad Air 2.

20150901221243.png

Slice Over và Picture in Picture thì vẫn hoạt động trên các dòng iPad khác như các bạn thấy bên trên.

Giải pháp

Chúng ta sẽ kiểm tra phần này bằng các bước sau.

  1. Làm SizeClass cho toàn màn hình

  2. Build bằng iOS 9 SDK

  3. Thử chia màn hình

  4. Thử xoay màn hình

Tiêu chuẩn của Apple là app phải tương thích với chức năng này.

Adopting Multitasking Enhancements on iPad: Getting Oriented

Còn đây là các bước xử lí mà Apple công khai, như setting sao cho Split View chạy được vân vân.

20150901221515.png

Adopting Multitasking Enhancements on iPad: Slide Over and Split View Quick Start

Phức tạp quá…

Từ bây giờ SizeClass trở thành bắt buộc rồi.

Cách tránh

“Split View không thích hợp cho app tôi!”

“Làm Split View mất nhiều thời gian quá!”

Nếu vậy thì tốt nhất bạn nên disable chế độ multiasking đi.

Trong info.plist ta set UIRequiresFullScreen là YES thì multiasking sẽ bị disable.

Làm như vậy, Split View sẽ không thực hiện được và list Slice Over cũng sẽ không xuất hiện.

Có điều, Apple thì khuyến khích dùng Split View. Nói chung chủ trương của họ là tách màn hình thì sẽ dễ dùng hơn.

20150901222028.png

Cụ thể : TARGETS -> Deployment Info -< Requires full screen => check (info.plist cũng sẽ tự động được sửa theo).

6. Tương thích với BitCode


Vấn đề

Tôi bị lỗi như sau trong khi build bằng iOS 9.

ld: -U and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together

Cái quái gì thế? Ngồi một lúc thì tôi mới hiểu ra cái này liên quan đến chức năng BitCode của iOS 9.

Nói một cách đơn giản, nếu ta dùng BitCode - 1 công cụ build trung gian để submit thì sau này, Apple sẽ tự tối ưu và phân phối app của ta cho từng loại máy. Đây chính là cơ chế build và phân phối bằng server.

Cách tránh

Tôi cũng chưa biết cụ thể các bước làm BitCode là như thế nào nên trước hết tôi cứ tạm disable nó.

20150901224503.jpg

Tôi search trong Build Settings, tìm ra mục Enable BitCode và set nó thành NO.

Đây là giải pháp tạm thời, sau này tôi sẽ tìm cách sử dụng BitCode sau.

Tham khảo

App Thinning (iOS, watchOS)

-U and -bitcode_bundle (Xcode setting ENABLE_BITCODE=YES) cannot be used together - cách xử lí - Qiita

7. Tương thích với ATS


Vấn đề

Một policy của Apple sẽ được áp dụng từ iOS 9, đó là “App Transport Security”. Nói đơn giản là tất cả giao thức kết nối mạng sẽ phải trở thành HTTPS.

“Build trên iOS 9 ngon rồi!”, bạn nghĩ vậy và bật app lên thì thấy tự nhiên bị crash. Nguyên nhân của việc đó chính là do ATS.

Hồi iOS 9 beta vừa mới ra lò, ATS vẫn active trên những app build bằng iOS 8 nhưng từ beta5 trở đi thì chỉ active trên những app build bằng iOS 9 mà thôi. Việc này quả thật là dở vì ảnh hưởng đến hầu hết các app đã release.

Giải pháp

Phía server phải xử lí HTTPS, xử lí ngon thì sẽ không xảy ra chuyện gì. Sử dụng TLSv1.2 trở lên là OK.

Cách tránh

Trong trường hợp server không thể tiến hành xử lí ngay, chúng ta có thể tránh gây ra lỗi bằng cách enable giao thức HTTP như dưới đây.

20150901220431.jpg

Chữ đỏ : Điền domain HTTP cần enable vào

<key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
        <dict>
        <key>(ここにHTTP通信を許可するドメイン)</key>
            <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
            </dict>
        </dict>
    </dict>

Xử lí như trên giúp chúng ta có thể enable giao thức HTTP đối với các link do ta chỉ định. Cách làm này thì Apple không khuyến khích.

Ngoài ra còn có cách enable giao thức HTTP đối với toàn bộ kết nối của app nhưng nghe đâu làm như vậy có thể bị reject.

Tham khảo

Cách tránh việc giao thức HTTP trở thành SSL trên iOS 9 - NSBlogger

Configuring App Transport Security Exceptions in iOS 9 and OSX 10.11 | Steven Peterson

Vấn đề ATS trên iOS 9 - Qiita

iOS 9 AFHTTPRequestOperation failure · Issue #2779 · AFNetworking/AFNetworking - GitHub

8. Tương thích với Ipv6


Vấn đề

iOS 9 ưu tiên kết nối Ipv6. Nếu bạn sử dụng các API NSURLConnection hay FnetWork thì không sao. Tuy nhiên, có nhiều API chỉ hoạt động với IPv4 – trong trường hợp này thì bạn cần phải sửa chúng.

Giải pháp

Tương thích IPv6 only trên iOS 9 - Qiita

Tham khảo

Supporting IPv6 in iOS 9 - News and Updates - Apple Developer

Hạn cuối để thực hiện tương thích với IPv6 là đầu năm 2016. Nếu không làm vậy thì bạn sẽ không thể submit được nữa.

9. Search APIs


Tương thích với các chức năng mới

Spotlight được cải thiện rất nhiều ở iOS9. Phần thực hiện tương đối dễ dàng hơn mà thành quả lại to lớn nên tôi nghĩ các bạn nên làm.

Tham khảo

WWDC 2015 : Tổng hợp nội dung phát biểu liên quan Search APIs của iOS 9 - NSBlogger

Sau khi đọc và tìm hiểu "iOS 9 : Search API best practices and FAQs" - Qiita

Lời kết

Ngoài ra các bạn thấy còn gì cần bổ sung thì xin hãy cho tôi biết.

iOS 7 nặng về sửa design, iOS 8 nặng về sửa quyền hạn, iOS 9 thì lại nặng về sửa network.

Đằng nào cũng phải làm thì chúng ta nên làm nhanh là tốt nhất.


All Rights Reserved