作者:gregg mojica,原文鏈接,原文日期:2015/10/11
譯者:JackAlan;校對:lfb_CD;定稿:numbbbbb
更新: iOS 9 有個 bug 影響 APP 瘦身功能,這個 bug 在 iOS 9.0.2 被修復(fù)。從 AppStore 下載 App 時請留意。
iOS 9 已經(jīng)變成了一個大熱門。發(fā)布幾周后,這個新的操作系統(tǒng)在 iOS 設(shè)備上的安裝量就超過了一半。它的普及率打破了 iOS 7 在 2013 年的記錄。
在寫完上一篇文章之后 Search APIs and SFSafariViewController in iOS 9,我們繼續(xù)學(xué)習(xí)如何使用 App 瘦身這個 iOS 9 中令人興奮的特性。在此教程中,我們將探索為什么要使用 App 瘦身以及如何在自己的 App 中使用這個令人興奮的新特性。

在本次 WWDC 中公布的 App 瘦身是一個令人興奮的新技術(shù),這會改變整個下載的過程。由于蜂窩流量消費大、iOS 設(shè)備內(nèi)存限制以及網(wǎng)絡(luò)提速,App 瘦身是一個值得學(xué)習(xí)的至關(guān)重要的特性。進一步來說,因為 App 瘦身被推遲(稍后詳述),這也是一個絕好的時機去了解這個令人興奮的技術(shù)。
預(yù)備知識
在這篇教程中,我假設(shè)你知道如何使用 Xcode 和 IDE。如果這對你來說很陌生,或者你根本不知道 IDE 是什么,你應(yīng)該先看一下excellent free course.
我還假設(shè)你已經(jīng)知道如何在 AppStore 上或者 TestFlight (蘋果 beta 版 App 測試服務(wù))上發(fā)布 App。我不會具體到講述如何用 TestFlight,所以如果你對 TestFlight 很陌生或者對 App 發(fā)布流程很陌生,我建議你先讀閱讀AppCoda article。這些就足夠了,不需要其他預(yù)備知識,只要用心學(xué)習(xí)就好!
有了這樣的想法,那就讓我們開始吧。
App 瘦身簡介
當(dāng)前市場上存在大量的 iOS 設(shè)備,因此有多種屏幕尺寸和分辨率,要想保證一個 App 在多種屏幕下的展示效果需要大量的資源(比如 png、jpeg 以及二進制的 PDF)。不幸的是,這導(dǎo)致用戶需要下載一個巨大的程序包(之前的 iOS 版本強制用戶下載全部 App 文件,包括他們在用 iPhone 時永遠也不會用到的 iPad 適配圖片)。16G 的 iPhone 仍然有不少人在用(并且可能短時間內(nèi)不會消失),所以你要縮小 App 體積從而可以快速下載并且保證用戶有足夠的空間。App 瘦身特性讓這一切成為可能。
除了代碼和圖片,現(xiàn)在的 App 還包括可執(zhí)行代碼以及32位、64位版本(針對各種架構(gòu)進行優(yōu)化,比如 arm64、arm7S 和 arm7)、3D 圖形技術(shù)(例如 OpenGL、Metal 等)、聲音和其他文件。總之,現(xiàn)在的 App 已經(jīng)復(fù)雜到令人難以置信。這就是 App 瘦身需要解決的問題。
App 瘦身會自動檢測用戶設(shè)備類型(比如型號名稱),并為特定的設(shè)備下載相關(guān)內(nèi)容。換句話來說,如果你使用 iPad Mini 1(沒有視網(wǎng)膜屏,只有 1X 的分辨率),那么只有 1X 的文件會被下載。更強大更清晰的資源(比如 iPad Mini 3 或 4)將不會下載。因為用戶只需要下載他/她需要用到的內(nèi)容,這加速了下載過程,并節(jié)省了設(shè)備上的空間。
雖然這起初可能聽起來很復(fù)雜,我們將深入到具體的細節(jié)。幸運的是,Xcode 和 AppStore 會完成這項工作的絕大部分,開發(fā)者會輕松很多。因此,在本教程中不會有太多的代碼,而是重點關(guān)注理解 App 瘦身的過程和它用到的技術(shù)。
App 瘦身有三個主要方面,應(yīng)用程序切片(App Slicing
)、中間代碼(Bitcode
)和按需加載資源(On Demand Resources
)。在本教程中,我們將一一介紹。
應(yīng)用程序切片(App Slicing)
App瘦身第一個我們要討論的就是切片(slicing)。根據(jù)蘋果的文檔,
切片是創(chuàng)建和提供不同的目標設(shè)備的應(yīng)用程序包的變體(
variant
)的過程。
一個變體(variant
)只包含可執(zhí)行架構(gòu)和目標設(shè)備所需要的資源。換句話來說,應(yīng)用程序切片只提供給與每個設(shè)備相關(guān)的資源(取決于屏幕分辨率和架構(gòu)等等)。實際上,應(yīng)用程序切片完成了 App 瘦身的大部分工作。
假設(shè)你已準備好提交 App,和之前一樣,你會上傳 .IPA 或者 .App 文件到 iTunes Connect(但是必須使用 Xcode7,因為它包含支持 App 瘦身的 iOS 9 SDK)。然后 AppStore 會對 App 進行切片,創(chuàng)建特定的變體(variant
),這些變體將根據(jù)功能(capabilities
)分發(fā)給每個設(shè)備,。

按需加載資源(On Demand Resources)
為了完全理解 App 瘦身,你需要了解什么是按需加載資源(ODR
)。 按需加載的資源就是在 App 初次安裝后需要下載的文件。例如,游戲的特定關(guān)卡(以及和這些關(guān)卡相關(guān)的內(nèi)容)只有在玩家解鎖時才可以下載。此外,超過設(shè)置時間之后,玩家不需要的早期關(guān)卡可以被移除,以節(jié)省設(shè)備的存儲空間。
在 Xcode 的設(shè)置中(在 Build Setting 里),開啟按需加載資源需要把"Enable On Demand Resources"改為"YES".
中間代碼(Bitcode)
App 瘦身的最后一個內(nèi)容是中間代碼。中間代碼有點抽象,但在本質(zhì)上,它是在 App 被下載前,蘋果優(yōu)化它的新途徑。中間代碼使得 App 可以在任何設(shè)備上盡可能快速和高效執(zhí)行。中間代碼可以為最近使用的編譯器自動編譯 App,并且對特定的架構(gòu)做優(yōu)化(例如 arm64 64 位處理器,如 iPhone6s 和 iPad Air 2)。
中間代碼會和上文提到的其他瘦身技巧一起使用,去除針對其他架構(gòu)的優(yōu)化內(nèi)容,只下載需要的優(yōu)化內(nèi)容,從而減少下載文件的大小。
在 iOS 中,中間代碼是一種新特性,并且在新的工程中需要手動開啟。這個過程可以在 Build Setting 下把 Enable bitcode 修改為 YES。
在你的項目中使用 App 瘦身
盡管 Xcode 和 App Store 處理了 App 瘦身的絕大多數(shù)流程,你仍然需要采取一定的預(yù)防措施以確保你的 App 真的使用了這種新的技術(shù)。首要的,你必須使用資源目錄(asset catalogs
).在這一點上,大多數(shù)的 App 默認使用資源目錄(asset catalogs
)。如果你還沒有用采用資源目錄(asset catalogs
),你現(xiàn)有的大部分內(nèi)容可以被轉(zhuǎn)移到一個目錄下,只需要在 Xcode的項目設(shè)置中點擊"Use Asset Catalog"按鈕,如下所示。
Xcode 的新特性之一就是Sprite Atlases
。Sprite Atlases 基本上結(jié)合使用資源目錄和 SpriteKit(Xcode 中開發(fā) 2D 游戲用到的技術(shù))。同樣的,如果你是用 SpriteKit,App 瘦身是必須的。
測試 App 瘦身
如你所見,Xcode 和蘋果的 AppStore 已經(jīng)處理了絕大多數(shù) App 瘦身的過程,這樣在你自己的 App 中使用這個技術(shù)會容易很多。但是如何測試你的 App 并且確保它已經(jīng)應(yīng)用了 App 瘦身?幸運的是蘋果的 TestFlight 提供了完美的解決方案。除 AppStore 的應(yīng)用瘦身技術(shù)外,TestFlight 的用戶也可以體驗這個特性。
在本篇教程的第二部分,我們會介紹如何在 TestFlight 中使用 App 瘦身。
首先,下載這個基本空白的項目,解壓,并且在 Xcode 中運行,你將會注意到這個項目基本沒有什么除了在資源目錄(asset catalogs
)中的一系列的圖片(以及少量的代碼)。這個資源目錄(asset catalogs
) 也包含 1x、2x和3x 版本的 App 圖標。

首先,在模擬器或者真機上運行這個 App。打開設(shè)置應(yīng)用,點擊存儲和 iCloud 使用
這一項(如果不是 iOS 9 設(shè)備,點存儲
) 并選擇管理存儲空間。向下滑動到我們剛剛編譯好的 App 并點擊它。你會注意到它大概有 17.0 MB(當(dāng)上傳至 iTunes Connect 時這個大小可能略有不同)。
當(dāng)你使用 Xcode 構(gòu)建并運行一個 App 時,Xcode 不會自動處理 App 變體(variant
)并對 App 瘦身,因此整個 App 文件都在你的設(shè)備上。
下一步,在 Xcode 中單擊Product
標簽,選擇Archive
.
注意,你可能首先需要修改這個 App 的
Bundle Identifier
以匹配一個你自己創(chuàng)建的標識符。否則,這個 App 將不會被上傳到 iTunes Connect.
確保你在點擊"Submit"前,選擇了"Include bitcode"。如果一切順利的話,你將會看到一個綠色對號通知你這次構(gòu)建已經(jīng)被上傳。
現(xiàn)在登錄到iTunes Connect,創(chuàng)建一個新的 App(包含合適的 bundle ID、App 名字等等)。如果你不確定如何做這項工作,請參閱AppCoda TestFlight tutorial.

把你自己添加為內(nèi)部測試人員。注意,一次構(gòu)建保持“正在處理中”這個狀態(tài)幾小時是很尋常的。一旦這個 App 處理完成,選擇它并且按下開始測試按鈕。
一封電子郵件將會被發(fā)送到你的地址。確保你正在使用想要測試的 iOS 設(shè)備,打開這封電子郵件。你將會進入 TestFlight 應(yīng)用。
安裝此次構(gòu)建,一旦完成安裝,就回到設(shè)置應(yīng)用中,找到存儲,像此前一樣找到這個 App。注意,這個 App 現(xiàn)在接近 5.4 MB。這就是 App 瘦身的意義。
哇哦!你剛剛從你的 App 中剔除掉了 12.4 MB - 并且這只是一個非常簡單的 App。那些包含多種不同的資源(asset
)的 App 效果更好。
總結(jié)
在本篇教程,我們看到了 App 瘦身的強大。我們討論了 App 瘦身的三個主要的方面:應(yīng)用程序切片(App Slicing
)、中間代碼(Bitcode
)和按需加載資源(On Demand Resources
).
不幸的是,2015 年 9 月 24 日,蘋果在它的開發(fā)者門戶宣布 App 瘦身已經(jīng)被延遲,并且不會包含在 iOS 9(或者 9.0.1)公開發(fā)行版中:
應(yīng)用程序切片目前不可用于 iOS 9 應(yīng)用,因為 iCloud 創(chuàng)建 iOS 9 備份有問題,AppStore 中的一些 App 只能還原到相同型號的 iOS 設(shè)備。
當(dāng)用戶下載你的 iOS 9 應(yīng)用時,他們會獲取通用版本,而不是針對他們的設(shè)備類型的特定變體(
vatiant
)。TestFlight 將會給內(nèi)部測試用戶繼續(xù)分發(fā)變體(vatiant
). 應(yīng)用程序切片將會在未來的軟件更新中可以使用。現(xiàn)在你什么都不用做。
然而,就像我在文章的一開始中提到的,App 瘦身已經(jīng)被修復(fù)并且已經(jīng)為所有運行 iOS 9.0.2 的設(shè)備準備就緒。App 瘦身是一個簡直不可思議的工具,它將會持續(xù)加速 App 下載。
本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán),最新文章請訪問 http://swift.gg。