SwiftUI+Firebase:Firestore新增文档时如何用Swift发送全量推送通知
完全可以实现,不需要Node.js开发经验,有两种实现方案可以选,你可以根据自己的应用场景挑:
方案1:直接在客户端add函数中添加推送逻辑(仅适合个人Demo使用)
这种就是你想要的直接修改现有函数的实现方式,逻辑简单,但安全风险很高,绝对不能用于线上生产环境:
- 你需要先在Firebase控制台获取到你的FCM服务端密钥
- 所有用户打开应用时自动订阅FCM的
all_users主题,后续你只要向该主题发送推送就能覆盖所有安装应用的设备 - 修改你的add函数,新增文档成功后调用FCM接口发送推送即可
参考实现代码:
import Foundation import FirebaseMessaging // 应用启动时调用一次,让当前设备订阅全员推送主题 func subscribeAllUsersTopic() { Messaging.messaging().subscribe(toTopic: "all_users") { error in if let error = error { print("订阅主题失败: \(error.localizedDescription)") } } } func add(_ card: Card) { do { _ = try store.collection(path).addDocument(from: card) // 新增成功后触发全员推送 sendGlobalPush(title: "新内容更新", body: "有新的卡片发布了,点击查看详情") } catch { fatalError("Unable to add card: \(error.localizedDescription).") } } func sendGlobalPush(title: String, body: String) { let fcmServerKey = "替换为你自己的FCM服务端密钥" guard let url = URL(string: "https://fcm.googleapis.com/fcm/send") else { return } var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("key=\(fcmServerKey)", forHTTPHeaderField: "Authorization") request.setValue("application/json", forHTTPHeaderField: "Content-Type") let payload: [String: Any] = [ "to": "/topics/all_users", "notification": [ "title": title, "body": body, "sound": "default" ], "data": ["type": "new_card"] ] guard let httpBody = try? JSONSerialization.data(withJSONObject: payload) else { return } request.httpBody = httpBody URLSession.shared.dataTask(with: request) { _, _, error in if let error = error { print("推送发送失败: \(error.localizedDescription)") return } print("推送已触发") }.resume() }
注意:这个方案需要把FCM服务端密钥硬编码在客户端代码中,应用一旦被反编译密钥就会泄露,恶意人员可以随意向你的所有用户发送推送,仅适合自己测试使用。
方案2:用Swift编写Firebase云函数(生产环境推荐)
现在Firebase云函数已经支持Swift运行时,你完全不需要写Node.js,用你熟悉的Swift语法写服务端逻辑即可,这是正式上线应用的标准实现:
- 配置好Firebase CLI,初始化云函数时选择Swift作为开发语言
- 编写云函数监听你卡片存储集合的
onCreate事件,事件触发时调用FCM向all_users主题发送推送 - 将云函数部署到Firebase服务器,后续所有新增文档的操作都会自动触发云函数发送推送,不需要修改你现有客户端的任何代码
该方案所有逻辑跑在Firebase的服务端,不会泄露任何密钥,安全性有保障,也不受客户端运行状态的影响,就算用户添加卡片后立刻退出应用,推送也能正常发送。
内容的提问来源于stack exchange,提问作者benpomeroy9
相关产品推荐
相关产品推荐

