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

如何将FCM Token自动保存至Firebase Cloud Messaging

实现FCM Token自动存储方案

你提到的手动添加Token到FCM是误解——FCM本身不需要你手动维护Token,真正需要做的是把客户端获取到的FCM Token自动上传并存储到你的后端服务器,之后服务器就可以用这些Token调用FCM API给用户发通知。具体实现步骤如下:

1. 后端实现Token存储接口

先在你的后端写一个POST接口,用来接收客户端传来的FCM Token,同时建议带上用户唯一标识(比如用户ID),方便后续关联用户和Token。接口核心逻辑:

  • 接收参数:token(FCM Token字符串)、userId(可选,若你的应用有用户系统)
  • 数据库操作:如果是新用户则插入Token,若用户已有旧Token则更新为最新值,避免重复存储

示例接口伪代码(以Node.js为例):

app.post('/save-fcm-token', (req, res) => {
  const { token, userId } = req.body;
  // 假设用MongoDB存储
  User.findOneAndUpdate(
    { userId: userId },
    { fcmToken: token },
    { upsert: true, new: true },
    (err, doc) => {
      if (err) return res.status(500).send('存储失败');
      res.status(200).send('Token存储成功');
    }
  );
});

2. 客户端获取Token后自动上传

在你已有的Token获取代码中,添加上传逻辑;同时要监听Token更新(FCM Token可能因设备变更、应用卸载重装等情况刷新),更新时重新上传。

Android示例

在FirebaseMessagingService中处理:

class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        super.onNewToken(token)
        // 上传Token到后端
        sendTokenToServer(token)
    }

    // 获取初始Token的逻辑
    fun getInitialToken() {
        FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
            if (!task.isSuccessful) {
                return@addOnCompleteListener
            }
            val token = task.result
            sendTokenToServer(token)
        }
    }

    private fun sendTokenToServer(token: String) {
        // 用Retrofit/OkHttp发起POST请求到后端接口
        val retrofit = Retrofit.Builder()
            .baseUrl("你的后端域名")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        val api = retrofit.create(ApiService::class.java)
        val call = api.saveFcmToken(token, "当前用户ID")
        call.enqueue(object : Callback<Void> {
            override fun onResponse(call: Call<Void>, response: Response<Void>) {
                // 处理成功
            }

            override fun onFailure(call: Call<Void>, t: Throwable) {
                // 失败重试,可加入指数退避逻辑
                retrySendToken(token)
            }
        })
    }
}

iOS示例

在AppDelegate或专门的推送管理类中处理:

import FirebaseMessaging

// 获取初始Token
Messaging.messaging().token { token, error in
    if let error = error {
        print("获取Token失败: \(error)")
    } else if let token = token {
        sendTokenToServer(token: token)
    }
}

// 监听Token更新
extension AppDelegate: MessagingDelegate {
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        guard let token = fcmToken else { return }
        sendTokenToServer(token: token)
    }
}

private func sendTokenToServer(token: String) {
    guard let url = URL(string: "你的后端接口地址") else { return }
    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let params = ["token": token, "userId": "当前用户ID"]
    request.httpBody = try? JSONSerialization.data(withJSONObject: params)
    
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        if let error = error {
            // 失败重试
            retrySendToken(token: token)
            return
        }
        // 处理成功
    }
    task.resume()
}

3. 关键注意事项

  • 权限检查:确保客户端已经申请并获得推送权限,否则无法获取FCM Token
  • 重试机制:上传失败时加入重试逻辑(比如指数退避),避免因网络波动导致Token丢失
  • Token去重:后端存储时要保证同一个用户只保留最新的Token,避免无效Token占用资源

内容的提问来源于stack exchange,提问作者computer science

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:20:18