iOS9另一种瘦身方案

2019-03-26  本文已影响0人  追着公车的少年_4934

iOS 9版本新增了NSBundleResourceRequest类。这个类是按需加载资源。将资源按使用场景区分为Initial Install Tags(安装时默认加载)、Prefetched Tag Order(预获取)、Download Only On Demand(按需下载)三种。这些资源由App Store托管。

使用场景(如参考文档):

使用

// 创建资源管理对象
    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"]);
        }];
    }];
资源状态 描述
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按需加载资源

上一篇下一篇

猜你喜欢

热点阅读