在应用程序终止时安排本地通知

Posted

技术标签:

【中文标题】在应用程序终止时安排本地通知【英文标题】:Scheduling a local notification when the app is terminated 【发布时间】:2019-05-14 21:32:45 【问题描述】:

我的目标是创建一个本地通知,如果用户 2 周没有启动该应用程序就会触发该通知。我使用 Manager 类来处理应用本地通知的调度。

这是我目前的解决方案:

func applicationWillTerminate(_ application: UIApplication) 
    NotificationManager.shared.schedule(notification)

但是,applicationWillTerminate 不会被调用 - 因此不会安排通知 - 如果应用在后台被终止(即从 Dock 上滑动)。

是否有任何解决方法?

我想到的一个解决方法是在应用进入后台时安排通知,然后在应用再次激活时调用removePendingNotificationRequests(),如下所示:

func applicationDidEnterBackground(_ application: UIApplication) 
    NotificationManager.shared.schedule(notification)


func applicationDidBecomeActive(_ application: UIApplication) 
   UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: ["notification"])

问题在于,在我看来,它是一种浪费且次优的解决方案。有没有比安排这个通知更优雅的解决方案

【问题讨论】:

【参考方案1】:

您非常接近我将使用的策略。与其在进入后台时安排通知,不如在每次应用程序激活时清除并安排通知。

func applicationDidBecomeActive(_ application: UIApplication)  
    UNUserNotificationCenter.current().removePendingNotificationRequests( withIdentifiers: ["notification"]
    NotificationManager.shared.schedule(notification)

每次启动时,您都应该在未来 2 周内设置通知。如果他们明天启动,请删除旧通知,然后在两周后设置一个新通知。

【讨论】:

如果操作为通知设置了相同的标识符,则无需清除,因为它会过于机智 你是对的。我一定对以前的实现有过眼光,需要用新的眼光来审视它。我最终直接在didFinishLaunchingWithOptions 中安排了通知,以进一步简化代码(尽管您的回答同样有效)。【参考方案2】:

如果您没有说,我会建议当前的解决方法,实际上在后台运行的 ios 应用程序的后台体验非常差,并且无法保证 applicationWillTerminate 被调用,甚至在调度发生之前保持活动状态,因为 IOS 总是关心应用程序,当它被发送到后台终止时,它几乎放弃了 5 分钟,如果用户同时打开多个应用程序,这将大大减少

你可以创建一个后台获取进程来在应用关闭时安排它,但这会比现在更麻烦

【讨论】:

以上是关于在应用程序终止时安排本地通知的主要内容,如果未能解决你的问题,请参考以下文章

IOS,应用启动时如何处理多个本地通知?

应用程序终止时删除本地通知

当我的 iOS 应用程序处于前台时,如何使本地通知静音?

如果在 iOS 设置中禁用通知访问时安排本地通知,则不会在 iOS 13 上触发本地通知

重新安排用户通知(本地)?

当应用程序处于终止状态而没有用户交互时如何清除本地通知。