无法从Firebase 3.2.0主题接收iOS上的推送通知

时间:2016-05-31 15:23:45

标签: ios push-notification firebase swift2

我按照https://firebase.google.com/docs/notifications/ios/console-topics#receive_and_handle_topic_messages上的谷歌教程在我的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) 

我试图搜索此错误,但没有找到任何运气。我不确定这是否是导致我的应用程序无法接收任何主题推送的问题。

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

3 个答案:

答案 0 :(得分:34)

看起来你可能过早地打电话给subscribeToTopic

首先,在设置任何Firebase呼叫之前,请务必致电

FIRApp.configure()

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

接下来,您需要稍等一下才能订阅主题。您的客户需要首先使用APN和FCM注册您的应用程序,以确保它可以接收通知。这涉及网络呼叫,这意味着您无法在应用首次启动时订阅主题。

相反,我建议将该代码放入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")
}

答案 1 :(得分:6)

accepted solution对我不起作用。调用application:didRegisterUserNotificationSettings:时,令牌并不总是可用。 例如,如果应用程序是新安装的并且第一次启动FIRInstanceID.instanceID().token()则返回nil。

您需要确保在令牌可用后{@ 1}} 应用程序调用。 我最终创建了一个帮助对象,它将subscribeToTopic:subscribeToTopic:调用队列,并在令牌到达后以FIFO顺序执行它们。

unsubscribeFrom:

TokenReadyOperation等待,直到出现令牌。 AsynchronousOperation用作最小化样板的基类。

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

要记住的事情很少:

  • 应用必须先拨打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(),然后再拨打任何Firebase(提及Todd Kerpelman
  • FIRApp.configureWithOptions(_:)subscribeToTopic:不是线程安全的,必须在主线程上执行
  • 主题名称必须位于&#34; / topics / *&#34;格式(提及henmer
  • 确保使用不同的配置plist进行应用的调试和App Store发布。请参阅unsubscribeFrom:文档。
  • 日期&amp;时间应该是最新的,否则令牌可能无法送达。
  • 请务必使用the newest framework version。我在2017年1月左右发布的SDK中发布了通知问题。

答案 2 :(得分:2)

之后调用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