Firebase iOS Push-уведомления не работают при первой установке - PullRequest
0 голосов
/ 02 февраля 2019

Когда я впервые устанавливаю и открываю приложение и принимаю уведомление о разрешении уведомлений от Apple, я получаю этот журнал от Firebase:

5.16.0 - [Firebase / InstanceID] [I-IID023004]Не удалось обновить атрибуты пары ключей, которые будут доступны после первой разблокировки.статус обновления: -25300

После этого, если я закрываю или отправляю приложение в фоновый режим, я не получаю никаких уведомлений.Если я открою приложение во второй раз, уведомления начнут работать нормально.

Это мои текущие настройки:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    setupPushNotificationsHandling(application)
    return true
}

private func setupPushNotificationsHandling(_ application: UIApplication) {
    UNUserNotificationCenter.current().delegate = self
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, _) in
        guard granted else { return }

        DispatchQueue.main.async {
            application.registerForRemoteNotifications()

            FirebaseApp.configure()
            InstanceID.instanceID().instanceID { (result, _) in
                // Receive notifications from the "all" topic
                Messaging.messaging().subscribe(toTopic: "all")
            }
        }
    }
}

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

1 Ответ

0 голосов
/ 04 февраля 2019

Вот как я это решил.

  1. Прежде чем пытаться подписаться на тему уведомлений, я жду, пока не будет вызван метод делегата application:didRegisterForRemoteNotificationsWithDeviceToken:.
  2. Я повторяю до тех пор, покаВызов InstanceID.instanceID().instanceID возвращает действительный токен устройства.

Полная настройка:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
    setupPushNotificationsHandling(application)
    return true
}

private func setupPushNotificationsHandling(_ application: UIApplication) {
    FirebaseApp.configure()

    application.registerForRemoteNotifications()

    UNUserNotificationCenter.current().delegate = self
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound]) { (_, _) in }
}

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    // Receive notifications from the "all" topic
    subscribeToNotificationsTopic(topic: "all")
}

func subscribeToNotificationsTopic(topic: String) {
    // Retry until the notifications subscription is successful
    DispatchQueue.global().async {
        var subscribed = false
        while !subscribed {
            let semaphore = DispatchSemaphore(value: 0)

            InstanceID.instanceID().instanceID { (result, error) in
                if let result = result {
                    // Device token can be used to send notifications exclusively to this device
                    print("Device token \(result.token)")

                    // Subscribe
                    Messaging.messaging().subscribe(toTopic: topic)

                    // Notify semaphore
                    subscribed = true
                    semaphore.signal()
                }
            }

            // Set a 3 seconds timeout
            let dispatchTime = DispatchTime.now() + DispatchTimeInterval.seconds(3)
            _ = semaphore.wait(timeout: dispatchTime)
        }
    }
}
...