Vấn đề tương thích với iOS 9 – những việc tôi nghĩ chúng ta cần làm
Bài đăng này đã không được cập nhật trong 3 năm
Người dịch : Phan Hoàng Minh
Nguồn : iOS9対応でやろうと思っていることまとめ - NSBlogger
![ios-9-logo1.jpg](https://images.viblo.asia/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.
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.
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](https://images.viblo.asia/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.
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.
-
Làm SizeClass cho toàn màn hình
-
Build bằng iOS 9 SDK
-
Thử chia màn hình
-
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.
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.
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ó.
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
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.
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
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