苹果强制要求更换启动方式的解决方案
1. 部分机型适配问题
个别流海屏手机,比如
xsmax 12
系统机型,使用
launchScreen.storyboard
加载启动图,启动图都是正常的,但是到了主页,看见了主页被拉伸,底部的
tabBar
延伸到了下面的底部,到了安全区。而且亲测在某些
xsmax13
系统的机型就是正常的。
具体如下图所示:

想了很多,为什么启动图正常,但是主页为什么冲出去安全区了呢?而且
xsmax 13
系统正常,但是只是个别的
xsmax 12
系统就不正常。
查了很多资料也不知道为什么,一开始一直怀疑是启动图做的
launchScreen.storyboard
哪里做的不符合苹果的需求。但是找了很久也没发现哪里不对,况且在别的机型也是正常的。
所以有一种猜想,可能是我们自己的代码出问题了。
然后我就找了我们自定义的
UITabBarController
那里的代码。
发现了一处代码:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if (!Is375x812hScreen()) {
self.tabBar.frame = CGRectMake(0, KScreenHeight - kDSTabBarHeight, CGRectGetWidth(self.tabBar.frame), kDSTabBarHeight);
}
}
#define Is375x812hScreen() (ABS((double)[[UIScreen mainScreen] bounds].size.height - 812.f) < DBL_EPSILON || ABS((double)[[UIScreen mainScreen] bounds].size.width - 812.f) < DBL_EPSILON) //iphoneX
这里,
Is375x812hScreen()
是
17
年
iphoneX
出来的时候加的宏,后来
xsmax
等
896
高的屏幕出来了,进行了更改,改宏就用来定义流海屏了,但是我用真机跑代码的时候,我发现
xsmax 12
系统的手机进入了if判断语句里面,也就是说被认为了不是流海屏,而用同事的手机
xsmax 13
系统手机就不会进入if语句,就可以正确被判定是流海屏。我猜想应该就是启动图加载方式变了,所以导致了流程哪里发生了改变,从而使用个别机型系统宏判断出现了错误。
于是,我就修改了下宏,如下所示:
#define Is375x812hScreen() (ABS((double)[[UIScreen mainScreen] bounds].size.height - 812.f) < DBL_EPSILON || ABS((double)[[UIScreen mainScreen] bounds].size.width - 812.f) < DBL_EPSILON || ABS((double)[[UIScreen mainScreen] bounds].size.height - 896.f) < DBL_EPSILON || ABS((double)[[UIScreen mainScreen] bounds].size.width - 896.f) < DBL_EPSILON)
宏修改成这样,
xsmax 12
系统的手机就被正确认定为流海屏,主页就显示正常了,主页就不冲出安全区了。
具体如下所示:

可以看见下面的安全区留出来了。
同样检查可以看见直播间还有群组页面个别机型也是显示异常了,都需要进行特殊处理和适配,难度不大就是需要心细。
同时,替换后个人中心页面的显示正常没那么拉伸了。


2. 黑屏问题
其实关于黑屏可以分解成下面二个详细的小问题:
- 1) 第一个问题就是和QA模拟版本迭代升级换启动图,发现的问题,就是升级版本号换启动图都正常,但是如果降低版本号,换启动图就是黑屏了。
-
2) 给背景图
UIImageView
设置backgroundColor
保护色,图片加载不出来的时候保护色不出来的问题。
说实话这二个问题,我们开发者可以活动或者解决的余地不是很大了。
先说第一个小问题。
-
1) 也许有人会问,用户都是升级,哪里来的降级呢,确实一般都是升级,但是也存在内测,升级版本,然后从
store
下载版本这种降版本的情况。当然这个是极特殊情况。
这个黑屏问题我真的尝试了不知道多少方法了,但是都不管用:
-
资源从
asset
和根目录来回换 -
用兄弟公司App的启动图尝试
-
图片命名尽量别用
launch
开头 -
清除沙盒里面
splashBoard
还有
cache/snapshot
等目录缓存 -
图片都打开或者关闭
alpha
通道
等等试了很多方法还是黑屏。只要是升高版本再降低版本,更换的启动图就不会生效,屏幕变黑。
但是这个问题真的自己无解了,毕竟我们程序员可以做的很少了,都是工程配置和一个自建立的
storyboard
。
storyboard
里毕竟只是
imageView
的
autolayout
。
所以这个问题暂时就是搁置了,只能暂时保证升级没问题就行。
下面说下第二个问题
-
2) 想着降低版本的话,图片image找不到的话,那就给
imageView
添加个保护色吧,这样不至于黑屏看着难受,可是问题出来了,如果设置了图片,图片没加载出来,
imageView
的
backgroundColor
是不生效的,还是黑色的;但是如果不设置图片名字,run一下就可以看见
imageView
的背景保护色了。
这个问题我们也是无解的,这个像是什么呢?有点像iOS找不到图片默认给了个黑色的
image
,所以后面的
imageView
的背景保护色也是出不来的。
关于这个启动图的更换,想着很简单,但是却碰到了苹果的坑,在
stackOverflow
上搜索,很多老外以前也遇到了这个问题。也是无解。这里其实有个解决办法,就是卸载App然后重启手机,在下载就都正常了,但是这个操作对于用户操作和体验却是致命的,不过还好版本号升级是没有问题的。猜测是苹果的缓存机制影响到的,这个需要苹果来完善了。