Не удается получить 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

  • iOS: Push-уведомления, UIApplicationStateInactive и быстрое переключение приложений
  • Запросить разрешение на уведомление После регистрации (не только после запуска приложения)
  • Как внедрить оповещения о местоположении на основе геоданных на iOS?
  • Регистрация для Push-уведомлений в Xcode 8 / Swift 3.0?
  • Push-уведомления не работают должным образом, когда приложение не активно (убито)
  • Нет сертификатов, доступных для обеспечения портала, создания сертификата
  • xcode 8.0 "добавьте предупреждение Push Notif (..) в свой идентификатор приложения", но уже добавлено
  • Как использовать уведомления Apple Push для обновления Passbook
  • Могу ли я получить информацию об уведомлении (apn)
  • Повторное использование запроса на подписание сертификата для службы Apple Push
  • как правильно отправлять push-уведомления
  • Interesting Posts

    ioS Google map v2 не работает – мое местоположение не может быть получено

    IOS 6.1 с ARC-классом из XIB не получает Deallocated, UIClassSwapper

    Скопировать объекты с дополнительными элементами, включая «ограничения», используя конструктор интерфейса – iOS

    Есть ли способ сделать Xcode 7.3 и выше поддерживать распределенную сборку между несколькими устройствами Mac?

    Чтение info.plist: предполагается, что имеет тип AnyObject, который может быть неожиданным

    Более быстрая альтернатива glReadPixels в iPhone OpenGL ES 2.0

    Как предоставить мое устройство iOS для разработки?

    Itunes Connect: не вижу сборки

    'Int' не идентичен 'String.Index'

    Загрузка на S3, в iOS или в Node.js

    Сделать полноэкранный режим просмотра с помощью CGRectMake

    типа в объективе-c, (NSInteger) VS. integerValue

    Бесплатные растровые изображения для пользовательских кнопок и слайдеров iOS?

    Objective-C: Как получить доступ к родительским личным свойствам из подклассов?

    Как включить только фреймворк при создании устройства, а не iOS Simulator?

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