无法接收来自Firebase 3.2.0主题的iOS推送通知

我遵循https://firebase.google.com/docs/notifications/ios/console-topics#receive_and_handle_topic_messages上的Google教程,在我的iOS应用中订阅Firebase主题。

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控制台发送主题推送通知时。 我无法收到任何推送通知。 但是当我从控制台发出推送通知给用户段时,推送工作正常。 当我检查Xcode控制台时,我看到这个FIRMessaging错误。

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

我试图寻找这个错误,但没有find任何运气。 我不确定这是否是导致我的应用程序无法接收任何主题的问题。

有没有人有这个问题,并知道如何解决它?

看起来也许你打电话subscribeToTopic太早。

首先,在设置任何Firebase电话之前,请确保您致电

 FIRApp.configure() 

这将确保所有的Firebase服务都已正确设置和初始化。

接下来,您将需要稍等一点才能订阅主题。 您的客户需要先将您的应用程序注册到APN和FCM,以确保它可以接收通知。 这涉及到一个networking电话,这意味着您的应用程序第一次启动时,您不能订阅主题。

相反,我build议把这个代码放入你的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") } 

接受的解决scheme并不适合我。 当application:didRegisterUserNotificationSettings:被调用时,令牌并不总是可用的。 例如,如果应用程序是新安装的,并首次启动FIRInstanceID.instanceID().token()返回nil。

您需要确保应用程序调用subscribeToTopic:令牌可用后。 我最终创build了一个辅助对象enqueue subscribeToTopic: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一直等到令牌出现。 AsynchronousOperation被用作基类来最小化样板。

 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() } } 

几件事情要记住:

  • 在进行任何Firebase调用之前,应用程序必须调用FIRApp.configure()FIRApp.configureWithOptions(_:) )(如Todd Kerpelman所述)
  • subscribeToTopic:unsubscribeFrom:不是线程安全的,必须在主线程上执行
  • 主题名称必须以“/ topics / *”格式(如henmer提到的)
  • 确保使用不同的configurationplist进行应用程序的debugging和App Store发布。 请参阅FIRApp.configureWithOptions(_:)文档。
  • date和时间应该是最新的,否则令牌可能无法传送。
  • 确保使用最新的框架版本 。 我在2017年1月左右发布SDK时遇到了通知交付方面的问题。

我的问题没有通过调用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