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

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 с некоторыми "новыми" настройками?

4b9b3361

Ответ 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-уведомлении, что и значок, звук или предупреждение.