苹果强制要求更换启动方式的解决方案

1. 部分机型适配问题

个别流海屏手机,比如
xsmax 12
系统机型,使用
launchScreen.storyboard
 加载启动图,启动图都是正常的,但是到了主页,看见了主页被拉伸,底部的
tabBar
延伸到了下面的底部,到了安全区。而且亲测在某些
xsmax13
系统的机型就是正常的。

具体如下图所示:

xsmax 12系统超过安全区

想了很多,为什么启动图正常,但是主页为什么冲出去安全区了呢?而且
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
系统的手机就被正确认定为流海屏,主页就显示正常了,主页就不冲出安全区了。

具体如下所示:

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然后重启手机,在下载就都正常了,但是这个操作对于用户操作和体验却是致命的,不过还好版本号升级是没有问题的。猜测是苹果的缓存机制影响到的,这个需要苹果来完善了。