#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
все должно быть хорошо.