2

我有一个计时器应用程序,它会无限期地计数(直到用户停止计时器)。它的工作原理很像默认的 iOS 时钟秒表。

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

问题:毫无疑问,我的应用程序会在几个小时后(大约 2-6 小时)终止,并且当前的计时器和信息会丢失。

我尝试过的事情:

- 如前所述,我更改了我的应用程序以遵循成为负责任的后台应用程序的准则(在我让计时器 UI 计数并且计时器运行之前,即使在后台也是如此)。我认为这可以解决问题,因为我的应用程序没有占用太多内存或执行任何密集任务。

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

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

问题是这影响了我的一小部分用户——所以这对每个人来说都不是问题,这使得它更加混乱。当然,我仍然想修复它,因为它是一个非常蹩脚的错误——而且我自己也遇到过(在 iPhone 5 上),所以它不一定是旧的 iPhone 内存不足或其他问题。

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

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

4

2 回答 2

2

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

elapsedTime = savedElapsedTime + (currentTime - timeWentIntoBackground)

确实没有理由您的应用需要在后台保持活动状态,从而消耗用户的电池来跟踪秒数。

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

于 2013-09-10T22:31:21.167 回答
2

applicationWillTerminate基本上从不调用。当您的应用程序在后台并从内存中删除时,它不会被调用。如果您的应用有一段时间没有使用,您应该期望它会从内存中删除。“一段时间”的时间长短取决于设备当时正在做什么......最好使用applicationDidEnterBackground:applicationWillResignActive:

于 2013-09-10T22:32:17.993 回答