iOS 9
版本新增了NSBundleResourceRequest
类。这个类是按需加载资源。将资源按使用场景区分为Initial Install Tags
(安装时默认加载)、Prefetched Tag Order
(预获取)、Download Only On Demand
(按需下载)三种。这些资源由App Store
托管。
使用场景(如参考文档):
- 初始资源的延迟加载。app有一些资源是主要功能要用到的,但在启动时并不需要。将这些资源标记为“初始需要”。操作系统在app启动时会自动下载这些资源。例如,图片编辑app有许多不常用的滤镜。
- app资源的延迟加载。app有一些只在特定情景下使用的资源,当应用可能要进入这些场景时,会请求这些资源。例如,在一个有很多关卡的游戏中,用户只需要当前关卡和下一关卡的资源。或者是只有进入某些环节才会使用到的资源。
- 不常用资源的远程存储。app有一些很少使用的资源,当需要这些资源时会去请求它们。例如,当app第一次打开时会展示一个教程,而这个教程之后就可能不会在用到。app在第一次启动时请求教程的资源,这之后只在需要展示教程或者添加了新功能才去请求该资源。zip文件等。
- 应用内购买资源的远程存储。app提供包含额外资源的应用内购买。app会在启动完成后请求已购买模块的资源。例如,用户在一个键盘app内购买了SuperGeeky表情包。应用程序会在启动完成后请求表情包的资源。
- 第一次启动时必需资源的加载。app有一些资源只在第一次启动时需要,之后的启动不再需要。例如,app有一个只在第一次启动时展示的教程。
使用
- 开启按需求加载(在Xcode10中默认开启) a.png
- 设置资源加载方式 b.png
-
代码编写
// 创建资源管理对象
NSBundleResourceRequest *resourceReq = [[NSBundleResourceRequest alloc] initWithTags:[NSSet setWithArray:@[@"Source_Demand"]]];
resourceReq.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent; // 设置下载优先级
// 设置tag保留优先级
[[NSBundle mainBundle] setPreservationPriority:1.0 forTags:[NSSet setWithArray:@[@"Source_Demand"]]];
// 判断资源是否存在
[resourceReq conditionallyBeginAccessingResourcesWithCompletionHandler:^(BOOL resourcesAvailable) {
if (resourcesAvailable) {
// 资源存在 直接使用
return;
}
// 资源不存在请求资源
[resourceReq beginAccessingResourcesWithCompletionHandler:^(NSError * _Nullable error) {
NSLog(@"%@", resourceReq.progress); // 获取下载进度
if (error) {
// 下载失败
NSLog(@"%@", error);
return;
}
// 结束访问
[resourceReq endAccessingResources];
NSLog(@"%@", resourceReq.bundle);
// 正常使用资源
// 此时的bundle路径已变
NSLog(@"%@", [[NSBundle mainBundle] pathForResource:@"address_old" ofType:@"json"]);
}];
}];
- 查看资源状态 c.png
资源状态 | 描述 |
---|---|
In Use | 正在使用 |
Not Downloaded | 未下载 |
Purged | 清除 |
Downloaded | 已下载 |
Downloading | 下载中 |
当处于Downloaded状态时右边会出现Purged按钮。
问题
资源可以标记不同的Prefetched的不同Tags时出现显示错误的情况。实际order
和install
只有8M大小的资源。
根据描述三种状态如下:
Initial install tags
安装时默认加载:
在初始安装tag下载到设备后,app才能启动。这些资源会在下载app时一起下载。这部分资源的大小会包括在App Store
中app的安装包大小。如果这些资源从来没有被NSBundleResourceRequest
对象获取过,就有可能被清理掉。
Prefetch tag order
按顺序预获取tag:
在app安装后会开始下载tag。tag会按照此处指定的顺序来下载。
Dowloaded only on demand
按需下载:
当app请求一个tag,且tag没有缓存时,才会下载该tag。
根据描述Initial install tags
和Prefetch tag order
在启动APP后一段时间内会完成下载。但是在使用开发者账号测试状态中Initial Install Tags
和Prefetch tag order
状态下的资源并没有自动下载,需要执行beginAccessingResourcesWithCompletionHandler:
下载下来。(不知是否是测试原因。或者是理解错误)
iOS 8 版本是否能使用?
iOS 8无法使用,如果想要使用建议还是从iOS 9开始。由于是iOS 9 才有的功能。被标记为Resource Tags
里的资源无法加载。NSBundleResourceRequest
对象为nil。无法执行。但未出现崩溃。
企业级APP是否能使用?
不能。只适用于App Store
级APP。无法下载资源。error错误信息为:请求的应用程序数据不存在。
网友评论