1

当我们的应用程序未运行时,我们遇到了一个关于本地通知触发的非常奇怪的问题。通过不运行,我的意思是它完全终止(当您双击主页按钮时不会出现在任务列表中)。

在正常运行情况下,当应用程序处于后台时,如果设备静止超过 X 秒,应用程序将生成本地通知并发出警告声音。15 秒后,如果未采取任何措施,则会生成另一个本地通知,其中包含紧急消息。

似乎是随机的,在应用程序终止后的几小时或几天内,设备会突然报告警告通知,然后大约 15 秒后发出紧急通知,就像应用程序在后台正常运行一样。如前所述,我们已验证该应用程序未列在正在运行的任务列表中,并且似乎已完全终止。

该应用程序已注册为位置、音频和 VOIP 的长期后台处理模式。

当应用程序终止时(在 applicationWillTerminate 中),我们执行清理,包括关闭和取消计时器、取消本地通知等。

我有两个理论:

  1. 我想知道这些“幽灵”通知是否只是在应用程序运行时排队的旧通知,但直到现在才执行(我的问题是为什么仍然尊重警告和紧急通知之间的时间差)。
  2. 该应用程序是否有可能在深层背景中“秘密”运行。如果是这样,则设备似乎会定期“唤醒”应用程序;如果是这种情况,那么设备使用什么作为此“唤醒呼叫”的标准。

我想知道是否有人遇到过这个奇怪的问题,如果有,我们如何解决这个问题?

PS - 我们对 iOS 开发还很陌生,所以如果我们忽略了一些非常明显的事情,请提前道歉

更新 #1 通过 xCode 使用日志消息,我观察到 applicationWillTerminate 在通过任务栏关闭关闭应用程序时始终被调用。不过,关于这种行为是否可以依赖似乎确实存在很多争论,所以我不会断定地说我是否相信我的观察结果是一致的,但我倾向于这个方向。但是,对此有任何进一步的见解,将不胜感激!

更新 #2 我昨晚尝试了一种新方法;到目前为止,我们一直在使用该[application scheduleLocalNotifications]方法安排一个通知以触发“现在”,并将日期设置为当前时间。相反,我使用了该[application presentLocalNotificationNow]方法,并且没有提供日期/时间。该应用程序仍然可以正常运行,但它并没有解决问题,因为昨晚在应用程序未运行时随机触发了“幽灵”通知。我现在想知道这个问题是否不是与“旧通知”相关的问题,而更多地与由于我们长期后台执行注册的某些触发而导致应用程序“唤醒”有关。

4

1 回答 1

4

一旦您的应用程序安排了 UILocalNotification,它们将由操作系统处理,而不是您的应用程序。因此,即使您的应用程序被杀,它们仍然会关闭。

所以不,您的应用程序还没有在深层背景中秘密运行,这些只是您已经安排好的通知正在关闭。您是否可能在通知上设置重复间隔?

您可以使用以下方法清除所有通知:

 [[UIApplication sharedApplication] cancelAllLocalNotifications];

如 onnoweb 所述,在您的应用程序被杀死之前,您的 applicationWillTerminate 可能没有被调用。我不确定当用户在任务栏中关闭应用程序时是否总是调用它。


编辑以回应评论:

我的第一个想法是您似乎在安排 UILocalNotifications 的开火日期不正确。我建议您检查安排它们的方式。在您的应用程序被杀死后一天它们可能会关闭的唯一方法是,如果您在应用程序仍在运行时安排它们。


编辑以回应进一步的评论:

Teeg - 我认为 applicationWillTerminate 有时可能会在您终止应用程序时被调用,但不能保证会被调用。根据我的阅读,如果您的应用程序处于挂起状态,则不会调用该方法。我不知道具有长时间运行后台任务的应用程序是如何工作的,但也许它会在后台和挂起状态之间切换。我不知道。但问题是,打电话

[[UIApplication sharedApplication] cancelAllLocalNotifications];

将取消您的所有通知。因此,如果在那之后发生了故障,那就是没有调用该方法的证据。我猜另一种可能是调用了该方法,但是该应用程序在被杀死之前没有足够的时间取消所有通知。我不太确定你有多少时间在那里做事。我会再次建议您最好的选择是首先找出为什么要安排这些通知。

于 2012-09-17T20:30:02.077 回答