ios11 app启动时闪一下的bug

我司的App开始在iOS11上测试时,iOS11已经出到了bate6。在解决了一些常规的UI兼容问题后,一个诡异的bug引起了我的兴趣。

情况是这样的,在真机上先把App杀掉,然后启动App,App打开,会显示一个中间页而非启动页,然后app会马上被系统关闭,接着又被系统打开,出现正常的启动页面。整个过程行云流水,只有一个Bug干干净净的留给了我。

经过调试,发现中间错误的启动和关闭都没走到代码中,只是看起来像那么回事,至少动画是一样的。

如果诸位已经在iOS11上跑app的话,极小可能已经复现这个Bug了。

我开始觉得这是一个系统级Bug,下一版自然会修复。结果Bate7果断打脸,Bug依旧存在。

随着上线日期的接近,我觉得把希望寄托于Apple显然会引起滑铁卢,毕竟iOS10.2AVPlayer的Bug至今还历历在目。没办法,只好上了。

抱着和“买一疗程试试”同样的觉悟,我开始了调试。结果很讽刺,第一次就猜出了问题的原因。

推理的过程比较有趣(此处脑补柯南经典BGM)。首先它会显示一个中间页,这个中间页差不多是上次被杀掉时的页面。有两种可能:系统在App被杀掉后依旧保存一个页面的截图 或者 App没有被正确的杀掉。前者不符合直观逻辑,那就是后者。而App为什么没有被正确的杀干净?有两种情况:所有的App都杀不掉,我司的App做了什么特殊操作造成杀不掉。试了几个App,没有该问题,那就是后者。那是什么代码导致的呢?Table&Label之类的出问题必然不可能。难道是那些钩子像赫鲁晓夫一样反水了吗?当然不是。那是国内的几个SDK的问题吗?排查它们太麻烦。于是我退一步,按照朴素逻辑,应该是越靠近App被杀时的代码越有可能引起问题。我找到了项目中最接近被杀时的方法applicationWillTerminate:。注掉了里面几个触发I/O的方法。问题居然就解决了。

记住,就是下面这个方法

applicationWillTerminate:

我新建了一个demo,在该方法中sleep了一下,果然Bug就复现了。

由于解决过程完全是黑盒操作,我无法解释问题出现的原因,以及到底在该方法中写什么代码才会出现Bug。

只是希望Apple后续可以解决这个问题 :)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,786评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,262评论 4 61
  • 属性依存策略告诉了我们:“给属性安装一个进度条, ”让一个随着另一个的变化而变化从而达到创新。 可能我们最常...
    合肥李风丽阅读 1,159评论 0 0
  • 色如刮骨钢刀,这话一点都不假,今年我刚刚40多岁,可是已是满头白发,驼背,老眼昏花。读过佛经才知道这是以前邪淫的结...
    conquerIOS阅读 1,668评论 2 1
  • 坟墓篇 1、被窝是青春的坟墓 2、宿舍是大学的坟墓 3、手机是成绩的坟墓 4、游戏是时间的坟墓 5、从众是自己的坟...
    围城之外v阅读 261评论 0 0