检测应用程序处于后台/非活动状态时是不是触发了本地通知

Posted

技术标签:

【中文标题】检测应用程序处于后台/非活动状态时是不是触发了本地通知【英文标题】:Detect if Local Notification was fired while app was in background/inactive检测应用程序处于后台/非活动状态时是否触发了本地通知 【发布时间】:2019-05-15 16:47:14 【问题描述】:

我正在实现具有以下目标的本地通知功能:

如果用户至少 7 天没有访问屏幕 X,则显示此通知。 只显示一次,即使用户在第一次显示通知后没有再次访问屏幕 X。

我目前的策略是安排在用户首次启动应用后 7 天触发通知。然后,如果用户在这 7 天之前访问屏幕 X,我会重新安排该通知,从而有效地将计时器重置为 7 天以上。我使用自定义类 (NotificationManager) 来管理通知的设置和调度。您可以假设NotificationManager 的实现没有错误。

这是我的 AppDelegate.swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 

    // notification was never shown to the user
    if firstEverAppLaunch 
        NotificationManager.shared.schedule(notificationWithIdentifier: "remindUserToVisitScreenX")
    



func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) 
         if notification.request.identifier == "remindUserToVisitScreenX" 
             UserDefaults.standard.set(true, forKey: "doNotShowNotificationAgain")
         

ScreenXController.swift

//.. some uninteresting code


override func viewWillAppear() 
    // if user notification has never been shown, reschedule (i.e. reset) notification
    if !UserDefaults.standard.bool(forKey: "doNotShowNotificationAgain") 
        NotificationManager.shared.schedule(notificationWithIdentifier: "remindUserToVisitScreenX")
    

通过调用willPresent notification 函数,我当前的实现几乎可以正常工作。但是,如果通知在应用处于后台或非活动状态时到达,willPresent 将不会被调用,因此应用无法满足通知在整个生命周期内仅显示一次的要求应用程序。

例子:

用户一周未访问屏幕 X。应用程序处于非活动状态时会触发通知。用户关闭通知,然后启动应用程序,又一周没有访问屏幕 X。在那一周结束时,用户再次收到通知。

【问题讨论】:

【参考方案1】:

当用户在应用处于后台(挂起)或终止时点击或关闭通知时,将在以下UNUserNotificationCenterDelegate方法中接收回调。

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)

如果用户点击并打开应用,response.actionIdentifier 将是“UNNotificationDefaultActionIdentifier”。

如果用户通过点击通知中的清除选项或向左滑动通知关闭,response.actionIdentifier 将是“UNNotificationDismissActionIdentifier”。

因此,当应用处于非活动状态时,每当用户在通知中执行任何操作时,都会在此回调中收到通知。如您所料,这里可以安排 7 天的本地通知。

希望对你有帮助。

【讨论】:

嗨,阿南德,感谢您的回答。不幸的是,这不起作用,因为如果用户在屏幕上向上滑动(这就是我正在寻找的),UNNotificationDismissActionIdentifier 不会被调用。在这一点上,如果我想要的解决方案无法使用当前 Apple 提供的 API 实现,我不会感到惊讶

以上是关于检测应用程序处于后台/非活动状态时是不是触发了本地通知的主要内容,如果未能解决你的问题,请参考以下文章

应用程序处于非活动状态时无法接收静默通知 iOS

即使 App 处于非活动状态也显示 Alertview

检测从哪个 UILocalNotification 打开应用程序

本地电话通知

FCM 点击如何在应用程序处于后台状态时打开用户指定的活动而不是默认活动

FCM点击应用处于后台状态时如何打开用户指定的活动而不是默认活动