如何防止我的计时器应用程序被iOS终止

时间:2013-09-10 22:26:30

标签: iphone ios objective-c nstimer multitasking

我有一个计时器应用程序,它会无限期地计算(直到用户停止计时器)。它的工作方式与默认的iOS时钟秒表非常相似。

我已阅读有关成为负责任的后台应用的文章。我没有任何UI更改发生,并在应用程序进入后台时停止计时器并在返回前台时恢复计时器。该应用程序每30分钟左右发送一次本地通知,以提醒用户休息一下。

问题:如果没有失败,我的应用会在几个小时后(2-6小时左右)终止并且当前的计时器和信息丢失。

我尝试过的事情:

- 如上所述,我改变了我的应用程序,以遵循作为一个负责任的后台应用程序的指导(在我计时器UI计数之前以及计时器运行之前,即使在后台运行)。我认为这可以解决问题,因为我的应用程序没有消耗太多内存或执行任何密集任务。

- 我也尝试在ApplicationWillTerminate中保存当前计时器的数据(到NSUserDefaults),然后在DidFinishLaunchingWithOptions上恢复它。它似乎不起作用。这几乎就像我的应用程序是强制退出或其他东西,因为如果调用ApplicationWillTerminate然后它将保存数据并在应用程序再次启动时恢复它。谜。

- 目前我在ApplicationDidEnterBackground上保存NSTimer开始时间的NSDate,使计时器无效,启动计时器并在ApplicationWillEnterForeground上恢复开始时间。仍然没有运气。

问题是这对我的用户只有很小的影响 - 因此对每个人来说都不是一个问题,这让人更加困惑。我当然还想修理它,因为它是一个非常蹩脚的错误 - 我自己也遇到过它(在iPhone 5上),所以它不一定是旧的iPhone低内存等问题。

这真让我感到困惑,我已经完成了我的研究,并且还很好地搜索了堆栈溢出问题,并且似乎找不到任何可以帮助我的东西。

任何帮助将不胜感激,随时提出更多问题或告诉我澄清。

2 个答案:

答案 0 :(得分:2)

当您的应用进入后台时,记录您的计时器的已用时间(例如:在NSUserDefaults中或您喜欢的时间)。还记录当前时间。当应用程序返回到前台时,查看您记录的两个值并相应地更新已用时间,即:

elapsedTime = savedElapsedTime +(currentTime - timeWentIntoBackground)

你的应用程序真的没有理由需要在后台刻录用户电池时保持活动状态,以便跟踪秒数。

另外,不要依赖applicationWillTerminate。使用applicationWillEnterBackground。

答案 1 :(得分:2)

applicationWillTerminate基本上从未被调用过。当您的应用在后台并从内存中删除时,它不会被调用。如果您的应用尚未使用一段时间,则应该会将其从内存中删除。 “一段时间”需要多长时间取决于设备当时正在做什么......最好使用applicationDidEnterBackground:applicationWillResignActive: