Xcode11 & iOS13 LaunchScreen.storyboard 启动方案

7,966 阅读2分钟

前言

iOS13推出后要求开发者必须在今年4月之前使用LaunchScreen.storyboard启动,不能再使用assert方式启动了,说下在适配过程中遇到的问题及解决方案。

LaunchScreen.storyboard的使用

  1. 创建名为LaunchScreen的storyboard
  2. 在项目target下Launch Screen File 选项中选择刚刚创建的LaunchScreen
  3. 到buildSetting中搜索 “launch image set name” 删除其中的配置
  4. 删除Image.asset中的LaunchImage

此时运行项目就是使用LaunchScreen.storyboard做为启动图了

遇到的问题

1. 单张启动图无法满足各种机型

最先的尝试方案是直接使用一张全屏图片做为启动图,但这种方式根本无法满足多种机型的适配,不同屏幕显示各有差异,无法满足基本视觉要求。

所以改用多个控件组合使用来做为启动图,这种方式能解决一些拉伸变形,logo显示位置等问题,下图是我启动图的约束,你也可以根据你的业务需要,来做启动图约束。

2. 启动图无法实时更换或显示空白页

对于这个问题,要把启动页用到的图片资源放在项目文件目录中,不要放在imageAsset中。

还有一种我自测时候发现的情况,部分带刘海机型就算放在项目文件目录中,还是无法实时更换。

查阅了资料有说每次更换启动图时都要修改图片名,或者删除storyboard,clean项目等,但亲测这些方法无法有效解决该问题,唯一有效的是删除重装app,但显然你不能要求用户这么做。

最后google到了一篇文章, 原来apple会对launchScreen.storyboard 启动的app,部分机型会缓存一份启动图截放在沙盒目录 /Library/SplashBoard 中,每次启动会优先读取缓存,造成启动图无法及时更新。所以决定在app每次启动后有缓存就清除缓存。

清除缓存的调用时机需要自己把握,为了每次都被调用到,我是在app启动后的中间页做的该操作,代码如下:

 // 为了每次都读取最新的启动图,所以要在有缓存的时候清除缓,
 - (void)removeLaunchScreenCacheIfNeeded {
    NSString *filePath = [NSString stringWithFormat:@"%@/Library/SplashBoard", NSHomeDirectory()];
    
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
     NSError *error = nil;
     [[NSFileManager defaultManager] removeItemAtPath:filePath error:&error];

     if (error) {
          NSLog(@"清除LaunchScreen缓存失败");
        } else {
          NSLog(@"清除LaunchScreen缓存成功");
        }
     }
 }

第一次写文章,有笔误的地方还望指出。