iOS 9 下週就正式推出了,你的 App 真的適配好了嗎?


編者按:本文來自騰訊第三方崩潰捕獲服務 Bugly,近期他們支持 ATS 及 Bitcode 特性的 SDK 即將發佈。作者馮義力,騰訊 Bugly SDK 開發工程師。昨天 Apple 宣佈,iOS 9 正式版會在 9 月 16 日開始推送。經歷過 5 個 Beta 版後,開發者們,你們的 App 都做好適配了嗎?

Apple 秋季產品發佈會剛剛結束,iOS 9 GM 版本也正式發佈了。新的 iPhone 設備即將開售,iOS 9 系統升級也將會在下週開始陸續進行推送。

在這之前,我們還可以為自己的 App 兼容適配做點什麼,或者説,我們的 App 真的已經兼容適配好 iOS 9 系統了嗎?

從 7月 份開始到現在,Apple 已發佈 5 個 iOS 9 的 Beta 版本,相信開發者在這段時間也已經把 iOS 9 系統的特性基本了解清楚,也為自己的 App 進行了一系列兼容適配處理。

但在這裏,筆者還是要再次跟大家聊聊 iOS 9 中兩個比較特別的特性及其兼容問題,即:App Transport Security 和 App Thinning。

App Transport Security

引用App Transport Security is a feature that improves the security of connections between an app and web services. The feature consists of default connection requirements that conform to best practices for secure connections.

App Transport Security (ATS) 是 Apple 為提高系統及應用安全性而在 iOS 9 和 OS X EI Capitan 中引入的新特性,必然,出於安全性的考慮,在新發布的 watchOS 2 系統中也會適用。

一旦開啟 ATS 後,應用所有的網絡請求將會自動轉換為 HTPPS 傳輸,且採用一系列配置要求來保證數據傳輸的安全性,包括:

  • Transport Layer Security 協議版本要求 TLS1.2 以上
  • 服務的 Ciphers 配置要求支持 Forward Secrecy 等
  • 證書籤名算法符合 ATS 要求等

這些配置項在升級服務器支持 HTTPS 過程中都需要嚴格遵守的,否則就會導致你的 HTTPS 服務在 iOS 9 系統中連接仍是失效的。

如果你的 App 的服務也在升級以適配 ATS 要求,可以使用如下的方式進行校驗:

引用在 OS X EI Capitan 系統的終端中通過 nscurl 命令來診斷檢查你的 HTTPS 服務配置是否滿足 Apple 的 ATS 要求:$ nscurl --verbose --ats-diagnostics https://<your_server_domain>

當然,你也可以參考 Apple 提供官方指南 App Transport Security Technote 進行服務的升級配置以滿足 ATS 的要求。

Apple 雖然希望開發者可以積極的參與併為系統及應用安全共同努力,但官方仍提供了一些參考配置去禁用 ATS 功能或降低 ATS 的安全性要求。

開發者可以在 App 的 Info.plist 中添加 NSAppTransportSecurity 的相關配置,用以禁用 ATS 或者添加白名單,可用的配置參數如下:

  • NSAllowsArbitraryLoads - 設置 true 即支持所有 HTTP 請求
  • NSExceptionDomains - 添加白名單
  • NSExceptionMinimumTLSVersion - 白名單指定域名支持的 TLS 版本
  • NSExceptionRequiresForwardSecrecy - 白名單指定域名是否支持 Forward Secrecy
  • NSExceptionAllowsInsecureHTTPLoads - 白名單指定域名禁用 ATS
  • NSThirdPartyExceptionMinimumTLSVersion - 白名單指定第三方服務域名最低支持的 TLS 版本
  • NSThirdPartyExceptionRequiresForwardSecrecy - 白名單指定第三方服務域名是否支持 Forward Secrecy
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads - 白名單指定第三方域名禁用 ATS

舉個例子:

  • 禁用所有連接使用 ATS

在 Info.plist 中配置禁用 ATS:

<key>NSAppTransportSecurity</key>
<dict>

<key>NSAllowsArbitrary</key>

<true/>

</dict>

  • 指定域名禁用 ATS

在 Info.plist 中配置 App 的服務域名 mine.test.com 支持 HTTP:

<key>NSAppTransportSecurity</key>

<dict>

<key>NSExceptionDomains</key>

<dict>

<key>mine.test.com</key>

<dict>

<key>NSExceptionAllowsInsecureHTTPLoads</key>

<false/>

</dict>

</dict>

</dict>

  • 指定域名修改 ATS 安全要求

在 Info.plist 中配置第三方服務 third.test.com 的 TLS1.1 及禁用 Forward Secrecy:

<key>NSAppTransportSecurity</key>

<dict>

<key>NSExceptionDomains</key>

<dict>

<key>mime.test.com</key>

<dict>

<key>NSExceptionAllowsInsecureHTTPLoads</key>

<false/>

</dict>

<key>third.test.com</key>

<dict>

<key>NSThirdPartyExceptionMinimumTLSVersion</key>

<string>1.1<string/>

<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>

<false/>

</dict>

</dict>

</dict>

App Thinning

引用The App Store and operating system optimize the installation of iOS and watchOS apps by tailoring app delivery to the capabilities of the user’ s particular device, with minimal footprint. This optimization, called app thinning, lets you create apps that use the most device features, occupy minimum disk space, and accommodate future updates that can be applied by Apple. Faster downloads and more space for other apps and content provides a better user experience.

開發者都知道,當前 iOS App 的編譯打包方式是把適配兼容多個設備的執行文件及資源文件合併一個文件,上傳和下載的文件則包含了所有的這些文件,導致佔用較多的存儲空間。

App Thinning 是一個關於節省 iOS 設備存儲空間的功能,它可以讓 iOS 設備在安裝、更新及運行 App 等場景中僅下載所需的資源,減少 App 的佔用空間,從而節省設備的存儲空間。

根據 Apple 官方文檔的介紹,App Thinning 主要有三個機制:

  • Slicing

引用開發者把 App 安裝包上傳到 AppStore 後,Apple 服務會自動對安裝包切割為不同的應用變體 (App variant),當用户下載安裝包時,系統會根據設備型號下載安裝對應的單個應用變體。

  • On-Demand Resources

引用ORD (隨需資源) 是指開發者對資源添加標籤上傳後,系統會根據 App 運行的情況,動態下載並加載所需資源,而在存儲空間不足時,自動刪除這類資源。

  • Bitcode

引用開啟 Bitcode 編譯後,可以使得開發者上傳 App 時只需上傳 Intermediate Representation (中間件),而非最終的可執行二進制文件。 在用户下載 App 之前,AppStore 會自動編譯中間件,產生設備所需的執行文件供用户下載安裝。

其中,Bitcode 的機制可以支持動態的進行 App Slicing,而對於 Apple 未來進行硬件升級的措施,此機制可以保證在開發者不重新發布版本的情況下而兼容新的設備。

如果你的應用也準備啟用 Bitcode 編譯機制,就需要注意以下幾點:

  • Xcode 7 默認開啟 Bitcode,如果應用開啟 Bitcode,那麼其集成的其他第三方庫也需要是 Bitcode 編譯的包才能真正進行 Bitcode 編譯
  • 開啟 Bitcode 編譯後,編譯產生的.app 體積會變大 (中間代碼,不是用户下載的包),且.dSYM 文件不能用來崩潰日誌的符號化 (用户下載的包是 Apple 服務重新編譯產生的,有產生新的符號文件)
  • 通過 Archive 方式上傳 AppStore 的包,可以在 Xcode 的 Organizer 工具中下載對應安裝包的新的符號文件

iOS 9 的 ATS 特性和 App Thinning 特性給開發者帶來安全提升和體驗上的優化,也是開發者在後續 App 的兼容適配方便會考慮的事項。

本文來自讀者投稿,不代表 36氪 立場


資料來源:36Kr

如果喜歡我們的文章,請即分享到︰