在我们的应用未运行时,我们遇到了一个非常奇怪的问题。通过不运行,我的意思是它完全终止(当您双击主页按钮时,不会出现在任务列表中。)
在正常运行条件下,当应用程序背景化时,如果设备静止超过X秒,应用程序将生成一个警告声音的本地通知。 15秒后,如果未采取任何措施,则会生成另一个带有紧急消息的本地通知。
在应用程序终止后的几个小时或几天内,设备会突然显示警告通知,大约15秒后紧急通知,就像应用程序在后台正常运行一样。如上所述,我们已经验证该应用程序未列在正在运行的任务列表中,并且似乎已完全终止。
该应用已注册为位置,音频和VOIP的长期后台处理模式。
当应用终止时(在applicationWillTerminate中),我们执行清理,包括关闭和取消定时器,取消本地通知等。
我有两个理论:
我想知道是否有人遇到过这个奇怪的问题,若然,我们如何解决这个问题?
P.S - 我们对iOS开发还很陌生,如果我们忽略了一些完全明显的东西,请提前道歉更新#1 通过xCode使用日志消息,我发现当应用程序通过任务栏关闭关闭时,将始终调用applicationWillTerminate。关于这种行为是否可以依赖似乎存在很多争论,所以我不会最终确定我是否相信我的观察是一致的,但我倾向于那个方向。然而,对此的任何进一步见解将不胜感激!
更新#2
我昨晚尝试了一种新方法;到目前为止,我们通过使用 [application scheduleLocalNotifications]
方法并将日期设置为当前时间来安排“现在”触发通知。相反,我使用了 [application presentLocalNotificationNow]
方法,并且没有提供日期/时间。该应用程序仍然正常运行,但它没有解决问题,因为昨晚在应用程序未运行时随机触发了“幽灵”通知。我现在想知道这个问题是不是一个“旧通知”相关的问题,更多的是因为我们的长期背景执行注册导致某些触发器被“唤醒”。
答案 0 :(得分:4)
一旦您的应用安排了UILocalNotification,它们将由操作系统处理,而不是您的应用。因此,即使您的应用程序被杀,它们仍然会消失。
所以不,你的应用程序还没有在深层背景下秘密运行,这些只是你已经安排的通知。您是否可以在通知上设置repeatInterval?
您可以使用以下方式清除所有通知:
[[UIApplication sharedApplication] cancelAllLocalNotifications];
你的applicationWillTerminate可能会在应用程序被杀之前被调用,如onnoweb所述。我不确定当用户在任务栏中关闭应用程序时是否总是会调用它。
编辑回复评论:
我的第一个想法是,您似乎正在安排UILocalNotifications使用不正确的开火日期。我建议你检查一下你安排他们的方式。在您的应用程序被杀之后的一天,他们可能会离开的唯一方法是,如果您在应用程序仍在运行时安排它们。
编辑回应进一步评论:
Teeg - 我认为有可能在你杀死应用程序时调用applicationWillTerminate,但不能保证被调用。根据我的阅读,如果您的应用处于暂停状态,则不会调用该方法。我不确切知道具有长时间运行后台任务的应用程序是如何工作的,但它可能在后台和挂起状态之间切换。我不确定。但问题是,打电话
[[UIApplication sharedApplication] cancelAllLocalNotifications];
将取消所有通知。因此,如果之后发生了变化,那就证明该方法没有被调用。我想另一种可能是该方法被调用,但应用程序没有足够的时间在被杀之前取消所有通知。我不太确定你在那里做多少时间。我会再次建议你最好的办法是找出为什么这些通知是在第一时间安排的。