Подтвердить что ты не робот

Неисправность получения push-уведомлений в iOS10 и iOS9

Попытка настроить push-уведомление для iOS10. если бы он работал ранее для версий ниже 10.
Прочтите несколько руководств, моя настройка выглядит так:

// Register for the defined notifications

        if #available(iOS 10.0, *) {

            let center = UNUserNotificationCenter.current()
            center.delegate = UIApplication.shared.delegate as! AppDelegate
            center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in

                if error == nil {
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }

        } else {

            // Fallback on earlier versions

            let notificationSettings = UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: [autoCancelCategory])
            UIApplication.shared.registerUserNotificationSettings(notificationSettings)
            UIApplication.shared.registerForRemoteNotifications()

        }

Это называется login ^ в одном из моих контроллеров представления.

И теперь в AppDelegate он соответствует UNUserNotificationCenterDelegate, у меня есть следующие методы:

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    print("Got a push!")
}


@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    print("Got a push!")
}

И у меня также есть:

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

    let settings = UserDefaults.standard
    settings.setValue(deviceToken, forKey: "deviceToken")
}

Маркер устройства загружается на сервер как Data, и это отлично работает для предыдущих версий.
Я проверил, что токен на сервере соответствует таковому на телефоне.
Я включил push-уведомления для всех целей в Capabilities, я также отметил Add the push Notifications entitlement to your entitlements file.
Не получаю ничего вообще, хотя на push.
Любые идеи, что я могу делать неправильно здесь? Любые указатели были бы действительно оценены!

Спасибо!

EDIT: Я также заметил, что push-уведомления не работают в iOS9.

4b9b3361

Ответ 1

Идя на это, возможно, это будет полезно для других. Мой токен был неправильным. Кодировка изменилась с недавними обновлениями. Я действительно искал все переполнение стека для этого, и я понял, что мне пришлось преобразовать Data в String с помощью base64string. Однако я заметил, что в этой строке было несколько нечетных символов, например \. В итоге я закончил создание расширения Data:

extension Data {

    func hexString() -> String {
        return self.reduce("") { string, byte in
            string + String(format: "%02X", byte)
        }
    }

}

Это преобразует Data в правильный формат. Итак, если вы так делаете свое преобразование, плюс все права установлены, вы не забудьте добавить новые методы:

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    print("Got a push!")
}


@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    print("Got a push!")
}

и установите объект делегирования в didFinishLaunchingWithOptions, все должно быть хорошо, чтобы идти.

Ответ 2

Вы отметили, что в настройках сборки > Подписи кодового подписи имеется ссылка на файл прав? [AppName].entitlements.

И что файл прав содержит правильную информацию:

(ключ: APS Environment, value: development)

Кроме этого, вы можете попробовать восстановить сертификаты push. Нам пришлось создавать новые сертификаты, чтобы заставить его работать в процессе после обновления IOS 10 (но не в среде песочницы).

Ответ 3

Только что заметил, что вы регистрируете делегат позже, чем вызываются методы application(_:willFinishLaunchingWithOptions:) или application(_:didFinishLaunchingWithOptions:).

Возможно, поэтому ваши методы делегата не пострадали?

Смотрите docs:

Внимание!

Вы должны назначить объект-делегат объекту UNUserNotificationCenter не позднее, чем ваше приложение завершит запуск. Например, в приложении iOS вы должны назначить его в приложении (: willFinishLaunchingWithOptions:) или приложении (: doneFinishLaunchingWithOptions:).