多应用注册获取相同FCM Token问题咨询(含APNs设置场景)
解决同一Firebase项目下多应用FCM Token重复的问题
这个问题我之前也帮开发者排查过,同一Firebase项目下多应用出现FCM Token重复导致推送串号的情况,大概率是配置或者初始化环节出了疏漏,咱们一步步来排查解决:
1. 先确认Firebase控制台与本地配置的一致性
- 检查GoogleService-Info.plist的唯一性:每个应用必须使用Firebase控制台为其单独生成的
GoogleService-Info.plist,不能直接复制其他应用的文件。重点核对plist里的BUNDLE_ID字段,必须和当前应用的Xcode项目bundle ID完全匹配;同时确认CLIENT_ID、API_KEY这些字段在不同应用的plist里是不同的。 - APNs证书的对应关系:在Firebase控制台的每个应用设置里,确认上传的APNs推送证书(开发/生产)是对应该应用bundle ID的,不能混用其他应用的证书。
2. 代码层面的初始化与Token设置检查
- 确保Firebase初始化的正确性:每个应用在启动时必须用自己的
GoogleService-Info.plist完成Firebase初始化。如果是多target场景,要确保路径指向当前应用的plist文件,示例代码:if let plistPath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist"), let options = FirebaseOptions(contentsOfFile: plistPath) { FirebaseApp.configure(options: options) } - APNs Token设置的时机与正确性:在
AppDelegate的didRegisterForRemoteNotificationsWithDeviceToken方法中,必须确保为当前应用设置对应的APNs Token,并且要在Firebase初始化完成后执行:
不要直接使用func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // 确保Firebase已初始化 guard FirebaseApp.app() != nil else { FirebaseApp.configure() } Messaging.messaging().setAPNSToken(deviceToken, type: .prod) // 异步获取FCM Token,避免同步取值可能的缓存问题 Messaging.messaging().token { token, error in if let token = token { // 这里将token上传到服务器 print("FCM Token: \(token)") } } }Messaging.messaging().fcmToken同步取值,因为这个值可能是缓存的旧值,异步回调的方式能确保拿到最新的Token。
3. 清除设备缓存并重新测试
有时候设备上的旧缓存会导致Token复用,建议:
- 卸载所有相关的应用
- 重启设备
- 重新安装每个应用,然后分别获取FCM Token并对比,确认是否已经不同
4. 额外排查点
如果以上步骤都没问题,检查Xcode的target配置:
- 确保每个target的
Info.plist里的Bundle identifier是唯一的,没有和其他应用重复 - 确认每个target的
Build Phases里,GoogleService-Info.plist是单独添加的,不是共享的文件
按照这些步骤排查下来,基本能解决FCM Token重复的问题,因为同一Firebase项目下的不同应用,只要配置正确,FCM Token肯定是独立的。
内容的提问来源于stack exchange,提问作者MCMatan
相关产品推荐
相关产品推荐

