You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:35:55