美文网首页
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