应用程序被杀死时阻止 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】:应用终止(未运行)的原因有多种:
因为用户主动终止了它(双击主页按钮,向上滑动应用)
因为操作系统需要内存,所以终止了它
因为操作系统更新了应用程序,并终止了它
因为设备重启了,应用还没有启动
您想在所有情况下都避免通知,还是只在第一个情况下避免通知?
如果您想在所有情况下都避免通知,可以尝试在AppDelegate
的applicationWillTerminate:
方法(或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的主要内容,如果未能解决你的问题,请参考以下文章