簡體   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