App Thinning 是蘋果在去年 WWDC, 也就是 iOS 9 中推出的為 App 瘦身的一個新的技術。 App Thinning 主要分為 3 個部分:
* App Slicing
* Bitcode
* On Demand Resources
App Slicing
我們正常的應用中都會用到圖片資源,為了適配 iPhone 6 Plus 以及 iPhone 6, 圖片資源需要包含 @2x 的圖片 和 @3x 的圖片,而 Slicing 就是在這一步進行優化,Slicing 會根據用戶在 App Store 下載的不同設備選擇對應的資源。例如:當用戶使用 iPhone 6 在 App Store 上下載 App 的時候,App Store 只會給予他 @2x 的圖片,而不會像以前一樣,不管三七二十一我把所有的資源都給你,根據蘋果的描述,這大約能節約你 30% 到 50% 的大小。而你要做的事情,僅僅是使用 Xcode 7 IDE, 并且使用其中的 Assert Catalog 管理你的資源文件。
不過 Slicing 因為 iCloud 備份的問題, 知道 iOS 9.0.2 以及 Xcode 7.0.1 才可以被使用
Bitcode
Bitcode 是蘋果在你 App 被下載之前做的另外一件優化。Bitcode 是你的代碼編譯為最終可執行文件的中間的一層,當你的 App 以 Bitcode 的形式提交到 iTunes Connect 的時候,iTunes Connect 會自動為合適的機器編譯出對應的代碼,例如:對于 64 位機器的 iPhone 6 或者 iPad Air 2,Bitcode 會為其編譯出適合 64 位機器可執行文件。
對于 iOS app 來說, Bitcode 不是必須的,但 Bitcode 編譯選項為 Yes(這里應該只是一個過渡期,有些第三方庫如果不在繼續維護了需要盡快換掉), 對于 tvOS 和 watchOS 的 app,Bitcode 的的選項必須為 Yes。
On Demand Resources
最后一個 App Thinnig 步驟是 On Demand Resources, On Demand Resources 在游戲的制作中比較常見,主要為了一些沒用的資源在用到了才會去下載,比如,當我們設計一個游戲有 3 個關卡的時候,第一關的資源在 App 被下載的時候就已經下載好了,但是,出于對 App 大小的考慮,此時,第二關的資源是不需要下載的, 可以等到第一關結束以后,或者第一關進行到一半的時候后臺進行下載。
On Demand Resources 中的資源包括了 圖片,音效等等, 下面是一個 On Demand Resources 的 Demo, 語言的話,我們選用 Swift.
Demo 是這樣的: 首頁只有一個 Button,默認情況下 Assets 里面的圖片 Group 沒有被下載, 當點擊 Button 以后,會先去看 Group 時候已經存儲下載完畢, 如果沒有下載,則會去觸發一個下載請求,下載完成后,把圖片顯示到居中的位置。
@IBAction func downloadBarButtonItemTouchUpInside(sender: UIButton) {
let tags = NSSet(array: ["Group"])
self.resourceRequest = NSBundleResourceRequest(tags: tags as! Set)
self.resourceRequest?.conditionallyBeginAccessingResourcesWithCompletionHandler() {
resourceAvailable in
if resourceAvailable {
dispatch_async(dispatch_get_main_queue()) {
self.imageView.image = UIImage(named: "Group")
}
} else {
self.resourceRequest?.beginAccessingResourcesWithCompletionHandler() {
error in
if error == nil {
dispatch_async(dispatch_get_main_queue()) {
self.imageView.image = UIImage(named: "Group")
}
} else {
print(error)
}
}
}
}
}
另外,我們可以通過 Xcode 中的 Disk 來查看 On Demand Resources 的情況
