如何确保 iOS 本地通知在应用程序终止后*发送*

How to ensure that an iOS local notification gets delivered *after* the app terminates

我试图在我的应用程序被终止后发出本地通知,以警告用户无论该应用程序在做什么,它都不能再做了。 MileIQ 在警告用户该应用程序已被终止并且如果他们希望仍记录行程时需要重新启动它时,会执行与后台位置跟踪类似的操作。

我的代码在 UIApplicationWillTerminateNotification 处理程序中看起来像这样:

let notification = UILocalNotification()
notification.soundName = UILocalNotificationDefaultSoundName
notification.alertTitle = "title"
notification.alertBody = "body"
notification.fireDate = NSDate().dateByAddingTimeInterval(6)
UIApplication.sharedApplication().scheduleLocalNotification(notification)

神奇的 fireDate 延迟设置为 6 秒是因为 applicationWillTerminate5 seconds to the app to cleanup,如果方法没有 return,iOS 会终止应用程序]及时。

我注意到,如果我立即触发本地通知,它会出现得非常短暂,并在应用程序被 iOS 杀死时消失。通过添加 6 延迟,通知出现的时间约为 50%,并且不会被关闭。

我正在寻找的是一种可靠的解决方案,可以在应用程序被终止后显示此本地通知。知道怎么做吗?

aplicationWillTerminate 方法不能确保在终止时被调用。 您可以在此处更详细地阅读它 Local notification on application termination

在深入研究并看到 this comment 之后,我找到了一种在 UIApplicationWillTerminateNotification 事件后显示本地通知的一致方法:

presentNotification() // see code in original question
sleep(2)

我认为发生的事情是应用程序终止的速度快于它显示本地通知的速度,因此通过调用 sleep(2) 我让应用程序关闭得慢一点以允许显示通知。

当用户手动关闭应用程序时,本地通知现在会一致显示。不太担心 iOS 在没有警告的情况下终止应用程序,所以这对我来说是一个很好的解决方案。