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

Ios 检测应用程序处于后台/非活动状态时是否触发本地通知,ios,swift,appdelegate,localnotification,unusernotificationcenter,Ios,Swift,Appdelegate,Localnotification,Unusernotificationcenter,我正在实现本地通知功能,目标如下: 如果用户至少7天未访问屏幕X,则显示此通知仅显示一次,即使用户在第一次显示通知后没有再次访问屏幕X 我目前的策略是在用户首次启动应用程序7天后发送通知。然后,如果用户在这7天之前访问屏幕X,我会重新安排通知,这将有效地将计时器重置为7天以上。我使用自定义类(NotificationManager)来管理通知的设置和调度。您可以假设NotificationManager的实现没有bug 这是我的AppDelegate.swift: func applicatio

我正在实现本地通知功能,目标如下:

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

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

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

例如:


用户一周内没有访问X屏幕。应用程序处于非活动状态时会触发通知。用户取消通知,然后启动应用程序,一周内不再访问X屏。在该周结束时,用户再次收到通知

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

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void)
如果用户点击并打开应用程序,
response.actionIdentifier
将是“
UNNotificationDefaultActionIdentifier

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

因此,每当用户在应用程序处于非活动状态时在通知中采取任何操作时,都会在该回调中接收到该操作。正如您所期望的,7天的本地通知可以安排在这里


希望有帮助。

嗨,阿南,谢谢你的回答。不幸的是,这不起作用,因为如果用户在屏幕上滑动(这就是我要找的),则不会调用
UNNotificationDismissActionIdentifier
。在这一点上,如果我想要的解决方案不能用当前苹果提供的API实现,我不会感到惊讶