Не удается получить 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)
Я попытался найти эту ошибку, но мне не повезло найти что-либо. Я не уверен, что это проблема, из-за которой мое приложение не получает никакого нажатия от тем.
- Есть ли способ исправить push-уведомление для ios 10 с помощью xcode 7.3.1 и swift 2.2?
- Как показать «Хочу отправить вам Push Notifications» Alert View еще раз?
- iOS - проверьте поддержку push-уведомлений в приложении
- Служба уведомлений Bluemix Push Notwork больше не работает?
- iOS. Невозможно использовать сертификат APNS для создания нового профиля подготовки.
Кто-нибудь имеет эту проблему и знает, как ее решить?
- Создание GCM для устройства iOS в фоновом режиме
- Можем ли мы отправлять push-уведомления APN с устройства iOS?
- iOS Push Notification - JavaPNS - безопасность файла keystore.p12
- Удаленное уведомление iOS UIBackgroundMode не работает на 4G
- Отправка Push-уведомления от одного пользователя другому пользователю с помощью Parse
- Получение push-уведомлений в фоновом режиме iOS
- Обнаруживать, какой программный сертификат уведомления о выпуске или выпуске используется в программном
- Push-уведомления с Firebase и Swift
Похоже, возможно, вы слишком рано 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