iOS9另一种瘦身方案

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按需加载资源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351