繁体   English   中英

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

[英]Cannot receive push notification on iOS from Firebase 3.2.0 topics

我在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) 

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

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

看起来好像你太早称之为subscribeToTopic

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

FIRApp.configure()

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

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

相反,我建议将该代码放入您的application:didRegisterUserNotificationSettings handler。 像这样的东西:

- (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:令牌可用 我最终创建了一个帮助对象,该对象将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所述)
  • 确保使用不同的配置plist进行应用程序的调试和App Store发布。 请参阅FIRApp.configureWithOptions(_:)文档。
  • 日期和时间应该是最新的,否则可能无法交付令牌。
  • 确保使用最新的框架版本 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM