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