6月9日結(jié)束的蘋果WWDC15大會上,蘋果公司推出了多個新技術(shù),不過對于手游開發(fā)者們來說,可能最具有革命意義的是庫克在發(fā)布會現(xiàn)場都沒有提到的應(yīng)用瘦身功能(App Thinning),它是其Xcode 7測試版的功能之一。
按照蘋果官方的解釋,應(yīng)用瘦身功能分為三個部分:首先是分割功能Slicing,它可以對應(yīng)用/游戲內(nèi)容進(jìn)行分割,根據(jù)用戶設(shè)備類型和屏幕分辨率的不同分發(fā)定制化下載包,開發(fā)者只需要把完整應(yīng)用包的內(nèi)容上傳到iTunes Connect即可。
另外,該功能還包含了中間代碼功能(Bitcode),可以讓蘋果在未來為你的應(yīng)用進(jìn)行再次優(yōu)化,而避免了發(fā)布新版本的麻煩,同時可以大大減少調(diào)試工作量。
應(yīng)用瘦身的第三個功能就是on-demand資源,開發(fā)者可以把應(yīng)用初始化用不到的資源分類打包上傳到App Store,在用戶使用的時候系統(tǒng)會根據(jù)資源標(biāo)簽在必要的時候調(diào)用資源,當(dāng)某些資源不再使用的時候會被系統(tǒng)自動清除,這樣不僅減少了應(yīng)用下載和加載時間,還大大縮小了安裝包體。
對于開發(fā)者們來說,這個功能可以減少很多的bug調(diào)試時間,讓游戲包體變得更小,提高各種設(shè)備用戶的游戲體驗??梢哉f,蘋果的這個技術(shù)在很大程度上解決了不同設(shè)備的性能差異問題,實現(xiàn)了one-for-all的需求。不過Gamelook認(rèn)為這個功能如果安卓渠道可以用的話,就會大大降低設(shè)備碎片化給開發(fā)者們帶來的適配難題,拉近和iOS設(shè)備之間的差距。
以下請看Gamelook整理的應(yīng)用瘦身功能以及On-demand資源內(nèi)容的詳細(xì)介紹(更多詳細(xì)內(nèi)容請參考官網(wǎng)英文地址):
第一部分:應(yīng)用瘦身以及其功能
App Store和操作系統(tǒng)(iOS和watchOS)根據(jù)用戶特定的設(shè)備能力量身優(yōu)化應(yīng)用安裝,以達(dá)到最低的設(shè)備空間占用。這個優(yōu)化的過程,就被成為應(yīng)用瘦身,它可以讓你創(chuàng)作的應(yīng)用利用大多數(shù)的設(shè)備功能、占用最小的磁盤空間并且為蘋果公司未來的更新進(jìn)行調(diào)整。更快的下載速度和更少的空間占用可以帶來更好的用戶體驗。
本章節(jié)描述的是應(yīng)用瘦身的3大組件:應(yīng)用分割(Slicing)、中間代碼(Bitcode)和On-demand資源(Resources)。
應(yīng)用分割功能(Slicing,僅針對iOS平臺)
Slicing就是創(chuàng)造并傳輸為不同目標(biāo)設(shè)備而設(shè)計的變體應(yīng)用包(variant,以下簡稱定制化下載包)的處理過程。一個定制化下載包僅包含針對特定設(shè)備所需要的可執(zhí)行架構(gòu)以及資源。你可以繼續(xù)開發(fā)并且把完整版本的應(yīng)用上傳到iTunes Connect,然后App Store會根據(jù)玩家設(shè)備類型和分辨率創(chuàng)造并傳輸對應(yīng)的應(yīng)用。這里,你可以認(rèn)為資源根據(jù)玩家設(shè)備分辨率和類型的不同而分割成了多種類型,GPU資源也根據(jù)設(shè)備能力進(jìn)行了切分,當(dāng)用戶安裝應(yīng)用的時候,他們可以下載并安裝適合自己設(shè)備的定制化應(yīng)用包。
Xcode會在研發(fā)過程中模擬分割,所以你可以在本地創(chuàng)作并測試定制應(yīng)用包,當(dāng)你在一個設(shè)備上研發(fā)并運(yùn)行應(yīng)用的時候,Xcode會對其進(jìn)行分割,當(dāng)你創(chuàng)造一個檔案的時候,Xcode會包含完整版的應(yīng)用,但允許你從檔案中輸出不同的定制應(yīng)用包。
提醒:對于iOS應(yīng)用來說,應(yīng)用分割僅支持最新版本的iTunes,以及運(yùn)行iOS 9.0或者更高系統(tǒng)的設(shè)備,否則的話,App Store將會為用戶分發(fā)統(tǒng)一的安裝包。
分割功能流程圖
應(yīng)用分割是在研發(fā)過程和分銷過程中進(jìn)行的,基本處理程序如下:
1.在Xcode里,定位目標(biāo)設(shè)備并在資源目錄中提供多種分辨率圖形,你必須使用資源目錄這樣才能進(jìn)行分割。
2.在模擬器或者一個設(shè)備上研發(fā)并運(yùn)行應(yīng)用。
3.Xcode會為選定設(shè)備類型生成變體包,提高調(diào)試銷量并允許你在本地設(shè)備進(jìn)行變體包測試。
4.創(chuàng)建應(yīng)用檔案并為特定設(shè)備輸出對應(yīng)的變體應(yīng)用包。
5.在目標(biāo)設(shè)備測試所有的變體包以更早的發(fā)現(xiàn)硬件配置方面的問題。
6.把應(yīng)用上傳到iTunes Connect。
7.App Store從檔案中創(chuàng)建單獨的應(yīng)用定制包,定制包的數(shù)量取決于Xcode項目中所存在的架構(gòu)和資源的數(shù)量。
8.在iTunes Connect當(dāng)中,向制定測試者們分發(fā)測試版的應(yīng)用。
9.測試者們通過TestFlight在你的應(yīng)用所支持的設(shè)備上安裝測試版本,TestFlight會根據(jù)用戶設(shè)備的不同而下載特定的變體應(yīng)用包。
注意:為了測試App Store在應(yīng)用發(fā)布之前為你創(chuàng)造的變體包,最好是只邀請內(nèi)部測試者(你團(tuán)隊里的iTunes Connect用戶)并且使用TestFlight下載變體包。如果邀請了外部測試者(比如只通過郵箱地址登錄),那么他們就必須等待Beta App Review在他們下載變體包之前通過了你的應(yīng)用。
10.然后在iTunes Connect里發(fā)布你的應(yīng)用。
11.用戶在應(yīng)用支持的設(shè)備上進(jìn)行安裝,App Store應(yīng)用下載會根據(jù)用戶設(shè)備類型分發(fā)變體應(yīng)用包。
中間代碼功能(Bitcode ,適用于iOS和watchOS)
Bitcode是一個已編譯程序(Compiled Program)的中間代碼(intermediate representation)。如果你上傳到iTunes Connect里的應(yīng)用包含bitcode的話,就可以被編譯和鏈接到App Store。加入Bitcode可以讓蘋果在未來對你的應(yīng)用二進(jìn)制(app binary)進(jìn)行再次優(yōu)化,而不需要你向App Store提交新版本。
注意:對于iOS應(yīng)用來說,Bitcode是默認(rèn)但可選擇的。如果你提供Bitcode,那么應(yīng)用包里的所有應(yīng)用和框架都需要加入Bitcode,而watchOS應(yīng)用則必須加入Bitcode。
On-Demand資源(適用于iOS系統(tǒng))
On-Demand資源指的是你可以通過關(guān)鍵詞和命令的方式進(jìn)行分組歸類的資源,比如圖像和音頻,App Store會把這些資源放在蘋果服務(wù)器上并且為你管理下載。On-Demand資源可以加快下載速度并縮小應(yīng)用包體,提高用戶的首次登錄體驗。比如,一款游戲應(yīng)用可以根據(jù)等級和任務(wù)的不同把資源分組,在玩家達(dá)到下一個等級或者完成一個任務(wù)之后才會用到后續(xù)的資源,同樣,應(yīng)用也可以只在用戶進(jìn)行IAP購買的時候提供對應(yīng)的資源。
當(dāng)一些on-demand資源不再需要而且磁盤空間較少的時候,操作系統(tǒng)會自動清除它們。如果你在App Store之外對自己的應(yīng)用進(jìn)行測試或者分發(fā),那就需要你自己來管理這些On-Demand資源。需要注意的是,可執(zhí)行的on-demand資源是不支持的,App Store也會對on-Demand資源進(jìn)行分割(即上面說過的Slicing),進(jìn)一步提高用戶體驗。
對于用戶們來說,on-demand資源是以透明的形式在后臺運(yùn)作的,當(dāng)用戶需要對應(yīng)功能的時候,這些資源就會被提供。
第二部分:什么是On-Demand資源
提示:這是一個正在研發(fā)的API或技術(shù)的概要文件,蘋果公司提供這些信息主要是為了幫助你通過蘋果產(chǎn)品使用這些技術(shù)或者編程界面而做好計劃,該信息有可能會在未來發(fā)生改變,本文當(dāng)中提到的軟件應(yīng)該以最終發(fā)布的操作系統(tǒng)測試和最終文檔為準(zhǔn),未來有可能會提供新版本的文檔信息。
On-Demand資源指的是寄存在App Store并與應(yīng)用下載包分離的應(yīng)用內(nèi)容,使用On-demand資源可以讓應(yīng)用包體更小,安裝時間更短。
本部分文檔主要是提供你的應(yīng)用使用on-demand資源所需要的信息。在閱讀本文檔之前,你首先應(yīng)該熟悉資源編程,想要獲得更多信息,請參考資源編程指南。
On-Demand資源是有生命周期的
On-Demand資源可以讓應(yīng)用包體更小,下載速度更快,應(yīng)用內(nèi)容更豐富,主要是通過在App Store存儲資源的方式實現(xiàn),與你的應(yīng)用包體是分開的。
蘋果操作系統(tǒng)會根據(jù)你的應(yīng)用請求而管理on-demand資源的下載和存儲,基本運(yùn)作流程如下:應(yīng)用請求資源-使用資源-然后釋放請求。被下載之后,這些資源會通過多次登錄而留存在用戶設(shè)備上,讓應(yīng)用體驗更快。
On-Demand資源是默認(rèn)自動開啟的,前提是你的項目支持對應(yīng)的OS版本。
標(biāo)簽主要用于辨識和對on-demand資源進(jìn)行分組。
在研發(fā)過程中,標(biāo)簽用于辨識和分組on-demand資源,標(biāo)簽名字可以用于辨識資源和應(yīng)用的關(guān)系。Xcode會提供創(chuàng)造和管理標(biāo)簽的工具,同時在應(yīng)用被安裝之后或者安裝完成之后指定特殊標(biāo)簽。
在運(yùn)行期間,應(yīng)用負(fù)責(zé)管理標(biāo)簽。
應(yīng)用請求會通過操作系統(tǒng)獲得標(biāo)簽,然后系統(tǒng)會下載并檢查組件資源并且下載所有不存在于用戶設(shè)備上的所需資源。在此過程中,應(yīng)用可以追蹤下載過程,如果有必要還可以調(diào)整優(yōu)先級。
標(biāo)簽被使用完之后,在從存儲中移除標(biāo)簽的時候,應(yīng)用可以設(shè)定一個系統(tǒng)預(yù)留優(yōu)先級,優(yōu)先級較低的標(biāo)簽會首先被清除。
在與系統(tǒng)互動的時候會用到2個classes:NsbundleResourceRequest用來管理標(biāo)簽的使用、追蹤下載并調(diào)整下載優(yōu)先級;NSBundle的一個擴(kuò)展class被用來設(shè)定標(biāo)簽的預(yù)留優(yōu)先級。
On-demand資源可以是多種類型,但可執(zhí)行代碼除外。
有關(guān)資源的一些信息
在電腦程序中,資源指的是和程序的可執(zhí)行代碼同時存在的數(shù)據(jù)文件。有了資源文件,你的代碼就可以極大的簡化,不必通過創(chuàng)造復(fù)雜的數(shù)據(jù)或者圖形設(shè)置寫復(fù)雜的代碼。比如,和用代碼按像素形式來創(chuàng)造圖像不同的是,在圖形編輯器中創(chuàng)造資源可以更加有效率和實用。為了充分利用資源的優(yōu)勢,你的代碼只需要在運(yùn)行的時候加載并使用即可。
除了簡化你的代碼之外,資源還是所有應(yīng)用國際化管理非常重要的一部分。你在應(yīng)用里不需要編寫字符串并以及其他用戶可見的內(nèi)容,你可以把這些內(nèi)容放在外部的資源文件里,這樣本地化應(yīng)用的時候就變得非常簡單,你只需要為每一種所支持的語言創(chuàng)造新版本的資源文件即可。OS X和iOS也使用了這樣方式管理本地化資源,根據(jù)用戶的偏好語言加載需要的資源文件。
本文件提供有關(guān)OS X和iOS系統(tǒng)支持的資源類型信息以及你如何在寫代碼的時候使用這些資源的指導(dǎo)。本文件并不針對資源創(chuàng)作過程,大多數(shù)的資源都是通過第三方或者開發(fā)者自己的工具提供,另外,盡管本文的講述的是應(yīng)用中的資源使用,但這些信息同樣適用于其它類型的可執(zhí)行包,包括框架和插件。
在閱讀本文檔之前,你需要熟悉應(yīng)用包體的組織結(jié)構(gòu),理解這個結(jié)構(gòu)可以讓管理變得更容易,并且尋找你的應(yīng)用所需要使用的資源也更為便捷。
應(yīng)用可以包含很多類型的資源,但有些資源是由iOS和OS X直接支持的。
Nib文件存儲你的應(yīng)用的UI對象
Nib文件是用來創(chuàng)作iOS和Mac應(yīng)用的經(jīng)典文件類型,一個nib文件就是你希望在運(yùn)行期間重新創(chuàng)作的一系列freeze-dried對象數(shù)據(jù)檔案。Nib文件通常用于存儲預(yù)置的窗口、視圖以及其他可視化對象,但是也可以用來存儲非可視化對象,比如controllers。
你可以在Xcode中通過Interface Builder編輯Nib文件,它可以提供一個i額圖形編輯器來管理對象。當(dāng)你隨后把一個nib文件加載到應(yīng)用中的時候,nib加載代碼會實例化文件中的每一個對象,并且會把它重新存儲于你在Interface Builder中所定義的state中。這樣,你在Interface Builder中看到的就和應(yīng)用運(yùn)行中所看到的內(nèi)容一致了。
字符串資源包含可本地化的文本。
在iOS和Mac應(yīng)用中,圖像、音頻和影響資源的重要性很高,圖像可以用來創(chuàng)造獨特的視覺風(fēng)格,音頻和影像文件同樣可以強(qiáng)化整體的用戶應(yīng)用體驗,同時可以簡化代碼。兩種操作系統(tǒng)都支持加載并在應(yīng)用中呈現(xiàn)這些資源。
哪些應(yīng)用適合使用On-Demand資源功能?
On-Demand資源指的是和應(yīng)用下載包分離并且存在App Store上的應(yīng)用內(nèi)容,應(yīng)用請求一系列的on-demand資源,操作系統(tǒng)管理下載和存儲。可以使用on-demand資源獲得優(yōu)勢的應(yīng)用包擴(kuò):
1.初始化資源延遲加載的應(yīng)用,這些應(yīng)用的一些資源屬于應(yīng)用的主要功能,但在初次登錄的時候卻用不到,資源會被標(biāo)記為需要初始化,當(dāng)應(yīng)用運(yùn)行的時候,操作系統(tǒng)會自動下載這些資源,比如圖形編輯應(yīng)用。
2.應(yīng)用資源需要延遲加載的應(yīng)用:這類應(yīng)用只在特定情況下使用一些資源,比如在一個帶有很多關(guān)卡的游戲中,只有玩家們進(jìn)入特定的關(guān)卡才需要使用對應(yīng)的資源。
3.需要遠(yuǎn)程存儲低使用率資源的應(yīng)用:這類應(yīng)用的有些資源使用率非常低,只有在需要的時候才加載這部分資源。比如有些應(yīng)用的新手教程資源只有在第一次打開應(yīng)用的時候才會用到,以后可能再也不會用到,后來的一些功能教學(xué)也只是用到的時候才加載,隨后再也不使用。
4.需要遠(yuǎn)程存儲IAP資源的應(yīng)用:這類應(yīng)用通過IAP提供額外的資源,這些資源只有在用戶購買的時候才會被用到,比如,一個用戶購買SuperGeeky表情包的時候,這個表情資源才會被用到。
5.首次登錄需要加載資源的應(yīng)用:這類應(yīng)用有些資源是只需要初次登錄的時候才加載,并且在重復(fù)登錄的時候用不到。比如一個只有在首次登錄時才加入教學(xué)內(nèi)容的應(yīng)用。
在研發(fā)過程中,開發(fā)者可以為on-demand資源分配一個或者多個標(biāo)簽,也就是你用來辨識特定資源的字符串,你可以通過標(biāo)簽的名字來決定對應(yīng)資源在應(yīng)用中的使用,比如游戲中第五級采用到的資源可以用與level5相關(guān)的標(biāo)簽。
On-Demand資源的循環(huán)周期
帶有標(biāo)簽的資源使用流程大致如下:
帶標(biāo)簽的資源被存儲在App Store里-應(yīng)用通過標(biāo)簽請求使用資源-系統(tǒng)下載資源包-保存資源包-使用完成后系統(tǒng)釋放資源包。
存儲大小限制
App Store對于on-demand資源使用是有存儲空間限制的,具體請參考下表。