深究iOS启动图问题
在开发中遇见如下问题
- 应用更新后,启动图没有更新
- 启动图渲染失败
- 实现动态更换启动图的需求
问题
- 应用更新后,启动图没有更新
- 启动图渲染失败
- 实现动态更换启动图的需求
定位
首先怀疑是配置方式、编译缓存等导致的问题。针对这些猜测做了以下测试:
- 不同系统、不同机型测试,均有复现,排除该问题只发生在特定机型或系统上;
- 清空编译缓存,仍旧复现,故排除编译缓存问题;
- 给imageView添加背景色,启动时正常显示imageView的背景色,但图片内容未显示,故排除了布局问题;
- 将图片从Assets中迁移至工程根目录下,出现空白启动图概率降低,但仍会偶现;
- 修改图片名,前几次正常,之后依旧偶现;
- 卸载应用重新安装,大概率恢复正常,仍复现;
- 将LaunchScreen.storyboard文件复制到新建的空工程中,仍复现;
结论:系统缓存问题
解决思路
完全抛弃系统缓存的启动图,由自己生成的启动图替换。
用户安装应用后,系统会自动生成启动图并缓存至沙盒目录,接着用户启动应用时,我们通过代码将沙盒目录下缓存的启动图文件全部替换为我们通过代码生成的启动图。
生成启动图
1 | NSString *launchScreenName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UILaunchStoryboardName"]; |
替换启动图
通过测试,该方法不会报权限问题
1 | - (BOOL)moveItemAtPath:(NSString *)srcPath |
流程
1 | graph TD |
缓存路径:
iOS13.0 及以上:
1 | Library/SplashBoard/Snapshots/${PRODUCT_BUNDLE_IDENTIFIER} - {DEFAULT GROUP}; |
iOS13.0 以下:
1 | Library/Caches/Snapshots/${PRODUCT_BUNDLE_IDENTIFIER}; |
图片格式:
iOS10.0 及以上:KTX;
iOS10.0 以下:PNG。
系统缓存图目录读写权限:
iOS10.0 及以上:有权限;
iOS10.0 以下:无权限。