iOS iOS 13 上的应用 运行 每次用户进入后台至少 30 秒时都会重置
iOS App running on iOS 13 is resetting each time the user goes into background for at least 30sec
这不是一个真正的问题,但我想把它写在这里,以便遇到问题的其他人可以找到解决方案。
自 iOS 13
发布以来,我们的一些用户联系我们,告诉我们每次他们进入后台一段时间(大约 30 秒)时我们的应用程序都会重置。
当然,绝对没有行为的线索,Crashlytics
等等。我们能够在 QA 设备上重现,但无法在调试器附加设备上重现。
很明显,我们使用了 Console
来监控正在发生的事情,我们注意到大约在 20 分钟后发送了一条奇怪的消息。我们的应用进入后台 25 秒后:
default 10:14:01.658579+0100 XXX RunningBoardServices Received process assertions expiration warning!
default 10:14:01.659214+0100 XXX RunningBoardServices Notifying client of imminent expiration of assertion
default 10:14:01.659568+0100 XXX RunningBoardServices Expiration notification complete
如果您足够快重新启动应用程序,一切正常,但如果您让应用程序再保持 5 秒(大约)处于非活动状态,然后重新启动它,那么该应用程序正在重置 (appDidFinishLaunching
...)。
...
...
我们越挖越深,什么也没找到...直到我们决定通过 Cocoapods
更新我们的一些外部库,你猜怎么着?我们找到了我们的罪魁祸首:Firebase
套件中的 GoogleDataTransport
!
我们使用的是 1.1.3
版本并更新到 3.0.1
解决了这个问题。我猜他们在后台做一些 "bad" 事情...
就是这样,伙计们。希望对其他人有所帮助!
干杯。
编辑:
从此页面(Firebase
发行说明)https://firebase.google.com/support/release-notes/ios#6.11.0,您可以阅读:
Fixed race condition that prevented upload from completing while app was in the background.
Version 6.10.0 - October 8, 2019
据我了解,也许 Firebase
没有通知 iOS 他们在后台执行的上传已完成。它可以解释为什么 iOS 13 在这种情况下会杀死一个应用程序。
♂️
编辑 2:
Apple 显然发布了一个 iOS 更新 (13.2.2
),它应该解决这些背景问题:https://twitter.com/engadget/status/1192512171252551682?s=12.
Fixes an issue that could cause apps to quit unexpectedly when running in the background
我们使用不包含我们之前修复的旧应用程序对其进行了测试,不幸的是问题仍然存在...
崩溃是由于后台任务泄漏造成的。在我的应用程序中,一些 SDK 没有正确使用后台任务。因为被看门狗杀死了,所以不会出现调试,调试时可以打印beginBackgroundTask和endBackgroundTask。如果不匹配,就会发生泄漏。
我写了一个类来hook后台任务相关的方法,避免泄露被看门狗杀死:https://github.com/ruanjx/MPIBackgroundTaskProtection
后台任务详情:https://medium.com/swlh/handling-background-tasks-in-ios-13-67f717d94b3d
这不是一个真正的问题,但我想把它写在这里,以便遇到问题的其他人可以找到解决方案。
自 iOS 13
发布以来,我们的一些用户联系我们,告诉我们每次他们进入后台一段时间(大约 30 秒)时我们的应用程序都会重置。
当然,绝对没有行为的线索,Crashlytics
等等。我们能够在 QA 设备上重现,但无法在调试器附加设备上重现。
很明显,我们使用了 Console
来监控正在发生的事情,我们注意到大约在 20 分钟后发送了一条奇怪的消息。我们的应用进入后台 25 秒后:
default 10:14:01.658579+0100 XXX RunningBoardServices Received process assertions expiration warning!
default 10:14:01.659214+0100 XXX RunningBoardServices Notifying client of imminent expiration of assertion
default 10:14:01.659568+0100 XXX RunningBoardServices Expiration notification complete
如果您足够快重新启动应用程序,一切正常,但如果您让应用程序再保持 5 秒(大约)处于非活动状态,然后重新启动它,那么该应用程序正在重置 (appDidFinishLaunching
...)。
...
...
我们越挖越深,什么也没找到...直到我们决定通过 Cocoapods
更新我们的一些外部库,你猜怎么着?我们找到了我们的罪魁祸首:Firebase
套件中的 GoogleDataTransport
!
我们使用的是 1.1.3
版本并更新到 3.0.1
解决了这个问题。我猜他们在后台做一些 "bad" 事情...
就是这样,伙计们。希望对其他人有所帮助!
干杯。
编辑:
从此页面(Firebase
发行说明)https://firebase.google.com/support/release-notes/ios#6.11.0,您可以阅读:
Fixed race condition that prevented upload from completing while app was in the background. Version 6.10.0 - October 8, 2019
据我了解,也许 Firebase
没有通知 iOS 他们在后台执行的上传已完成。它可以解释为什么 iOS 13 在这种情况下会杀死一个应用程序。
♂️
编辑 2:
Apple 显然发布了一个 iOS 更新 (13.2.2
),它应该解决这些背景问题:https://twitter.com/engadget/status/1192512171252551682?s=12.
Fixes an issue that could cause apps to quit unexpectedly when running in the background
我们使用不包含我们之前修复的旧应用程序对其进行了测试,不幸的是问题仍然存在...
崩溃是由于后台任务泄漏造成的。在我的应用程序中,一些 SDK 没有正确使用后台任务。因为被看门狗杀死了,所以不会出现调试,调试时可以打印beginBackgroundTask和endBackgroundTask。如果不匹配,就会发生泄漏。
我写了一个类来hook后台任务相关的方法,避免泄露被看门狗杀死:https://github.com/ruanjx/MPIBackgroundTaskProtection
后台任务详情:https://medium.com/swlh/handling-background-tasks-in-ios-13-67f717d94b3d