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

pvcm50d1  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(180)

我按照谷歌在www.example.com上的教程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)

我已经尝试搜索此错误,但没有找到任何结果。我不确定是否是这个问题导致我的应用程序无法接收来自主题的任何推送。
有没有人遇到这个问题,知道如何解决它?

1l5u6lss

1l5u6lss1#

看起来你打电话给subscribeToTopic太早了。
首先,在设置任何Firebase调用之前,请确保调用

FIRApp.configure()

这将确保正确设置和初始化所有Firebase服务。
接下来,你需要稍等片刻才能订阅主题。你的客户端需要先在苹果推送通知和FCM上注册你的应用,以确保它能收到通知。这涉及到网络呼叫,这意味着你不能在应用第一次启动时订阅主题。
相反,我建议将该代码放入application:didRegisterUserNotificationSettings处理程序中。

- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
  NSLog(@"Hooray! I'm registered!");
  [[FIRMessaging messaging] subscribeToTopic:@"/topics/cool_users"];
}

编辑:和斯威夫特版本...

func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
  print("Hooray! I'm registered!")
  FIRMessaging.messaging().subscribeToTopic("/topics/swift_fans")
}
20jt8wwn

20jt8wwn2#

accepted solution对我不起作用。当调用application:didRegisterUserNotificationSettings:时,该标记并不总是可用的。例如,如果应用程序是新安装的,并且是第一次启动,FIRInstanceID.instanceID().token()将返回nil。
您需要确保应用程序在令牌可用后调用subscribeToTopic:。我最后创建了一个helper对象,该对象将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所述)
  • 请确保为应用的调试和App Store发布使用不同的配置plist。请参阅FIRApp.configureWithOptions(_:)文档。
  • 日期和时间应是当前日期和时间,否则令牌可能无法传送。
  • 请确保使用最新的框架版本。我在2017年1月左右发布的SDK的通知交付方面遇到了问题。
to94eoyn

to94eoyn3#

我的问题在之后呼叫subscribeToTopic仍无法解决
func application(application: UIApplication, didRegisterUserNotificationSettings notificationSettings: UIUserNotificationSettings) {
相反,它是通过在

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

当您从APNS而不是firebase获取推送令牌时,将调用此函数。
Xcode 8.3.2版本
雨燕3.0

相关问题