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

Posted

技术标签:

【中文标题】如何确保在应用程序终止后*发送 iOS 本地通知【英文标题】:How to ensure that an iOS local notification gets delivered *after* the app terminates 【发布时间】:2016-05-21 00:43:32 【问题描述】:

我正在尝试在我的应用程序被终止后触发本地通知,以警告用户无论应用程序在做什么,它都不能再这样做了。 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秒是因为applicationWillTerminate有5 seconds to the app to cleanup,如果方法没有及时返回,ios会杀死应用程序。

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

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

【问题讨论】:

你是如何杀死应用程序的。如果您使用应用切换器终止,applicationWillTerminate 将无法可靠执行 @Paulw11 该应用程序是从应用程序管理器手动终止的(双击主页按钮)。我不太关心操作系统会自行杀死应用程序。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何确保在应用程序终止后*发送 iOS 本地通知的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 后台运行服务以接收本地通知?

iOS 在收到静默远程通知后发送本地通知

在 iOS 级别本地更改远程推送通知的声音

终止后启动带有推送通知的应用程序

是否可以在事件 IOS 之后触发本地通知?

在应用程序被杀死后,使用 HTTP 请求通过 Firebase(FCM)向 iOS 设备发送推送通知 [重复]