在应用程序初始启动后,如何快速检索 Firebase Cloud Messaging 的消息传递令牌?

Posted

技术标签:

【中文标题】在应用程序初始启动后,如何快速检索 Firebase Cloud Messaging 的消息传递令牌?【英文标题】:How do you retrieve the messaging token for Firebase Cloud Messaging in swift after the initial boot of the app? 【发布时间】:2021-02-02 01:54:39 【问题描述】:

我正在努力将 Firebase Cloud Messaging 集成到我的 ios 应用 (swift)。在遵循文档和一些教程之后,如果用户登录,我可以注册令牌并将其打印到日志中,并将其保存到我的数据库中。如果在用户登录之前发生这种情况,要么是因为他们必须注册一个新帐户或这是全新安装并且他们尚未登录,当我们找到令牌然后尝试使用 nil 用户将其写入数据库时​​,应用程序将在启动时立即崩溃。这很容易通过检查 nil 用户来避免,这在我的 AppDelegate 的以下代码中表示

  func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) 
    print("Firebase registration token: \(String(describing: fcmToken))")
    
    let dataDict:[String: String] = ["token": fcmToken ?? ""]
    NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)

    if FirebaseAuth.Auth.auth().currentUser != nil
        //  Write to the database
     else 
        //  Save the token outside appDelegate to then update DB after sign in?
    
  

我试图在 else 中解决我的问题,但没有成功,但我仍然认为这将是一个创可贴修复,这触及了我问题的核心:如何在此之外访问令牌功能?我看到包含的文档中的代码

    let dataDict:[String: String] = ["token": fcmToken ?? ""]
    NotificationCenter.default.post(name: Notification.Name("FCMToken"), object: nil, userInfo: dataDict)

这意味着我可以从任何地方访问 dataDict。如何从 appDelegate 之外的某个地方访问 dataDict?或者如何直接从 appDelegate 外部访问 fcmToken?

感谢您的宝贵时间!

更新

接受的答案有效,对类型转换进行了一些调整。这是工作代码。在我的代码库中几乎任何地方添加这一行都会找到令牌

        NotificationCenter.default.addObserver(self, selector: #selector(getNotification), name: Notification.Name(rawValue: "FCMToken"), object: nil)

调用这个函数(选择器),我可以在其中存储令牌的值,将其打印到日志中,或者在我的情况下用它的值更新我的数据库。


    @objc func getNotification(_ notification: NSNotification)
        guard let tokenDictionary = notification.userInfo as! [String:Any]? else 
            return
        
        let token: String  = tokenDictionary["token"] as! String
        print("Got TOKEN \(token)")
        // Do Stuff with token here
    

【问题讨论】:

【参考方案1】:

这意味着那里有一个听众,比如

NotificationCenter.default.addObserver(self, selector: #selector(getNotification), name:Notification(name: "FCMToken"), object: nil)

在另一个 VC 的 viewDidLoad 或其他地方

@objc func getNotification(_ notification:NSNotification)
    print(notification.userInfo)

这里的一种常见做法是将其保存在用户默认值中,并在需要时在任何地方访问它,确保当时它可能是 nil,只有一种方法可以解决这个问题,如果它是 nil,则在每次运行应用程序时更新令牌服务器

【讨论】:

谢谢!这行得通,用您建议的编辑更新了我的问题。再次感谢!

以上是关于在应用程序初始启动后,如何快速检索 Firebase Cloud Messaging 的消息传递令牌?的主要内容,如果未能解决你的问题,请参考以下文章

超级快速的 AVPlayer 初始化或如何在后台启动它?

如何在主活动中正确检索片段中的视图

主页按钮后如何返回初始屏幕?可以说模拟重新启动

启动第二个视图控制器后如何关闭父视图控制器?

在magento中成功支付paypal后检索数据

覆盖 Firebase 应用的 DefaultInstance。重新初始化:java.lang.IllegalStateException:FirebaseApp 被删除