应用程序被杀死时阻止 UILocalNotification

Posted

技术标签:

【中文标题】应用程序被杀死时阻止 UILocalNotification【英文标题】:Prevent UILocalNotifications when the app is killed 【发布时间】:2015-12-09 11:10:27 【问题描述】:

我开发了 IBeacon 应用程序。当应用程序处于后台模式并且我进入信标区域时,会触发 UILocalNotification。但问题是,如果我终止应用程序,通知仍然会触发。当应用程序在后台时,我使用locationMgr.RequestAlwaysAuthorization (); 来捕捉位置变化。我已经编写了后台安全任务来延长我在 iPhone 上的后台时间。

我曾尝试使用UIApplication.SharedApplication.ApplicationState,但当应用程序仅在后台运行时,它会返回 true,而不是终止。

我使用locationMgr.RequestAlwaysAuthorization ();,因为DidEnterRegion 仅在位置设置为ALWAYS的情况下被调用。

总之,我正在寻找如何仅在后台和活动模式下监控 EnterRegion&ExitRegion 的解决方案。 不是在应用程序被杀死时

【问题讨论】:

【参考方案1】:

ios 7.1 之前,这是 iOS 的默认行为,每个人都抱怨它。从 iOS 7.1 开始,Beacon 监控将启动应用程序,即使它们被杀死。

您需要一种方法来检测应用程序在再次启动时是否已被终止,这样您就可以抑制通知。不幸的是,我不知道有什么方法可以做到这一点。

【讨论】:

【参考方案2】:

应用终止(未运行)的原因有多种:

因为用户主动终止了它(双击主页按钮,向上滑动应用)

因为操作系统需要内存,所以终止了它

因为操作系统更新了应用程序,并终止了它

因为设备重启了,应用还没有启动

您想在所有情况下都避免通知,还是只在第一个情况下避免通知?

如果您想在所有情况下都避免通知,可以尝试在AppDelegateapplicationWillTerminate: 方法(或UIApplicationWillTerminateNotification 通知的观察者)中删除本地通知:

- (void)applicationWillTerminate:(UIApplication *)application

    [application cancelLocalNotification:<insert here the notification you saved>];

(您也可以使用cancelAllLocalNotifications,或使用scheduledLocalNotifications 搜索通知)。

如果您只想在第一种情况下避免这些通知,恐怕我不知道有什么方法可以检测到用户主动终止了应用程序。

【讨论】:

我尝试在 AppDelegate 的 applicationWillTerminate 方法中将静态属性设置为 true,然后在我的方法中检查该属性是否为 true,但它仍然为 false。奇怪但似乎 applicationWillTerminate 不是调用。 用什么方法?什么时候叫?除非你从applicationWillTerminate 调用它,否则它当然永远不会是真的,因为那时应用程序将退出。您需要将其保存到一些持久存储(例如NSUserDefaults、文件、Core Data...)。您可以通过在其中添加日志并检查设备的日志来检查是否调用了applicationWillTerminate。请注意,如果您从 Xcode 中停止该应用程序,该应用程序将立即被终止,并且确实永远不会调用 applicationWillTerminate 请注意,如果 iOS 在您的应用程序未运行时终止,即它处于“暂停”状态,则 调用 applicationWillTerminate。如果它不是处于暂停状态,即在后台运行,iOS 无论如何都不愿意终止它,除非它已经终止了所有暂停的应用程序并且仍然需要更多内存。 长话短说applicationWillTerminate 几乎肯定不能解决您的问题。

以上是关于应用程序被杀死时阻止 UILocalNotification的主要内容,如果未能解决你的问题,请参考以下文章

当节点进程被杀死时杀死所有child_process

Android阻止恢复活动

防止iOS在几分钟后杀死App

每当 App 在 android pie 中被杀死时,服务也会被杀死

当应用被用户杀死时,工作管理器不工作。为啥?

应用程序被杀死时删除钥匙串