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

时间:2019-05-15 16:47:14

标签: ios swift appdelegate localnotification unusernotificationcenter

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

  

如果用户至少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 个答案:

答案 0 :(得分:1)

当应用在后台(挂起)或终止时用户点击或取消通知时,将通过以下UNUserNotificationCenterDelegate方法接收回调。

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

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

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

因此,只要应用程序处于非活动状态,只要用户在通知中采取任何措施,都会在此回调中收到通知。如您所料,可以在此处安排7天本地通知。

希望有帮助。