需求和應(yīng)用場(chǎng)景:
應(yīng)用場(chǎng)景一:初始安裝包ipa包的大小缀匕,用戶在初次下載的時(shí)候纳决,只需要下載最小化的安裝包,查看app或游戲的基礎(chǔ)功能乡小,然后在使用的過(guò)程中阔加,再根據(jù)需要逐步下載。
應(yīng)用場(chǎng)景二:在iOS平臺(tái)上满钟,同一時(shí)期會(huì)存在性能差異較大的硬件胜榔;對(duì)于游戲來(lái)說(shuō)胳喷,將會(huì)根據(jù)不同硬件平臺(tái)的需求,可以生成不同品質(zhì)的資源夭织,比如在最新發(fā)布的手機(jī)上使用最高品質(zhì)的素材吭露,而比較舊的機(jī)器上使用品質(zhì)稍差的資源。來(lái)達(dá)到自適配尊惰。
使用局限性:
只能在iOS9之后的系統(tǒng)上才能使用讲竿。目前還是存在比較多,iOS7弄屡,8的使用設(shè)備题禀。不過(guò)根據(jù)apple的更新發(fā)布節(jié)奏,等到再過(guò)一年膀捷,市面上的機(jī)型使用系統(tǒng)將基本上會(huì)使iOS9級(jí)之后的版本了迈嘹。
XCode中直接使用:
在Xcode7中,已經(jīng)有自帶該功能全庸,
一秀仲、先是開啟On Demand Resource
二、給資源打tag
三糕篇、提交到app store服務(wù)器啄育,將會(huì)自動(dòng)做到根據(jù)tag將資源的分發(fā)
中文文檔中有比較詳細(xì)的說(shuō)明:
iOS 按需加載中文文檔
http://www.cocoachina.com/ios/20150615/12155.html
在Unity3d 5.2版本之后,引入了按需下載使用的功能拌消。
最初需求來(lái)源:
該功能的最初需求來(lái)源是Apple TV挑豌,因?yàn)閍pple tvOS上的app安裝大小最大不能超過(guò)200M,要根據(jù)使用的情況墩崩,要不斷下載用到的資源或卸載掉不再使用的資源氓英。
當(dāng)前該功能在iOS手游上的應(yīng)用不算常規(guī)化。但相信未來(lái)一定為成為一個(gè)很重要的功能鹦筹。特別適合游戲的應(yīng)用場(chǎng)景铝阐,隨著玩家的不斷升級(jí)的提升,不斷的開始玩新玩法铐拐,根據(jù)需要就會(huì)從app store server下載后期所需資源徘键。對(duì)于初次安裝的用戶來(lái)說(shuō),不用下載很大的安裝包遍蟋。將可以降低CPI的成本吹害,提升轉(zhuǎn)化率
unity3d 官方有提供一個(gè)demo
On Demand Resource
關(guān)鍵的部分的代碼如下:
編輯器中功能
usingUnityEditor.iOS;
#if ENABLE_IOS_ON_DEMAND_RESOURCES
publicclassBuildResources
{
[InitializeOnLoadMethod]
staticvoidSetupResourcesBuild()
{
UnityEditor.iOS.BuildPipeline.collectResources+=CollectResources;
}
staticUnityEditor.iOS.Resource[]CollectResources()
{
returnnewResource[]
{
newResource("iOS","AssetBundles/iOS/iOS").AddOnDemandResourceTags("iOS"),
newResource("cube.unity3d","AssetBundles/iOS/cube.unity3d").AddOnDemandResourceTags("cube.unity3d"),
newResource("resource","path/to/resource.file").AddOnDemandResourceTags("resource_tag"),
};
}
}
#endif
運(yùn)行時(shí)
usingUnityEngine.iOS;
// Coroutine that can be asynchronously executed with
StartCoroutine(LoadAsset("asset.data"));
publicstaticIEnumerator LoadAsset(stringresourceName)
{
// Create the request
varrequest=OnDemandResources.PreloadAsync(newstring[]{"resource_tag"
});
// Wait until request is completed
yieldreturnrequest;
// Check for errors
if(request.error!=null)
thrownewException("ODR request failed: "+request.error);
// Get path to the resource and use it. Note that at the moment the only API
// that can load ODR or sliced resources is AssetBundle.CreateFromFile()
varpath="res://"+resourceName;
varbundle=AssetBundle.CreateFromFile(path);
// Call Dispose() when resource is no longer needed. This will release a
pin on ODR resource.
request.Dispose();
}
注意點(diǎn):
如果是需要app slicing模式的話凉夯,在打ab資源的時(shí)候运悲,需要設(shè)置該選項(xiàng)UncompressedAssetBundle
options |= BuildAssetBundleOptions.UncompressedAssetBundle;