服务端调用FCM向iOS推送报BadDeviceToken问题咨询
问题排查结论
这个报错和你已经调通的Android侧配置无关,核心是iOS推送链路的环境/参数匹配问题,按以下优先级排查即可:
- 第一优先级:APNs环境不匹配(占这类问题的80%以上)
Firebase控制台发推送时会自动适配APNs沙盒/生产环境,但你调用的FcmSender默认走生产APNs通道:- Xcode直连调试安装的debug包,生成的是沙盒环境device token,走生产通道必然报BadDeviceToken
- TestFlight、App Store下载的正式包,生成的才是生产环境device token
你只需要在初始化FcmSettings时,根据当前App的发布渠道显式指定APNs环境即可,debug阶段设为沙盒模式,正式发布切回生产模式。
- 第二优先级:Device Token传参格式错误
不少旧版本的FcmSender封装会默认对传入的token做小写转换、特殊字符过滤,但iOS注册到FCM的device token是大小写敏感的,不要对token做任何大小写修改,仅需要调用Trim()去掉前后可能携带的空格、换行符即可,可以逐字符比对你传入代码的token和Firebase控制台测试时用的token是否完全一致。 - 第三优先级:Firebase后台iOS配置校验
进入Firebase项目设置的云消息传递页,检查iOS应用下上传的APNs认证密钥/证书是否同时覆盖了沙盒、生产环境,如果你仅上传了生产环境证书,沙盒token的推送请求也会报错——不过这个场景下Firebase控制台发推送也会失败,你目前控制台推送正常,这个问题概率极低,可以最后排查。
修正后的参考代码
// 根据当前运行环境调整IsApnsSandboxEnvironment参数 var settings = new FcmSettings { SenderId = "你配置的senderId", ServerKey = "你配置的ServerKey", // debug调试阶段设为true,正式发版设为false IsApnsSandboxEnvironment = true }; var fcm = new FcmSender(settings, httpClient); // 仅去除token前后空白字符,不做任何大小写转换、内容修改 await fcm.SendAsync(deviceToken.Trim(), notification);
内容的提问来源于stack exchange,提问作者Dark Knight
相关产品推荐
相关产品推荐

