Неисправность получения 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.
Ответы
Ответ 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:).