Не удается получить push-уведомление в iOS из тем Firebase 3.2.0

Я выполнил учебник по адресу https://firebase.google.com/docs/notifications/ios/console-topics#receive_and_handle_topic_messages, чтобы подписаться на тему Firebase в моем приложении iOS.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { FIRMessaging.messaging().subscribeToTopic("/topics/Notifications") let homeViewController = UINavigationController(rootViewController: HomeViewController()) UINavigationBar.appearance().translucent = false window = UIWindow(frame: UIScreen.mainScreen().bounds) window?.rootViewController = homeViewController window?.makeKeyAndVisible() return true } 

Тем не менее, когда я отправляю уведомление о том, что из консоли Firebase отправляется. Я не мог получать push-уведомления. Но когда я отправляю push-уведомление в пользовательский сегмент с консоли, толчок работает отлично. Когда я проверяю консоль Xcode, я вижу эту ошибку FIRMessaging.

 2016-05-31 11:11:47.893: <FIRMessaging/WARNING> Cannot subscribe to topic: /topics/Notifications with token: (null) 

Я попытался найти эту ошибку, но мне не повезло найти что-либо. Я не уверен, что это проблема, из-за которой мое приложение не получает никакого нажатия от тем.

Кто-нибудь имеет эту проблему и знает, как ее решить?

Похоже, возможно, вы слишком рано subscribeToTopic ToTopic.

Во-первых, прежде чем вы установите любой вызов Firebase, убедитесь, что вы вызываете

 FIRApp.configure() 

Это обеспечит правильную настройку и инициализацию всех служб Firebase.

Затем вам нужно подождать немного, чтобы подписаться на темы. Ваш клиент должен сначала зарегистрировать ваше приложение как с APN, так и с FCM, чтобы гарантировать получение уведомлений. Это связано с сетевым вызовом, что означает, что вы не можете подписаться на темы, когда приложение запускается впервые.

Вместо этого я бы рекомендовал поместить этот код в ваше application:didRegisterUserNotificationSettings обработчик application:didRegisterUserNotificationSettings . Что-то вроде этого:

 - (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { NSLog(@"Hooray! I'm registered!"); [[FIRMessaging messaging] subscribeToTopic:@"/topics/cool_users"]; } 

Изменить: и версия Swift …

 func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) { print("Hooray! I'm registered!") FIRMessaging.messaging().subscribeToTopic("/topics/swift_fans") } 

Принятое решение не сработало для меня. Токен не всегда доступен, когда application:didRegisterUserNotificationSettings: вызывается. Например, если приложение недавно установлено и запускается в первый раз, FIRInstanceID.instanceID().token() возвращает nil.

Вы должны убедиться, что приложения требуют subscribeToTopic: после того, как токен доступен. Я закончил с созданием вспомогательного объекта, который enqueues subscribeToTopic: unsubscribeFrom unsubscribeFrom: вызывает и выполняет их в порядке FIFO после поступления маркера.

 class FIRMessagingHelper { private let queue: OperationQueue init() { queue = OperationQueue() queue.maxConcurrentOperationCount = 1 queue.addOperation(TokenReadyOperation()) } func subscribeTo(topic: String) { queue.addOperation { OperationQueue.main.addOperation({ FIRMessaging.messaging().subscribeToTopic(topic) }) } } func unsubscribeFrom(topic: String) { queue.addOperation { OperationQueue.main.addOperation({ FIRMessaging.messaging().unsubscribeFromTopic(topic) }) } } } 

TokenReadyOperation ждет, пока не появится токен. Асинхронное управление используется в качестве базового класса для минимизации шаблона.

 class TokenReadyOperation : AsynchronousOperation { override init() { super.init() NotificationCenter.default.addObserver(self, selector: #selector(TokenReadyOperation.tokenRefreshed(notification:)), name: .firInstanceIDTokenRefresh, object: nil) } override func didStart() { finishIfTokenAvailable() } private func finishIfTokenAvailable() { guard FIRInstanceID.instanceID().token() != nil else { return } markFinished() } /// Posted every time token changes @objc private func tokenRefreshed(notification: Notification) { finishIfTokenAvailable() } } 

Мало что нужно помнить:

  • Приложение должно вызывать FIRApp.configure() или FIRApp.configureWithOptions(_:) перед выполнением любых вызовов Firebase (как упоминал Тодд Керпельман )
  • subscribeToTopic: unsubscribeFrom: не являются потокобезопасными и должны выполняться в основном потоке
  • Имена тем должны быть в формате «/ themes / *» (как упоминалось выше)
  • Обязательно используйте другой конфигурационный слой для отладки и выпуска App Store вашего приложения. См. FIRApp.configureWithOptions(_:) .
  • Дата и время должны быть текущими, иначе токен не может быть доставлен.
  • Обязательно используйте новейшую версию фреймворка . У меня были проблемы с доставкой уведомлений с SDK, выпущенным около января 2017 года.

Моя проблема не была решена путем вызова subscribeToTopic после

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {

вместо этого он работал, вызывая subscribeToTopic после

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 

эта функция вызывается, когда вы получаете токен от APNS, а не firebase .

Xcode 8.3.2

Swift 3.0

  • какая разница между APNs Распространение iOS и Apple Push Services
  • будет активировать уведомление по-прежнему после передачи права собственности в iTunesConnect
  • Мое приложение вылетает, когда я пытаюсь зарегистрировать пользователя и активировать push-оповещения с помощью синтаксического анализа
  • iOS: используйте уведомление VOiP вместо «нормального» уведомления
  • Как сообщить, что приложение было запущено, нажав push-сообщение
  • Уведомления iOS Push: как получить «идентификатор уведомления» в делегате
  • На удаленное push-уведомление перенаправляется на правильный ViewController
  • Обработка уведомлений Push при завершении работы приложения
  • Push-уведомления с помощью Parse, Testflight и Xcode 6 не работают
  • Уведомление IOS, когда приложение закрыто
  • Как отправить дополнительные данные уведомления One Signal и получить их?
  • Interesting Posts

    Как вызвать deinit в Swift

    Как загрузить файл с AFNetworking 2.0

    Как открыть схемы URL из Safari в iOS9?

    Сортировать по нескольким свойствам с помощью Realm

    iAd не отображается асинхронно после вызова метода делегата

    Mobile Safari – высота устройства просмотра не работает должным образом

    Как написать PFQuery, который вытащит PFObject и потянет также отсортированное отношение

    Понимание количества удержания с блокированием доступа к нему внутри.

    Кнопка IOS в добавление платформы или версии не работает, не удается загрузить новую версию в AppStore, используя ITUNES CONNECT

    Использование Gdata для получения статистики о видео

    Переключение между несколькими видами в одном и том же диспетчере представлений

    Как создать NSViewController в Swift?

    Как сделать кнопку на ячейке просмотра таблицы, вызовите правильную таблицуView: cellForRowAtIndexPath?

    Как я могу поймать жесты над UICollectionView?

    iOS с Google Maps

    Давайте будем гением компьютера.