FCM与iOS:同一设备上两款不同应用生成相同FCM令牌问题
同一设备同项目下iOS应用FCM令牌重复的原因及解决方案
嘿,这其实是FCM在iOS平台上的预期行为,不用担心会推错应用,我来给你把前因后果和解决办法说清楚:
为什么会生成相同的FCM令牌?
FCM令牌和APNS令牌的生成逻辑本质不同:
- APNS令牌是苹果生成的,和设备+应用Bundle ID一一绑定,所以同一设备上不同应用的APNS令牌肯定不一样。
- FCM令牌是Firebase生成的,它的作用域是设备+Firebase项目(也就是你用的Sender ID),而不是设备+项目+应用。当你在两个同属一个Firebase项目的iOS应用里,用同一个项目的Sender ID调用
FIRInstanceID.instanceID().token(withAuthorizedEntity:...)时,Firebase会把这两个应用当成同一设备上的同项目客户端,自然就返回相同的FCM令牌了。
这个设计其实是为了方便同一项目下多应用的消息管理——你既可以用同一个令牌给设备上所有同项目应用发消息,也能精准推给单个应用。
怎么确保消息不会推错?
虽然令牌相同,但完全有办法精准定位目标应用:
- 推送时指定APNS Topic:在FCM的推送请求里,给APNS payload加上
topic字段,值就是目标应用的Bundle ID。苹果的APNS服务会根据这个Topic,只把消息投递到对应Bundle ID的应用,哪怕FCM令牌是同一个。 - 用Firebase控制台推送的话,直接在「目标」选项里选具体的应用就行,控制台会自动帮你处理Topic的设置。
- 如果你的后端需要区分不同应用的令牌,存FCM令牌的时候顺便把对应的应用Bundle ID也存上,推送时根据Bundle ID匹配对应的Topic就行。
额外小提示
如果真的非要让两个应用生成不同的FCM令牌,那只能把其中一个应用迁到另一个Firebase项目里——因为FCM令牌的唯一性是基于项目和设备的,不同项目下的同一设备应用,FCM令牌肯定不一样。不过一般没必要这么做,用指定Topic的方法就足够解决精准推送的问题了。
内容的提问来源于stack exchange,提问作者Hakdo
相关产品推荐
相关产品推荐

