swift - 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 知道令牌后,才会调用您的代码,以便您也可以注册它。
推荐阅读
- three.js - 关于警告的问题:“THREE.WebGLRenderer:纹理已从 (4160x3120) 调整为 (4096x3072)。”
- pandas - 如何将 python Int16 作为 smallint 导入 PostgreSQL?
- docker - docker内部的tun接口无法从主机读取数据包
- expo - Detox v18 升级 - 应用未响应以下网络请求:(id = -1000) isReady: {}
- node.js - 无法使用无头 chrome 连接代理服务器
- java - 如何使用onResponse json函数更改android Fragment中的公共字符串值
- node.js - 在 Plesk 上更改主节点版本
- cassandra - Cassandra 和社交“取消好友”/“取消关注”
- git - 仅当 VPN 处于活动状态或在公司网络上时才让 git 使用代理
- python - SymPy 为 Eq.solve 返回 False