Почему userNotificationCenter didReceive не срабатывает? - PullRequest
0 голосов
/ 24 ноября 2018

Это часть моего кода.Я хочу использовать UNUserNotificationCenter и UNUserNotificationCenterDelegate для обработки событий уведомления.

Этот код перехватывает событие уведомления, когда приложение находится в состоянии переднего плана.Но "didReceive" не запускается для фонового состояния.

func application(_ application: UIApplication,
                         didFinishLaunchingWithOptions launchOptions:
            [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
            UNUserNotificationCenter.current().delegate = self
    application.registerForRemoteNotifications()
    return true
    }    
        func userNotificationCenter(_ center: UNUserNotificationCenter,
                                    willPresent notification: UNNotification,
                                    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void)
        {
            print("willPresent") /// This works
            completionHandler([.alert, .badge, .sound])
        }
        func userNotificationCenter(_ center: UNUserNotificationCenter,
                                    didReceive response: UNNotificationResponse,
                                    withCompletionHandler completionHandler: @escaping () -> Void) {
            print("didReceive") /// This doesn't work
            completionHandler()
        }

Но если я не использую UNUserNotificationCenter.current().delegate = self, метод делегата корректно запускается в фоновом режиме.

func application(_ application: UIApplication,
                     didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping FetchCompletionHandler) {
        print("didReceiveRemoteNotification... \(userInfo)")
}

Как я могу использовать «didReceive»?Я хочу обработать уведомление в фоновом режиме.

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Вот так я обрабатываю push-уведомления в своем приложении.Я думаю, что вам нужно реализовать все эти методы для обработки всех версий iOS в режиме переднего плана и в фоновом режиме.

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

    if #available(iOS 10.0, *) {
        let center  = UNUserNotificationCenter.current()
        center.delegate = self
        center.requestAuthorization(options: [.sound,.alert,.badge], completionHandler: { (granted, error) in
            if error == nil {
                DispatchQueue.main.async {
                    application.registerForRemoteNotifications()
                }
            }
        })
    }
    else {
        let notificationTypes: UIUserNotificationType = [UIUserNotificationType.alert, UIUserNotificationType.badge, UIUserNotificationType.sound]
        let pushNotificationSettings = UIUserNotificationSettings(types: notificationTypes, categories: nil)
        application.registerUserNotificationSettings(pushNotificationSettings)
        application.registerForRemoteNotifications()
    }

}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    print(deviceTokenString)
}

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
    print("Failed to get token; error: \(error)")
}

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    completionHandler([.alert,.sound])
     //do sth
}

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
     //do sth
}

// for iOS < 10
func application(_ application: UIApplication, didReceive notification: UILocalNotification) {
}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
}
0 голосов
/ 27 ноября 2018

application(_:didReceiveRemoteNotification:fetchCompletionHandler:) вызывается, когда приложение получает тихое push-уведомление.Тихие push-уведомления могут быть доставлены, когда приложение находится в фоновом состоянии, iOS запускает приложение для выполнения фоновой обработки, невидимой для пользователя.

Для тихого push-уведомления установлен флаг content-available, установленный в 1.

Беззвучные push-уведомления не должны содержать предупреждение, значок или звук.Silent push не предназначен для того, чтобы быть видимым для пользователя, это всего лишь подсказка приложению, что доступен новый удаленный контент.

Снятие флага content-available с вашей полезной нагрузки push-уведомлений заставит iOS справиться с этим.в качестве регулярного уведомления.Методы делегирования центра уведомлений пользователей будут вызываться вместо application(_:didReceiveRemoteNotification:fetchCompletionHandler:), но ваше приложение не сможет выполнять фоновую обработку, инициированную уведомлением.

Вы можете проверить содержимое полезных данных push-уведомлений для подобных проблем, используя этот инструмент

0 голосов
/ 24 ноября 2018

Существуют методы UNUserNotificationCenterDelegate:

  • willPresent: этот метод вызывается при получении уведомления, когда ваше приложение находится на переднем плане.Если приложение находится в фоновом режиме, то этот метод не будет вызывать.

  • didRecieve: этот метод вызывается, когда пользователь нажимает на уведомление.

В случае фонового состояния будет отображаться только 'didRecieve'вызывается, когда пользователь нажимает на уведомление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...