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

如何通过Messaging didReceiveRegistrationToken回调持续更新FCM Token?

FCM Token重复生成问题及持续更新方案

我遇到FCM Token重复生成两次的情况,想知道如何通过MessagingDelegate的didReceiveRegistrationToken回调来始终保持FCM Token处于更新状态,当前代码实现如下:

extension AppDelegate: MessagingDelegate {
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {

      let deviceToken:[String: String] = ["token": fcmToken ?? ""]
        print("Device token: ", deviceToken) 

    }
}

解决Token重复生成及保持更新的方案

1. 过滤重复Token,仅在变化时同步到服务器

每次收到回调返回的Token时,先和本地存储的旧Token做对比,只有当两者不一致时,再执行上传服务器的操作,避免重复生成导致的无效同步。修改后的代码如下:

extension AppDelegate: MessagingDelegate {
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        guard let newToken = fcmToken else { return }
        
        // 从本地存储读取旧Token
        let savedToken = UserDefaults.standard.string(forKey: "SavedFCMToken")
        
        if newToken != savedToken {
            // Token发生变化,执行上传服务器逻辑
            let deviceToken = ["token": newToken]
            print("更新后的Device Token: ", deviceToken)
            // 这里添加你的服务器上传代码
            
            // 更新本地存储的Token
            UserDefaults.standard.set(newToken, forKey: "SavedFCMToken")
        }
    }
}

2. 启动时主动校验Token状态

在App启动阶段主动获取当前Token,和本地存储值做对比,确保服务器端的Token始终是最新的,避免因回调未触发导致的Token过期问题:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    FirebaseApp.configure()
    
    // 主动获取FCM Token并校验
    Messaging.messaging().token { token, error in
        if let error = error {
            print("获取FCM Token失败: \(error.localizedDescription)")
        } else if let token = token {
            let savedToken = UserDefaults.standard.string(forKey: "SavedFCMToken")
            if token != savedToken {
                let deviceToken = ["token": token]
                print("App启动时更新的Device Token: ", deviceToken)
                // 执行服务器上传逻辑
                UserDefaults.standard.set(token, forKey: "SavedFCMToken")
            }
        }
    }
    
    Messaging.messaging().delegate = self
    return true
}

3. 理解重复回调的触发逻辑

didReceiveRegistrationToken会在多种场景下触发:App首次安装启动、Token过期失效、App被重新安装、系统推送设置变更等。SDK内部的状态同步可能导致重复回调,通过本地Token对比的方式可以有效过滤这类无效触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:10:48