我司的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后续可以解决这个问题 :)