Push Notifications не принимается на iOS 10, но работает на iOS 9 и до
У меня есть несколько приложений, которые были написаны в Swift 2.2, скомпилированы с Xcode 7.3 и живут в App Store. Приложения используют Push Notifications и отлично работают в iOS 9.3 и более ранних версиях.
Однако на устройствах, которые были обновлены до iOS 10, мои приложения не получают Push Push-сообщений. Устройства, которые все еще работают с iOS 9, все еще получают уведомления.
Думая, что это может быть проблема с сертификатом или правом, я попробовал следующее:
Обновил одно из моих приложений до Swift 2.3, добавил APS Environment Entitlement и скомпилировал его в Xcode 8, но это не имело значения.
В моем AppDelegate у меня все еще есть существующие методы регистрации для push-уведомлений, которые включают в себя:
let notificationSettings = UIUserNotificationSettings(forTypes: [.Badge, .Sound, .Alert], categories:nil)
application.registerUserNotificationSettings(notificationSettings)
Эта регистрация, кажется, успешна даже на iOS 10, так как приложение didRegisterForRemoteNotificationsWithDeviceToken затем вызывается, поэтому я получаю токен от APNS.
Проблема заключается в том, что при отправке push-уведомления этому устройству приложение didReceiveRemoteNotification никогда не вызывается.
Теперь здесь сказано, что методы в UIApplicationDelegate устарели на iOS 10, и я должен реализовать userNotificationCenter (: didReceive: withCompletionHandler:) и userNotificationCenter (: willPresent: withCompletionHandler:)
Проблема заключается в том, что я не ТОЛЬКО таргетинг на iOS 10. Мне все еще нужно приложение для работы с iOS 8 и 9, поэтому я сомневаюсь, что это правильный подход для реализации этих методов.
Как получить push-уведомления для существующего приложения для продолжения работы над устройствами, которые были обновлены до iOS 10? Нужно ли переписывать код? Мне просто нужно обновить некоторые сертификаты или права и перекомпилировать в Xcode 8 с некоторыми "новыми" настройками?
Ответы
Ответ 1
Хорошо, я понял это. Теперь у меня есть мои оригинальные Push Notifications, которые работали на iOS 9, работающем на iOS 10 с Xcode 8 и Swift 2.3.
Я реализовал это, внеся следующие изменения в свой AppDelegate:
1) В настройках моего проекта под вкладкой "Возможности" прокрутите вниз до "Push Notifications" и поверните его на "ON". Это автоматически создает файл прав, содержащий ключ "APS Environment" и со значением "development".
2) В AppDelegate.swift я делаю несколько изменений кода. Я начинаю с импорта рамки UserNotifications:
import UserNotifications
Затем у меня есть приложение AppDelegate, реализующее протокол UNUserNotificationCenterDelegate:
class AppDelegate: /*Some other protocols I am extending...*/, UNUserNotificationCenterDelegate {
Затем я добавляю следующий метод:
func registerForPushNotifications(application: UIApplication) {
if #available(iOS 10.0, *){
UNUserNotificationCenter.currentNotificationCenter().delegate = self
UNUserNotificationCenter.currentNotificationCenter().requestAuthorizationWithOptions([.Badge, .Sound, .Alert], completionHandler: {(granted, error) in
if (granted)
{
UIApplication.sharedApplication().registerForRemoteNotifications()
}
else{
//Do stuff if unsuccessful...
}
})
}
else{ //If user is not on iOS 10 use the old methods we've been using
let notificationSettings = UIUserNotificationSettings(
forTypes: [.Badge, .Sound, .Alert], categories: nil)
application.registerUserNotificationSettings(notificationSettings)
}
}
Затем я вызываю эту вновь созданную функцию внутри didFinishLaunchingWithOptions:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
...
registerForPushNotifications(application)
...
}
Я оставляю метод didRegisterForRemoteNotificationsWithDeviceToken неизменным:
func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
//Implement this. Do something with the token I receive. Send it to my push notification server to register the device or something else I'd like to do with the token.
}
Теперь я реализую два новых метода для iOS 10 для обработки приема Push-уведомлений:
@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, willPresentNotification notification: UNNotification, withCompletionHandler completionHandler: (UNNotificationPresentationOptions) -> Void) {
//Handle the notification
}
@available(iOS 10.0, *)
func userNotificationCenter(center: UNUserNotificationCenter, didReceiveNotificationResponse response: UNNotificationResponse, withCompletionHandler completionHandler: () -> Void) {
//Handle the notification
}
Я не удалял какие-либо из методов, которые я ранее реализовал для Push-уведомлений в iOS 9.
Ответ 2
IOS 10 имеет другой комплект уведомлений.
import UserNotifications
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
if #available(iOS 10.0, *) {
let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: [.badge, .alert , .sound]) { (granted, error) in
if granted {
UIApplication.shared.registerForRemoteNotifications()
}
}
} else {
let type: UIUserNotificationType = [UIUserNotificationType.badge, UIUserNotificationType.alert, UIUserNotificationType.sound]
let setting = UIUserNotificationSettings(types: type, categories: nil)
UIApplication.shared.registerUserNotificationSettings(setting)
UIApplication.shared.registerForRemoteNotifications()
}
}
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data){
let token = String(format: "%@", deviceToken as CVarArg)
}
Ответ 3
Я исправил эту проблему, используя следующий шаг:
Шаг 1. Перейдите в Project → Target → Возможности → Push Notifications → Включите его.
Шаг 2: Исправить проблему, связанную с соответствующим сертификатом, профилем подготовки
Шаг 3: Закройте Xcode, очистите и запустите
Ответ 4
В различных ответах SO на вопросы о iOS 9 vs iOS 10 push-уведомлениях я пробовал следующие тесты:
1) обновите вызовы уведомлений, чтобы специально использовать UNUserNotificationCenter для устройств iOS 10
2) обновите функцию Push, чтобы обновить файл прав.
Я могу подтвердить, что выполнение # 2 и сохранение всего вашего существующего кода push iOS 9 одинаково позволит базовым push-уведомлениям поступать на устройства iOS 10
Ответ 5
Когда мое приложение было перенесено с IOS 9 на IOS 10, молчащие push-уведомления, отправленные моим сервером Parse, размещенным на Heroku, перестали получать приложение.
Единственное изменение, которое я сделал, чтобы сделать уведомления снова, - это изменить Javascript на моем сервере, чтобы аргумент content-available был целым числом 1, а не строкой "1"
Parse.Push.send({
where: notifyDeletedRequestsQuery,
data: {
'content-available': 1,
refresh: constants.requestsClassName
}
}, { useMasterKey: true });
Также обратите внимание, что контент не может отображаться в том же push-уведомлении, что и значок, звук или предупреждение.