iOS设备间无需额外服务器通过Firebase Cloud Messaging推送通知的可行性及示例
无需额外服务器,iOS端直接通过FCM实现设备间推送
没错,现在这个需求已经可以实现了!之前Stack Overflow上的旧答案说不可行,但Firebase后续更新后开放了支持——你不需要搭建自己的服务器,只要借助Firebase Authentication获取身份令牌,就能直接调用FCM的HTTP v1 API完成iOS设备到iOS设备的推送。
下面是发送端的Swift实现示例:
前置准备
确保你的iOS项目已经集成了Firebase Auth和Messaging组件,Podfile里添加:
pod 'Firebase/Auth' pod 'Firebase/Messaging'
执行pod install后,记得在AppDelegate或SwiftUI的App结构体里初始化Firebase。
发送端核心代码
import FirebaseAuth import FirebaseMessaging import Foundation // 异步发送推送的函数 func sendDirectPush(to targetDeviceToken: String, title: String, body: String) async throws { // 1. 获取当前登录用户的ID Token,用于FCM API的身份验证 guard let currentUser = Auth.auth().currentUser else { throw NSError(domain: "DirectPushError", code: 1, userInfo: [NSLocalizedDescriptionKey: "用户未登录,请先通过Firebase Auth登录(匿名登录也可)"]) } let idToken = try await currentUser.getIDToken() // 2. 构建FCM HTTP v1请求 guard let fcmApiUrl = URL(string: "https://fcm.googleapis.com/v1/projects/你的Firebase项目ID/messages:send") else { throw NSError(domain: "DirectPushError", code: 2, userInfo: [NSLocalizedDescriptionKey: "无效的FCM API地址"]) } var request = URLRequest(url: fcmApiUrl) request.httpMethod = "POST" request.setValue("Bearer \(idToken)", forHTTPHeaderField: "Authorization") request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 3. 构造推送消息体,适配iOS的APNs要求 let messagePayload: [String: Any] = [ "message": [ "token": targetDeviceToken, // 目标设备的FCM令牌 "notification": [ "title": title, "body": body ], "apns": [ "payload": [ "aps": [ "sound": "default", "badge": 1 // 可选:设置应用角标数 ] ] ] ] ] request.httpBody = try JSONSerialization.data(withJSONObject: messagePayload) // 4. 发送请求并处理响应 let (data, response) = try await URLSession.shared.data(for: request) guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else { let errorResponse = String(data: data, encoding: .utf8) ?? "无详细错误信息" throw NSError(domain: "DirectPushError", code: 3, userInfo: [NSLocalizedDescriptionKey: "推送失败,HTTP状态码:\(httpResponse.statusCode),响应:\(errorResponse)"]) } print("推送已成功发送至目标设备!") }
关键注意点
- 替换代码中的
你的Firebase项目ID为你实际的Firebase项目ID(在Firebase控制台首页可以找到)。 - 发送端设备必须有已登录的Firebase Auth用户(匿名登录完全可以满足需求,不需要用户提供邮箱密码)。
- 目标设备的
targetDeviceToken需要提前获取(可以通过Messaging.messaging().token获取),并通过某种方式传递给发送端(比如Firebase Realtime Database、Cloud Firestore或者点对点的方式)。 - 如果遇到403权限错误,需要在Firebase控制台的IAM页面,给当前Auth用户对应的服务账号添加
Cloud Messaging > Messages Create权限。 - 确保你的iOS应用已经在Firebase控制台配置了正确的APNs证书,否则推送无法到达目标设备。
内容的提问来源于stack exchange,提问作者surToTheW
相关产品推荐
相关产品推荐

