您的位置:首页 > 其它

项目中一个Bug的解决过程

2017-10-09 18:00 246 查看
A 和 B 是两个不相关的页面,在B页面做FaceBook直播:

step1: 直播过程中,页面B,app退到后台,app到后台的那一刻会显示页面C,倒计时30s

step2: 从后台到前台,页面C仍然在倒计时(30s内)

step3: 暂停直播,去到页面A,此时页面B已经执行deinit

step4: 在页面A中,进行OTA升级

step5: 升级过程中,App退到后台(理论上这里iOS会截一张当前界面图D,下面会讲原因)

step6: 从后台再到前台,出现了bug,手机app界面显示的是页面C,而不是界面图D?

这就很奇怪了,为什么会显示界面D呢。搞的好像我们页面没释放一样,但是,我们的deinit确实执行了?

先说明下,我们的页面确实释放了,这个问题出现的原因也已经找到,先说下app从前台到后台时,iOS takes a screen shot of your application before throwing it into the background.在App到前台的时候,再显示那张图片。

那么为什么我在升级页面显示的是不对的呢?

这个真的是好坑啊,在升级页面A当收到UIApplicationWillResignActive这个通知时,调用了一个封装好的API,在这里面sleep了三秒钟,那么当我在三秒钟内,由后台回到前台(这里是点击App icon到前台,而不是双按home键,然后选择App页面这种操作到前台),iOS系统还没有截图成功呢,那样就会显示系统的Sandbox的Library\Caches\Snapshots\xxxx..中已经存在的之前的截图C!

为了解这个bug,请问您有几种思路?

method 1. 我尝试删除这里面的已经存在的这张截图,但是,这是不行的,这里的东西是无法删除的,所以不要白费功夫了。

method 2. 既然那个方法阻碍了我的截图,那我可以不可以先截图完了,在执行这个方法呢,当然是可以的,API你又不能改,只能自己这边改动了。所以,我就在这里把API的方法延时了一下,至于为什么是0.3,这个是经验值,测试了不同的手机和系统版本后得出的:

DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {



}

这样,这个bug就结了。

给两个个链接看下:

https://stackoverflow.com/questions/7520076/prevent-ios-from-taking-screen-capture-of-app-before-going-into-background

https://stackoverflow.com/questions/20928106/ios-app-launch-image-after-a-kill
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: