我的iOS应用程序太快被踢出暂停状态.我无法弄清楚在后台占用CPU的是什么

ter*_*dyl 5 iphone cpu-usage background-process ios

我需要帮助找出在我的应用程序中后台执行的代码.如果我在我的应用程序中运行仪器中的活动监视器,即使按下主页按钮后它也会始终使用大约1%的CPU.

这是,我假设,一旦它的backgroundTimeRemaining已经过期,就会导致iOS将我的应用程序从暂停状态踢出.即使在显然没有发生任何事情的屏幕上,即使我只是让手机睡了几分钟,应用程序仍会使用CPU时间并被踢出暂停状态.

我已经在我的应用程序中完成了对NSTimers的项目范围搜索,以确保在我离开应用程序后没有任何内容被解雇,并且在应用程序接收网络消息的热门地点放置断点,但似乎没有被击中

我已经确认当它没有连接到调试器时仍然会发生这种情况,当我按下主页按钮时,其他应用程序似乎变为0或更接近0 CPU利用率.

什么工具可以帮助我实现目标并找出后台运行的代码?

编辑1:在Petesh的评论之后,我更多地使用了仪器中的Time Profiler,并发现我可以设置检测范围,并在我将应用程序置于挂起状态后仅查看代码运行.我找到了一些不应该运行的代码,我修复了它,但是应用程序在几分钟后仍然被踢出暂停状态!

活动监视器现在只显示0.1-0%的CPU使用率,而应用程序是后台运行的.再次运行Time Profiler会发现,我认为唯一运行的是主运行循环.在后台约一个小时的时间277毫秒.如果我检查"反转调用树"框,则显示时间主要花费在mach_msg_trap上,总时间为46毫秒.我不确定这是否是正常行为.

我已经解决了我的一些问题,但最重要的部分仍然存在.什么阻止我的应用程序停留在暂停状态?

编辑2(固定!):经过深入挖掘后,我找到了罪魁祸首.第三方库正在调用beginBackgroundTaskWithExpirationHandler:,然后endBackgroundTask:在完成时从不调用.因此,我相信iOS认为该应用程序仍在尝试执行后台任务,并且在某个后台时间结束后,即使它没有真正做任何事情,它也终止了应用程序.

仪器中的活动监视器现在在初始后台代码运行后的整个时间内确实显示0%.

自从我第一次提出这个问题以来,我不确定是不是这个或者是我修复的所有东西的组合,但无论哪种方式,它都是固定的!

编辑3:经过更多研究后我发现它实际上不是第三方库的错.该库正在侦听applicationDidEnterBackground通知,因此它可以刷新它的队列.但是在我们自己的applicationDidEnterBackground中,我们还有一个强制刷新队列.因此,它尝试两次启动后台任务,只完成一次.哎呀!

ter*_*dyl 2

如果您通读原始问题的所有编辑,您可以看到详细信息和我解决问题的思维过程,但我写这个答案是为了让人们得到主要的收获。

要找出后台占用 CPU 的原因: 只需使用 Instruments Time Profiler 中的检查窗口即可。我能够准确地归零我需要的部分。然而,这实际上并没有帮助弄清楚为什么我的应用程序被提前终止。

要找出我的应用程序被终止的原因: 真正的答案就在我面前。我只需要在有后台处理程序的地方单步执行所有代码。对于每个对 的调用,beginBackgroundTaskWithExpirationHandler:都需要有一个相反的对 的调用endBackgroundTask:

具体到我的案例,仍然存在一些未解决的问题。我想在 Instruments 中运行更多内存分析,以确保我的应用程序可以在多个应用程序运行时保持更长时间的挂起状态。但这可能是一个永无止境的过程,因为你永远不知道确切的阈值在哪里。