Firebase FCM 和订阅主题说明

问题描述

#1 一旦 didReceiveRegistrationToken 获取 fcmToken 如何将其保存到云消息传递,我就感到困惑。我在文档中找不到简单的答案。我通过调用 UserService.updateChildS(child: "userToken",childVal: fcmToken) 将令牌保存到数据库中,这样我就可以向每个用户发送推送通知

    Database.database().reference().child("allUsers").child(toId).child("userToken").observeSingleEvent(of: .value,with: { (snapshot) in
        if let toToken = snapshot.value as? String {
            if toToken != "" {
                PushNotifications.sendMessagetouser(to: toToken,title: "Some title",body: properties["text"] as! String)
            }
        }
    })

struct PushNotifications {
    static func sendMessagetouser(to token: String,title: String,body: String) {
        print("sendMessagetouser()")
        let paramString: [String : Any] = ["to" : token,"notification" : ["title" : title,"body" : body,"sound": "default"]]
        sendMessage(paramString: paramString)
   }

但我仍然想知道应用委托中的哪一步将注册的令牌发送/推送/添加到云消息传递,以便 sendMessagetouser 实际工作。

应用委托的一部分

extension AppDelegate : MessagingDelegate {
    func messaging(_ messaging: Messaging,didReceiveRegistrationToken fcmToken: String) {

        if let _ = Auth.auth().currentUser,let userData = UserDefaults.standard.object(forKey: Constants.UserDefaults.currentUser) as? Data,let user = try? JSONDecoder().decode(User.self,from: userData) {
            User.setCurrent(user)
            UserService.updateChildS(child: "userToken",childVal: fcmToken)
        } else {
            UserDefaults.standard.set(fcmToken,forKey: "fcmToken")
        }

    }
    func messaging(_ messaging: Messaging,didRefreshRegistrationToken fcmToken: String) {
        UserService.show(forUID: User.current.uid) { (user) in
            if let user = user {
                for group in user.groups {
                    Messaging.messaging().subscribe(toTopic: group.trimmingCharacters(in: .whitespaces)) { error in
                        
                    }
                }
            }
        }
        UserService.updateChildS(child: "userToken",childVal: fcmToken)
    }
}

#2 我为用户订阅主题,以便他们可以获得群聊通知。用于为用户订阅主题的令牌是否与上面的 fcmToken 相同?因为我在想如果它发生变化,我需要使用 didRefreshRegistrationToken 中刷新的注册令牌为用户订阅他们现有的聊天,对吗?

解决方法

应用委托中的哪一步将注册的令牌发送/推送/添加到云消息传递,以便 sendMessageTouser 实际工作。

在以任何方式调用您的代码之前,令牌实际上已发送到 FCM。只有在 FCM 知道令牌后,才会调用您的代码,以便您也可以注册它。