Не получаю удаленные push-уведомления на iOS - PullRequest
0 голосов
/ 11 сентября 2018

В настоящее время я переписываю свое приложение с Objective-C на Swift и работаю над уведомлениями.По какой-то причине версия приложения Swift не получает никаких удаленных push-уведомлений, а версия Objective-C -.

Вот код, который я использую для регистрации уведомлений в AppDelegate:

    UNUserNotificationCenter.current().delegate = self
    let options: UNAuthorizationOptions = [.badge, .alert, .sound]
    UNUserNotificationCenter.current().requestAuthorization(options: options, completionHandler: { granted, error in
        print("access granted: \(granted)")
    })
    application.registerForRemoteNotifications()

Я предполагаю, что приложение успешно регистрируется, потому что вызывается метод didRegisterForRemoteNotificationsWithDeviceToken.Но когда я пытаюсь отправить тестовое уведомление, используя токен, полученный от этого метода, я не получаю фактическое уведомление на устройстве.

Также не вызывается ни один из этих методов:

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType) {

}

func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) {

}

func userNotificationCenter(_ center: UNUserNotificationCenter,  willPresent notification: UNNotification, withCompletionHandler   completionHandler: @escaping (_ options:   UNNotificationPresentationOptions) -> Void) {

}

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {

}

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

}

func application(_ application: UIApplication, handleActionWithIdentifier identifier: String?, forRemoteNotification userInfo: [AnyHashable : Any], completionHandler: @escaping () -> Void) {

}

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Убедитесь, что вы включили Push-уведомления в настройках вашего проекта. Как включить: перейдите к цели: -> выберите проект -> перейдите к возможностям -> перейдите к Push Notification. включите его там.

Другое дело, это сертификат. При разработке не стоит производство сертификатов.

0 голосов
/ 12 сентября 2018

вы говорите, что не получаете, поэтому давайте сначала удостоверимся, что те методы, которые вы упоминали ранее и которые не были вызваны, поступают отсюда extension AppDelegate: UNUserNotificationCenterDelegate (Кстати, когда вы реализуете метод didReceive убедитесь, что вы звоните completionHandler() в конце)

Когда вы делаете это:

application.registerForRemoteNotifications ()

Обязательно запустите его из основного потока , так как его можно вызвать, если он не указан из фона, и это может привести к сбою. Вы можете сделать это, выполнив

DispatchQueue.main.async { 
  UIApplication.shared.registerForRemoteNotifications()
}

Я предполагаю, что вы получаете токен устройства таким образом или что-то подобное:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        // 1. Convert device token to string
        let tokenParts = deviceToken.map { data -> String in
            return String(format: "%02.2hhx", data)
        }
        let token = tokenParts.joined()
        // 2. Print device token to use for PNs payloads
        print("Device Token: \(token)")
}

Наконец, реализуйте этот метод, чтобы увидеть, есть ли какие-либо ошибки при регистрации устройства

func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        // 1. Print out error if PNs registration not successful
        print("Failed to register for remote notifications with error: \(error)")
 }

Да, кстати (на случай, если вы его пропустили), убедитесь, что вы включили в целевой объект push-уведомление.

...