需求和应用场景:
应用场景一:初始安装包ipa包的大小,用户在初次下载的时候,只需要下载最小化的安装包,查看app或游戏的基础功能,然后在使用的过程中,再根据需要逐步下载。
应用场景二:在iOS平台上,同一时期会存在性能差异较大的硬件;对于游戏来说,将会根据不同硬件平台的需求,可以生成不同品质的资源,比如在最新发布的手机上使用最高品质的素材,而比较旧的机器上使用品质稍差的资源。来达到自适配。
使用局限性:
只能在iOS9之后的系统上才能使用。目前还是存在比较多,iOS7,8的使用设备。不过根据apple的更新发布节奏,等到再过一年,市面上的机型使用系统将基本上会使iOS9级之后的版本了。
XCode中直接使用:
在Xcode7中,已经有自带该功能,
一、先是开启On Demand Resource
二、给资源打tag
三、提交到app store服务器,将会自动做到根据tag将资源的分发
中文文档中有比较详细的说明:
iOS 按需加载中文文档
http://www.cocoachina.com/ios/20150615/12155.html
在Unity3d 5.2版本之后,引入了按需下载使用的功能。
最初需求来源:
该功能的最初需求来源是Apple TV,因为apple tvOS上的app安装大小最大不能超过200M,要根据使用的情况,要不断下载用到的资源或卸载掉不再使用的资源。
当前该功能在iOS手游上的应用不算常规化。但相信未来一定为成为一个很重要的功能。特别适合游戏的应用场景,随着玩家的不断升级的提升,不断的开始玩新玩法,根据需要就会从app store server下载后期所需资源。对于初次安装的用户来说,不用下载很大的安装包。将可以降低CPI的成本,提升转化率
unity3d 官方有提供一个demo
On Demand Resource
关键的部分的代码如下:
编辑器中功能
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
运行时
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();
}
注意点:
如果是需要app slicing模式的话,在打ab资源的时候,需要设置该选项UncompressedAssetBundle
options |= BuildAssetBundleOptions.UncompressedAssetBundle;