iOS LaunchScreen 适配与缓存踩坑

由于之前WWDC2019上,针对 iOS13 UI 更新方面的会议上,提到了三个开发者不得不重视的问题,均规定 2020 年 4 月前需全部适配。

烦人的Launch Screen 适配

由于之前WWDC2019上,针对 iOS13 UI 更新方面的会议上,提到了三个开发者不得不重视的问题,均规定 2020 年 4 月前需全部适配。(网图侵删除)

由于之前用的是 Launch Image , 替换新的启动图的时候都需要设计适配好多机型,增大了设计的工作量 && 替换的工作量,而且苹果越出越多不同尺寸的设备(渐渐Android化??) , 所以其实还是挺支持苹果这次的决定的.

工程基本不用 xib , storyboard ,这个适配就让我比较抓狂了.

首先承认我是拖线的小白, UI全代码撸(虽然麻烦但是心里踏实啊).

这次的启动图,是需要适配所有苹果机型,包括 iPhone , iPad 的横竖屏,而且我们原来的 Launch Image 还能根据不同设备大小,由设计同学随心所欲来(觉得好看)来微调一下,这次统一来做一套的确是有难度!

由于私隐问题我还是将这次我们的启动图sb换个素材来呈现下说下问题吧

以上是我们项目启动图,随便替换了一下项目中素材哦

设计同学要求:

  1. 这个 ICON 不同机型等比放大
  2. 不同机型ICON位置最好就在这个位置
  3. 底部2个素材(本来是2个文字图片素材) 也是等比放大
  4. 底部2个素材距离底部大概这个位置

简简单单一说就很难了….

首先看上面的 ICON , 上边距又不能以顶部做基准来按比例做, 批评一下xib,怎么不能弄顶部相对屏幕高度的比例呢?所以这次我只能偷偷在屏幕中心新建了一个透明的 UIView 作为中心,然后再新建一个 UIView做高度基于屏幕高度的百分之几,然后这个 ICON 只能底部紧挨着这个隐形的 View 做布局.为了做一个简单的ICON定位,就要做这么多额外东西.底部2个素材也是如此炮制,竖屏终于弄完了….

还以为解脱时候,一看iPad横屏就傻眼了

由于这个ICON的宽度是基于屏幕宽的比例,来定宽度,然后宽高成比例等比放大的,屏幕一横,由于 IPad 横屏宽度飚了几个档次,这样就会导致ICON出现严重的放大爆出了屏幕

(由于项目已经调整过,没有当时的图了,大家脑补一下画面)

而且ICON宽度也不能基于屏幕高度来定制啊..所以此时陷入了困境,这时候说出一句

“SB苹果!”

想到了 SizeClass , 好吧试一下看看行不行

Size Classes 是 Apple 在 iOS 8 推出的一个新特性,用于适配不同的设备屏幕的UI界面

在 Size Classes 中,设备的宽高可以被区分为 Compact 和 Regular,若是不区分设备则是 Any 。

实际操作中,SizeClass 还是不能满足需求,本来想着IPad横屏就那个尺寸,怎么发现改完之后 iPhone 有不满意了(4s,5s这些小屏幕机),而且设计同学并没有一个定性标准来确定..只是说哦这个机型好像有点小了这里,调大一点,调大一点之后,由于xib根据比例变化,另外机子上又太大了…

最后一番讨价还价还是确定了样式上线了(设计同学应该内心各种草泥马了吧…)

[上线后我发现用 xib 远古方法还是比较好调整所有机型尺寸…(AutoResize),等下个版本验证下吧]

烦人的Launch Screen Cache(Xcode 11)

还以为脱坑了…测试时候发现这次改完的新启动图 Launch Screen.storyboard 打包之后给测试同学升级安装 , 启动图还是旧的. Google 了一下网上也有人遇到类似情况,说只需要把 App卸载之后重新开机再装就好了…我特么???还有这种操作?

一开始我还以为只是测试包有这个问题,上线Appstore应该苹果会弄好吧..越接近发包时间越心虚,各种搜索网上方法.

如:

  1. 替换 .xcasset 里面素材名字
  2. 将素材放到bundle里面
  3. 删掉改名 Launch Screen.stroyboard

相信我,上面各种操作试过也是一样,此时心里没底了..是不是Appstore后才正常…在怀着最后一丝希望时候找到一行代码

1
2
3
4
5
NSError *error;
[NSFileManager.defaultManager removeItemAtPath:[NSString stringWithFormat:@"%@/Library/SplashBoard",NSHomeDirectory()] error:&error];
if (error) {
NSLog(@"Failed to delete launch screen cache: %@",error);
}

删除缓存操作.看了下路径在 NSHomeDirectory下,我想这路径下没这个东西啊…然后抱着怀疑心态插上手机试下,走到 error 时候的确是说没有这个文件…以为这个方法是不行的

此时已经崩溃,说出一句

“SB苹果!”

心怀希望觉得应该是Appstore上线后会好的..然而上线之后…

Surprise Mother F***er!!

启动图只要是旧版本升级上来也是没变….此时怀着曹尼玛心情过年

直到今天才发现上面那句代码是有用的…..

因为最近发个小包,启动图问题还是有,试过所有方法且做了无限搜索,发现最近更新的信息中,好像都是指向那句代码,让我只能重新一试

finishLaunch 中添加这句代码,联机Debug依然是说没有..

好吧打个包试下?

然而

Surprise Mother F***er!!

在升级后第一次启动还是原图后,第二次竟然是刷新了…

此时说出一句

“SB苹果!”

“SB苹果!”

“SB苹果!”

别问为什么联机调试找不到文件删除 && 没效果,别问,问就是玄学!!!!

好了有了以上 LaunchSreen的踩坑经历,总结下来就是这句代码牛逼!

1
2
3
4
5
NSError *error;
[NSFileManager.defaultManager removeItemAtPath:[NSString stringWithFormat:@"%@/Library/SplashBoard",NSHomeDirectory()] error:&error];
if (error) {
NSLog(@"Failed to delete launch screen cache: %@",error);
}

导致这个缓存的问题,是苹果官方的Bug,系统默认加载启动图的缓存,所以即使你怎么调整素材,名字还是会遇到这个问题的,希望上面这段代码拯救到你的崩溃

iOS LaunchScreen 适配与缓存踩坑

https://swlfigo.github.io/posts/2261601169/

Author

Sylar

Posted on

2020-02-05

Updated on

2021-11-14

Licensed under

Comments