美文网首页
iOS9另一种瘦身方案

iOS9另一种瘦身方案

作者: 追着公车的少年_4934 | 来源:发表于2019-03-26 20:51 被阅读0次

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时出现显示错误的情况。实际orderinstall只有8M大小的资源。

d.png

根据描述三种状态如下:
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 tagsPrefetch tag order在启动APP后一段时间内会完成下载。但是在使用开发者账号测试状态中Initial Install TagsPrefetch tag order状态下的资源并没有自动下载,需要执行beginAccessingResourcesWithCompletionHandler:下载下来。(不知是否是测试原因。或者是理解错误)

iOS 8 版本是否能使用?
iOS 8无法使用,如果想要使用建议还是从iOS 9开始。由于是iOS 9 才有的功能。被标记为Resource Tags里的资源无法加载。NSBundleResourceRequest对象为nil。无法执行。但未出现崩溃。

企业级APP是否能使用?
不能。只适用于App Store级APP。无法下载资源。error错误信息为:请求的应用程序数据不存在。

可参考文档
iOS技术文档No.24 Foundation_NSBundleResourceRequest按需加载资源

相关文章

网友评论

      本文标题:iOS9另一种瘦身方案

      本文链接:https://www.haomeiwen.com/subject/bxtovqtx.html