如何将APNS从开发环境切换到生产环境并解决BadDeviceToken错误
解决APNS生产环境BadDeviceToken 400错误的方案
核心排查与修复步骤
1. 确认设备令牌的有效性
- 生产环境和开发环境的设备令牌完全不通用,必须使用通过TestFlight或App Store安装的生产签名App获取的令牌,不能复用开发环境的旧令牌。
- 检查令牌格式:确保是64位十六进制字符,无多余空格、
<>包裹(部分设备返回的令牌会自带<>,必须清理掉)。 - 验证App端令牌获取逻辑:注册APNS时要区分环境,生产环境下触发的回调返回的令牌才是有效生产令牌。
2. 核对APNS配置与环境的匹配性
- 证书/密钥匹配:生产环境必须使用生产APNS证书或绑定生产App ID的APNS密钥,严禁混用开发环境的凭证。
- 环境地址正确:生产环境地址为
api.push.apple.com:443,开发环境为api.development.push.apple.com:443,确保代码中已切换到位。 - Entitlements配置:确认
aps-environment字段值为production,且该配置已正确打包进生产版本(可查看ipa包内的embedded.mobileprovision文件验证)。
3. NodeJS代码细节检查
以常用的node-apn库为例,重点确认以下配置:
const apn = require('apn'); // 生产环境配置示例 const options = { token: { key: 'apns-production-key.p8', // 确保是生产环境密钥文件 keyId: 'YOUR_KEY_ID', teamId: 'YOUR_TEAM_ID' }, production: true // 强制启用生产环境,避免库默认走开发环境 }; const apnProvider = new apn.Provider(options); const note = new apn.Notification(); note.expiry = Math.floor(Date.now() / 1000) + 3600; note.badge = 1; note.sound = 'ping.aiff'; note.alert = '生产环境测试推送'; note.topic = 'com.yourcompany.yourapp'; // 严格匹配App的Bundle ID // 传入的令牌必须是生产环境获取的有效令牌 apnProvider.send(note, ['VALID_PRODUCTION_DEVICE_TOKEN']) .then(result => console.log('推送结果:', result)) .catch(err => console.error('推送错误:', err));
- 务必设置
production: true,部分库默认使用开发环境,手动指定可避免环境混淆。 - 检查
topic是否与App的Bundle ID完全一致,大小写、拼写不能有任何偏差。
4. 其他潜在问题排查
- 设备状态:确保测试设备已安装生产签名的App,且设备系统设置中已允许该App推送通知。
- 令牌过期:App卸载重装后令牌会变更,需确保服务器端存储的令牌是最新的。
- 网络连通性:确认服务器能正常访问
api.push.apple.com:443,部分服务器防火墙会阻断APNS请求。
内容的提问来源于stack exchange,提问作者Tristan Newman
相关产品推荐
相关产品推荐

