寫在前面的廢話
原文 https://developer.apple.com/library/prerelease/content/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html#//apple_ref/doc/uid/TP40012582-CH35-SW3
本來看了原文想自己翻譯的,突然發現網上已經有了,so
譯文:
http://www.lxweimin.com/p/330303ac0410
參考:
http://www.cnbeta.com/articles/401221.htm
然后,仔細拜讀后,發現譯文有些沒翻譯出來,so,還是自己動手吧.
譯文
App Store和操作系統優化了iOS, tvOS, 和 watchOS上的app的安裝,它們在用戶特定的設備上讓app占用最小的空間.這種優化叫做 App 瘦身,它讓你創建出的app能最大限度使用設備的特性,占用最小的磁盤空間,并能適應蘋果未來的更新.在快速下載和節約空間這兩點上,會提供更好的用戶體驗.
這一章描述了三種APP瘦身的方式:slicing, bitcode和 on-demand resources.
Slicing(iOS,tvOS) 切割
Slicing是針對不同設備,創建和交付app bundle的變體.一個變體只提供目標設備所需要的architecture和資源.你還是可以繼續向iTunes Connect提供你開發和更新的完整app版本.App Store會根據你的app支持的設備種類創建不同的app變體.如圖片資源會根據它們的解決方案和設備族進行切分.GPU資源被根據設備性能被切分.(PS:意思是不同的變體有不同的圖拍你和GPU資源).對tvOS app來說,image catelog asset中的圖片被切分,大的app icon會被移除.當用戶安裝一個app時,下載和安裝的就是一個適合于用戶設備的app變體.
在 開發過程中,Xcode的模擬器就進行了切割,所以你創建和測試的是一個本地的變體.當你在設備(真機或模擬器)上build和run你的app時,Xcode切割了你的app.當你創建Archieve時,Xcode是包含了所有的app版本的,也允許你導出變體.(PS:我還沒找到在哪里導出)
Note:app切割只支持ios9(含)以上的設備;其他的版本,App Store還是給用戶通用的app 圖1-1
切割存在于你日常的開發和發布過程中,大概有如下方面:
1. 在Xcode中,指定目標設備,在asset catalog中為image提供多重解決方案.為了讓資源被切割,你必須使用asset catalog
2. 選擇模擬器或者真機設備,build,run
Xcode對選定的設備build一個app的變體,這樣縮短了編譯的時間,你也能在本地測試不同的變體.
3. 創建app的Archieve,為目標設備在本地導出一個變體.
測試所有你導出的變體,盡早發現配置錯誤.
4. 上傳app到iTunes Connect
App Store從archive里創建不同的app變體.一共創建多少種變體取決于Xcode project配置的architecture和資源.
5. 在iTunes Connect中,給你的測試者們發布一個預發布版本.
測試者通過TestFlight軟件在目標設備上安裝預發布版本.TestFlight會下載一個適用于用戶設備的app變體.
Note:在正式發布app前,為了測試App Store為用戶創建的變體,你只能邀請內部測試員(存在于iTune Connect的team中的用戶)用TestFlight下載變體.如果你想邀請外部測試員(只有email的用戶),他們只好等Beta App Review審核了app后,才能下載變體.
6. 在iTunes Connect中發布app
用戶在設備上安裝app,App Store下載一個適合于用戶設備的app變體.
Bitcode
Bitcode是一個編譯過的程序的中間表示形式.你上傳到iTunes Connect的包含了bit code的app會在App Store處編譯和鏈接.包含了bit code 的app會讓蘋果在將來二次優化你的二進制代碼,而不需要你再提交一個新的app版本到store上了.
Note:對iOS app來說,bitcode是默認選項,不過也是可選的.
對watchOS and tvOS app來說,bit code是必須的.如果你用了bit code,所有app和app bundle的frameworks都需要包含bit code.
當你把你的app提交到iTunes Connect后,你可以下載build產生的dSYMs文件,在這里有對它的描述:https://developer.apple.com/library/prerelease/content/documentation/IDEs/Conceptual/AppDistributionGuide/AnalyzingCrashReports/AnalyzingCrashReports.html#//apple_ref/doc/uid/TP40012582-CH21-SW3
On-Demand Resources(iOS, tvOS)
On-demand resources 是資源-----如圖片和聲音-----你可以設置tag,可以通過tag成組的請求.App Store在服務器上保存了這些資源,你可以下載它們.On-demand resources支持快速下載和減小app的size.節省了app第一次啟動的時間.例如:一個game app會劃分游戲資源的層次,只有當用戶要觸發到那一層時,app才去請求那一層的資源.(PS:類似于關卡).簡單的例子如,只有用戶購買了app中的付費部分時,app才會去會請求付費部分的資源.
當On-demand resources資源不再被需要時,或者磁盤空間低時,系統會清理On-demand resources資源.如果你在App Store之外的渠道發布或測試,你就需要自己保存這些資源.不支持可執行的On-demand resources(不支持代碼下載,只支持資源下載).App Store也切割(Slice)On-demand resources,這樣可以提升用戶體驗.
對用戶來說,On-demand resources是透明的,它在后臺傳輸.如圖3-1
怎樣在app中建立on-demand resources呢?參考:
on-demand resources指引:
https://developer.apple.com/library/prerelease/content/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html#//apple_ref/doc/uid/TP40015083
NSBundleResourceRequest Class Reference:
https://developer.apple.com/reference/foundation/nsbundleresourcerequest