LaunchImage和LaunchScreen.xib混用出现的坑

Xcode6和iOS 8以后,苹果给开发者新添加了一种配置启动图的方式LaunchScreen.xib

笔者觉得,这种方式的优势在于无需做多张启动图进行适配,LaunchImage需要美工做多张图,而LaunchScreen.xib可以自适应布局,做一张图就够了。

不过,笔者建议为了更好的适配,免除图片拉伸造成的不好的效果,可以在Images.xcassets,添加一个命为Default的图片集~But,这种方式有个巨大的坑啊~楼主现在还没爬上来~

由于笔者接手的是别人的项目,启动图也没有更换过,一直没有动过这块,也没有太在意。最近由于有更换启动图的需求,开始着手搞启动图这块的内容。原来外包用的是LaunchScreen.xib这种方式,在改这一块的时候,把这两种方式都选了~然后,问题出现了

启动图选择方式

关于启动图黑屏


测试的时候发现,有的时候处出现黑屏的现象,百度了一下,有人说好像是两种方式混用的结果。原来,iOS8以后的系统默认LaunchScreen.xib方式,之前的系统选择LaunchImage方式。然后我们就选择了LaunchImage这种更加稳定可靠的方式。启动图黑屏的问题果然不存在了

安装过旧版本的App启动图无法更换


由于笔者的手机频繁的删除应用,没有发现这个问题。产品经理在安装测试版的App后出现启动图没有更换的问题~删了应用重装也不行
So,问题来了~What happend?

笔者开始了漫长的测试~~~

  • 先用 LaunchScreen.xib方式添加启动图A,运行工程,App启动图为A,然后更换启动图为B
    • 启动图添加方式更换为LaunchImage方式,运行工程,App启动图为A
    • 启动图添加方式更换为LaunchImage方式,删掉App,运行工程,App启动图为B
    • 启动图添加方式不更换,运行工程,App启动图为A
    • 启动图添加方式不更换,删掉App,运行工程,APP启动图为A
    • 启动图添加方式不更换,重启手机,运行工程,APP启动图为A
    • 启动图添加方式不更换,删掉App,重启手机,运行工程,APP启动图为B
  • 先用 LaunchImage方式添加启动图A,运行工程,App启动图为A,然后更换启动图为B
    • 启动图添加方式不更换,运行工程,App启动图为B
    • 启动图添加方式更换为 LaunchScreen.xib,运行工程,App启动图为B
  • LaunchImage与LaunchScreen.xib混用没有测试,因为在iOS8系统以后,默认使用LaunchScreen.xib,效果和第一种是一样的,感兴趣的读者可以测试一下

为什么用 LaunchScreen.xib方式添加启动图会出现上面的效果?笔者做了一些小小的测试


开始笔者觉得,可能是使用xib方式,系统会在App沙盒保存一份启动图,就下载一个软件iFunBox

安装好,点击应用

屏幕快照 2016-03-17 下午5.43.43.png

这里我们可以看到,平时我们在程序里操作的几个文件夹
屏幕快照 2016-03-17 下午5.44.02.png

点击Library
屏幕快照 2016-03-17 下午5.44.13.png

点击Caches
屏幕快照 2016-03-17 下午5.44.23.png

点击Snapshots,
屏幕快照 2016-03-17 下午5.44.35.png

果然找到了启动图
屏幕快照 2016-03-17 下午5.44.49.png

而LaunchImage模式,不会生成这张图片

笔者原本以为,这张图就是App每次启动时要拿的图。在LaunchScreen.xib模式下,就删掉了这张图,重新运行工程。然而,笔者期待的景象并未发生,即便更换成启动图B,App的启动图仍然为A,同时在这个文件夹下,启动图A又出现了。so,这张图并不是App启动时调用的。其实,出现启动图添加方式不更换,删掉App,运行工程,APP启动图为A这种结果时,就证明笔者的思路是错的,因为此时这个文件夹已经不存在了,说明App启动后启动图在App沙盒之外进行了保存,即保存在了iOS系统本身的某些缓存文件下。

启动图添加方式不更换,删掉App,重启手机,运行工程,APP启动图为B,则证明,iOS系统缓存的这些文件,只有重启手机才能删掉,不重启的话,这些信息在App重新安装的时候,依然可用,具体保存在哪,笔者真心没找到~

所以,LaunchScreen.xib这种添加启动图的方式,建议读者不要使用,不如读者如果解决这种问题~建议通知笔者~跪谢

总结:在LaunchScreen.xib模式下,Snapshots文件夹下的这张图片每次在App启动的时候都会更新。因为这张图片是系统对启动图进行截屏得到的,但是App启动时调用的那张图片是在App首次使用LaunchScreen.xib模式时用的那张图片,系统对这张图片进行了保存,只要这张图片存在,无论采用什么模式,都会调用这张图片。而能够删除这张图片的唯一方式,就是删掉程序,重启手机。


2016-03-20更新


问题解决了:笔者将LaunchScreen.xib更换成了LaunchScreen.storyboard就能进行更换了。而且LaunchScreen.storyboard创建的启动图是可以随时更换的。可能是因为Xcode7以后,苹果主推LaunchScreen.storyboard而取代了LaunchScreen.xib。最重要的是,一定要记得更换图片的名字,千万不要使用一样的名字根,否则还是更换不了。我原来使用的都是Default.png,更换了就好了。

iOS开发时如何使用 Launch Screen Storyboard