完美解决LaunchScreen.storyboard启动图更新失效问题

背景

在不久前接到了换壳工程的项目后,为了能够快速部署新的APP,启动图由原来的LaunchImage(Assets)改为LaunchScreen.storyboard故事版方案,只需提供一张图即可快速更新启动图,后者也是苹果官方最为推荐的方式。然而,刚刚接收到新的需求是更新启动图,换图之后不生效,最后重启手机重装APP才生效,但是这种极差的用户体验就别拿出来说事了。

原因

通过谷歌得知,苹果系统对LaunchScreen.storyboard设置的启动图有缓存,因此不能及时更新,至于多久能更新,不知道,也等不起。

谷歌方案

通过谷歌,各路大神各显神通,有说重启Xcode的、清理Xcode缓存的、卸载APP的、重启手机的、有说图片改名字的、有说改为LaunchImage模式的、也有说删除系统缓存的启动图的,甚至贴出了代码:

NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/SplashBoard/Snapshots"];
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];

甚至更加复杂的代码:

float systemVersion = [[UIDevice currentDevice].systemVersion floatValue];
if (systemVersion >= 13.0 && systemVersion < 14.0) {
    NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    NSString *folderPath = [documentsPath stringByAppendingPathComponent:@"Data"];
    NSString *imageCachePath = [folderPath stringByAppendingPathComponent:@"SplashBoard"]; // ~/Documents/Data/SplashBoard
    // 准备
    BOOL isDirectory = YES;
    if (![[NSFileManager defaultManager] fileExistsAtPath:folderPath isDirectory:&isDirectory]) {
        [[NSFileManager defaultManager]  createDirectoryAtPath:folderPath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    NSError *error = nil;
    // 1.获取Images.xcassets中启动图
    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"LaunchScreen" bundle:nil];
    NSAssert(sb != nil, @"未找到 LaunchScreen.storyboard 文件");
    UIViewController *vc = [sb instantiateInitialViewController];
    UIImage *currentImage = nil;
    for (UIView *subview in vc.view.subviews) {
        if ([subview isKindOfClass:[UIImageView class]]) {
            currentImage = ((UIImageView *)subview).image;
            break;
        }
    }
    if (currentImage == nil) {
        NSAssert(currentImage != nil, @"LaunchScreen.storyboard 中缺少 ImageView");
        return;
    }
    NSData *currentData = UIImagePNGRepresentation(currentImage);
    // 2.获取缓存的启动图
    NSData *cachedData = [[NSData alloc] initWithContentsOfFile:imageCachePath];
    if (cachedData && [cachedData isEqualToData:currentData]) {
        return;
    }
    [[NSFileManager defaultManager] removeItemAtPath:[NSHomeDirectory() stringByAppendingString:@"/Library/SplashBoard"] error:nil];
    [currentData writeToFile:imageCachePath atomically:YES];
}

我想说的是,各位大神,您试了,各种场景下,真的都没问题吗?
建议,自测真正有效并且稳定的方案再贴出来,防止更多人迷路。但是,还是要感谢这么多的技术大神,勇于分享自己的实践和理解,值得我们大家学习。

完美方案

废话话不多说,100%成功且稳定的方案:

  1. 新建不同名称的启动页.storyboard,作为启动页,并删除旧的。
  2. 新的启动图片需要重新命名,并且需要放在工程文件夹下(无需根目录),不能放在Assets里面。
这二者缺一不可 !!!

简单步骤

防止部分小伙伴理解偏差,我贴下步骤图:

  1. 假如原来的启动图为:Launch Screen.storyboard


    image.png
  2. 可以新建个故事版叫:NBLaunchScreen.storyboard,然后重新添加ImageView设置约束,添加启动图片,重新设置为启动图。


    image.png
  3. 假设原来的图片名称为launch.png,新的启动图命名为start0.png,并设置为启动图


    image.png

完美,收工,适用于任何场景,启动图立即更新,不掺杂任何杂质。

重要补充

在执行前面的步骤后,若再有新的启动图更换需求,使用上次的启动页.storyboard即可,比如上次已经改为:NBLaunchScreen.storyboard,本次就无须改名了,只需更改图片名称并重新添加到NBLaunchScreen.storyboard就行,同时支持不同旧版本升级替换,也就是说,苹果只会对默认的Launch Screen.storyboard进行故事版的缓存。

知识点+小妙招

  1. 苹果对启动图的缓存应该同时使用了storyboard+图片作为索引。
  2. storyboard比LaunchImage(Assets)优先级高,前者方案可以更改为后者,但是后者不可更改为前者。
  3. storyboard上的图片建议设置Aspect Fit自适应,图片建议用一张1242 × 2688尺寸的(高度最高的),设计图案尽量靠中间并且整个图片透明,storyboard的view层设置背景颜色,这样不同机型包括iPad都能适配。
  4. 预祝正在阅读的你春节快乐。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容