React Native应用上传App Store后iOS推送不生效如何解决
问题根因
Ad-hoc签名(diawi分发属于这类)下推送正常、App Store正式版推送失效是iOS推送的典型环境配置错误:iOS APNs推送分沙箱、生产两套完全隔离的环境,开发/Ad-hoc包走沙箱环境,App Store/TestFlight包走生产环境,两套环境的证书、网关、device token完全不通用,只要有一处配置混用就会出现正式版推送失效。
修复步骤
按以下优先级逐一排查:
- 检查推送证书与环境匹配
- 确认推送服务端为正式版App配置的是生产环境APNs证书,证书同时包含公钥和私钥,未过期,没有混用沙箱开发证书。
- 不要在@react-native-community/push-notification-ios的端上代码里硬编码沙箱环境配置,该库会在Release构建时自动切换到生产环境。
- 校验苹果开发者后台配置
- 登录苹果开发者账号,找到对应App的App ID配置,确认Push Notifications能力下的生产环境SSL证书状态为有效,若已过期或未配置,重新生成生产推送证书。
- 重新生成App Store类型的描述文件(mobileprovision):开启推送能力后必须更新描述文件,旧描述文件不会包含推送权限配置,打包后会缺失推送entitlements。
- 检查Xcode项目配置
- 打开iOS原生项目,选中主target进入Signing & Capabilities页,确认Release构建模式下已添加Push Notifications能力,同时在Background Modes中勾选Remote notifications选项。
- 检查项目的.entitlements配置文件,确认Release环境下
aps-environment字段值为production,正确配置参考:<key>aps-environment</key> <string>production</string> - 若使用自动签名,确认Xcode拉取的是更新后的App Store描述文件,不要使用缓存在本地的旧描述文件。
- 排查服务端推送逻辑
- 确认服务端给正式版用户发推送时,请求的是APNs生产网关地址,不要请求沙箱网关地址。
- 确认服务端区分存储沙箱、生产环境的device token:两套环境下发的device token完全不通用,沙箱token在生产网关发推送会直接被判定为无效。
- 验证方式
- 优先打TestFlight包做验证:TestFlight运行环境和App Store正式版完全一致,如果TestFlight包推送正常,说明端上配置无问题,故障点在服务端的环境判断逻辑;如果TestFlight包也无法收到推送,优先重新校验证书和entitlements配置。
内容的提问来源于stack exchange,提问作者Rohit Aggarwal
相关产品推荐
相关产品推荐

