Проблемы с получением push-уведомлений в iOS10 и iOS9

#ios #swift #apple-push-notifications #swift3

#iOS #swift #apple — push-уведомления #swift3

Вопрос:

Пытаюсь настроить 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()

        }
  

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

И теперь, в 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-уведомления не работают в iOS9.

Комментарии:

1. Это может быть проблема с ОС. Пожалуйста, попробуйте перезагрузить устройство. twitter.com/yogye7/status/781340933228945408

Ответ №1:

Вы проверили, что настройки сборки> Права подписи кода содержат ссылку на файл прав доступа? [AppName].права.

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

(ключ: среда APS, значение: разработка)

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

Комментарии:

1. Проверил Настройки сборки> Права подписи кода, и, похоже, проблем там нет.

2. у @Kex была такая же проблема с количеством приложений в нашей компании. Пожалуйста, также проверьте Настройки сборки> Возможности и убедитесь, что «Уведомления» включены.

Ответ №2:

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

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

Смотрите Документы:

Важно

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

Комментарии:

1. Действительно хорошее место! Я попробую, когда вернусь домой, и сообщу вам о результатах.

2. перешел let center = UNUserNotificationCenter.current() ; center.delegate = self на func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool и до сих пор ничего не проходит

3. У меня есть: if #available(iOS 10.0, *) { UNUserNotificationCenter.currentNotificationCenter().delegate = self }

4. я полагаю, вы еще не на Swift 3?

5. Вы правы. Что-то еще мешает вам получать эти уведомления, хотя определение делегата в правильном месте — это, по крайней мере, начало.

Ответ №3:

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

 extension Data {

    func hexString() -> String {
        return self.reduce("") { string, byte in
            string   String(format: "X", 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 все должно быть хорошо.