watchOS, не получая удаленные уведомления - PullRequest
0 голосов
/ 11 марта 2020

Я занимаюсь разработкой приложения для WatchOS 6, но не могу получить удаленное уведомление

Вот мой регистрационный код для уведомлений pu sh в ExtensionDelegate. Я получаю действительный токен устройства.

extension ExtensionDelegate {

    func setupRemoteNotifications() {

        UNUserNotificationCenter.current().delegate = self

        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in

            print("[WATCH PUSH NOTIFICATIONS] Permission granted: \(granted)")

            guard granted else {
                DispatchQueue.main.async {
                    self.showNotificationsNotGrantedAlert()
                    return
                }
                return
            }

            self.getNotificationSettings()
        }
    }

    private func getNotificationSettings() {

        UNUserNotificationCenter.current().getNotificationSettings { settings in

            print("[WATCH PUSH NOTIFICATIONS] Notification settings: \(settings)")

            guard settings.authorizationStatus == .authorized else { return }

            DispatchQueue.main.async {
                WKExtension.shared().registerForRemoteNotifications()
                self.onRemoteNotificationRegistration()
            }
        }
    }

    private func onRemoteNotificationRegistration() { }

    func didRegisterForRemoteNotifications(withDeviceToken deviceToken: Data) {

        // Convert token to string
        let deviceTokenString = deviceToken.map { data in String(format: "%02.2hhx", data) }.joined()

        print("[WATCH PUSH NOTIFICACTIONS] Device Token: \(deviceTokenString)")

        UserSettings.shared.deviceToken = deviceTokenString
    }

    func didFailToRegisterForRemoteNotificationsWithError(_ error: Error) {
        print("[WATCH PUSH NOTIFICATIONS] Failed to register device: \(error)")
        UserSettings.shared.deviceToken = nil
    }

    func didReceiveRemoteNotification(_ userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (WKBackgroundFetchResult) -> Void) {

        print("[WATCH PUSH NOTIFICATIONS] Push notification received: \(userInfo)")

        let aps = userInfo["aps"] as! [String: AnyObject]

        completionHandler(.noData)
    }
}

extension ExtensionDelegate: UNUserNotificationCenterDelegate {

    // show notification also when in foreground
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        print("[WATCH PUSH NOTIFICATION] Will present notification...")

        let categoryIdentifier = notification.request.content.categoryIdentifier
        let category = NotificationCategory(rawValue: categoryIdentifier)

        if category == NotificationCategory.NotificationCategory {

        } else if category == NotificationCategory.ActivityCategory {

        }

        completionHandler([.alert, .badge, .sound])
    }


    // called when tapped onto notification banner
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        print("[WATCH PUSH NOTIFICATION] Did receive notification response")

        let userInfo = response.notification.request.content.userInfo as! [String: AnyObject]

        let aps = userInfo["aps"] as! [String: AnyObject]

        let categoryIdentifier = response.notification.request.content.categoryIdentifier
        let category = NotificationCategory(rawValue: categoryIdentifier)

        if category == NotificationCategory.NotificationCategory {

        } else if category == NotificationCategory.ActivityCategory {

        }

        handleNotificationAction(response.actionIdentifier)
        openNotification(userInfo: userInfo)

        completionHandler()
    }

}

extension ExtensionDelegate {

    private func handleNotificationAction(_ actionIdentifier: String) {

        let action = NotificationAction(rawValue: actionIdentifier)
        if action == NotificationAction.Call {
            print("Action: Call handled!")
        } else if action == NotificationAction.Email {
            print("Action: Email handled!")
        } else if action == NotificationAction.Message {
            print("Action: Message handled!")
        }
    }

    private func openNotification(userInfo: [String: AnyObject]) {
        // let something = userInfo["something"] ...
    }
}

extension ExtensionDelegate {

    private func showNotificationsNotGrantedAlert() {

        let settingsActionTitle = NSLocalizedString("Settings", comment: "")
        let cancelActionTitle = NSLocalizedString("Cancel", comment: "")
        let message = NSLocalizedString("You need to grant a permission from notification settings.", comment: "")
        let title = NSLocalizedString("Push Notifications Off", comment: "")

        let settingsAction = WKAlertAction(title: settingsActionTitle, style: .default) {

            print("[WATCH PUSH NOTIFICATIONS] Go to Notification Settings")
        }

        let cancelAction = WKAlertAction(title: cancelActionTitle, style: .cancel) {
            print("[WATCH PUSH NOTIFICATIONS] Cancel to go to Notification Settings")
        }

        WKExtension.shared().rootInterfaceController?.presentAlert(withTitle: title, message: message, preferredStyle: .alert, actions: [settingsAction, cancelAction])
    }
}

Я добавил Pu sh Разрешение на уведомление в WatchExtensions

Я отправляю уведомление от Pu sh Приложение Notification Tester с использованием действующего TeamId, P8-сертификата, P8-ключа, комплекта Id -> где я получаю успех.

Я отправляю тестовое уведомление по умолчанию, ничего особенного

{
    "aps": {
        "alert": {
            "title": "Silver Salmon Creek",
            "body": "You are within 5 miles of Silver Salmon Creek."
        },
        "category": "Notification"
    }
}

У меня есть аналогичный код для iOS, и там уведомление доставляется правильно iPhone.

ОБНОВЛЕНИЕ

Я протестировал немного больше

И у меня есть приложение, добавленное в мое приложение iPhone, но приложение iPhone предназначено для iOS 13 и приложения Watch предназначен для WatchOS 6

Так что, насколько я понимаю, это приложение WatchOS можно установить как отдельное приложение.

Я установил флажок «Поддержка работает без iOS Установка приложения»

Поэтому, насколько я понимаю, мой сервер должен отправить это уведомление как на устройство «Смотреть устройство», так и iOS устройство. И там APNS / iOS / watchOS принимают решение, если есть дублированное уведомление, куда доставить это уведомление, т.е. iPhone / watchOS. Если есть только приложение watchOS, я думаю, оно будет доставлено для просмотра токена устройства. Если есть приложение watch / iOS, оно отправит на iOS и затем устройство, использует ли пользователь iPhone / Watch в данный момент и доставит его. на используемое в настоящее время устройство.

Так что теперь, если я отправляю уведомление на токен устройства iPhone с iOS идентификатором пакета и заблокировал iPhone и смотрю на запястье, я получаю уведомление на своем WatchOS и даже могу просматривать длинные уведомления с содержание Dynami c.

Но когда я удаляю iOS версию приложения и отправляю уведомление с iPhone или маркером устройства просмотра и соответствующим идентификатором комплекта iOS / watchOS, тогда для автономного приложения я не получаю это уведомление снова.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Я нашел проблему. Это было связано с тем, как Pu sh Уведомление отправляется с сервера с помощью node-apns. У меня также есть старое приложение Pu sh Notification Tester. Требуется версия 3.0-node-apns. есть дополнительное поле заголовка, отправляемое на сервер APNS

apns-push-type
0 голосов
/ 28 апреля 2020

Я столкнулся с подобной проблемой, убедитесь, что ваш идентификатор пакета p8 использует явный идентификатор WatchkitApp, а не идентификатор расширения.

После того, как я сбросил .watchkitextension и удалил (приложение), переустановил, перерегистрировал устройство, это сработало.

...