我的iOS应用程序太快被踢出暂停状态。我能';我想不出是什么';它在后台占用CPU

我的iOS应用程序太快被踢出暂停状态。我能';我想不出是什么';它在后台占用CPU,ios,iphone,background-process,cpu-usage,Ios,Iphone,Background Process,Cpu Usage,我需要帮助弄清楚我的应用程序在后台执行了什么代码。如果我在应用程序的Instruments中运行Activity Monitor,即使按下home(主页)按钮,它也会持续使用大约1%的CPU 我猜想,这会导致iOS在我的应用程序的BackgroundTime剩余时间到期后立即将其踢出暂停状态。即使在屏幕上似乎什么都没有发生,应用程序仍然会占用CPU时间,并被踢出暂停状态,即使我只是让手机休眠几分钟 我已经在我的应用程序中对NSTimer进行了项目范围的搜索,以确保在我离开应用程序后没有任何东西被

我需要帮助弄清楚我的应用程序在后台执行了什么代码。如果我在应用程序的Instruments中运行Activity Monitor,即使按下home(主页)按钮,它也会持续使用大约1%的CPU

我猜想,这会导致iOS在我的应用程序的BackgroundTime剩余时间到期后立即将其踢出暂停状态。即使在屏幕上似乎什么都没有发生,应用程序仍然会占用CPU时间,并被踢出暂停状态,即使我只是让手机休眠几分钟

我已经在我的应用程序中对NSTimer进行了项目范围的搜索,以确保在我离开应用程序后没有任何东西被触发,并在应用程序接收网络消息的热门位置设置了断点,但似乎没有任何东西被击中

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

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

编辑1:在Petesh发表评论后,我在Instruments中更多地使用时间分析器,发现我可以设置检查范围,并且只查看在我将应用程序置于暂停状态后运行的代码。我发现了一些不应该运行的代码,并对其进行了修复,但应用程序在几分钟后仍然被踢出暂停状态

活动监视器现在只显示0.1-0%的CPU使用率,而应用程序处于后台状态。再次运行时间分析器显示,我认为唯一运行的是主运行循环。277毫秒,在后台大约一小时。如果我勾选“反向调用树”框,它会显示时间主要花在mach_msg_陷阱中,这一小时总共46毫秒。我不确定这是不是正常的行为

我已经解决了问题的一部分,但最重要的部分仍然存在。是什么阻止我的应用保持挂起状态

编辑2(已修复!):经过深入挖掘,我找到了罪犯。第三方库调用了
beginBackgroundTaskWithExpirationHandler:
,然后在完成时从未调用
endBackgroundTask:
。因此,我相信iOS认为该应用程序仍在尝试执行后台任务,在某个后台时间结束后,它只是终止了该应用程序,尽管它实际上什么都没有做

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

我不确定这是我第一次问这个问题时修复的所有东西的组合还是这个,但不管怎样,都是修复的


编辑3:经过进一步研究,我发现这实际上不是第三方库的错。库正在侦听ApplicationIdentinterBackground通知,以便刷新其队列。但是在我们自己的ApplicationIdentinterBackground中,我们也有一个队列的强制刷新。因此,它试图启动后台任务两次,只完成一次。哎呀

如果你通读了原始问题的所有编辑,你可以看到细节和我解决问题的思考过程,但我写这个答案是为了让人们了解主要要点

要了解后台占用CPU的内容: 只需使用Instruments Time Profiler中的检查窗口即可。我能够准确地专注于我需要的部分。然而,这实际上无助于找出我的应用程序提前终止的原因

要了解我的应用程序被终止的原因: 真正的答案就在我面前。只要有后台处理程序,我就必须一步一步地完成所有代码。对于每个调用
beginBackgroundTaskWithExpirationHandler:
,都需要对
endBackgroundTask:
进行相反的调用


具体来说,在我的案例中仍然有一些悬而未决的问题。我想在Instruments中运行更多的内存分析,以确保即使有多个应用程序运行,我的应用程序也能在暂停状态下保持更长时间。但这可能是一个永无止境的过程,因为你永远不知道阈值在哪里。

你在使用“时间分析器”工具吗?这应该能够让你隔离时间花在哪里。为了查看用户,您可能需要将粒度提高到µs,但它应该让您了解消耗时间的原因。我认为您应该添加一个答案,其中包含尝试过的步骤/学到的经验教训/解决方案,以便新读者可以轻松找到它,Q&A格式在我将iPhone更新到13.5.1之后,我也遇到了同样的问题。Google AdMob方法是唯一在后台运行的方法。现在我的应用程序在后台运行了3.5个小时。我仍然不知道如何解决这个问题。