企业账号开发应用:生产环境(sandbox=0)无法接收推送通知求助
嘿,这个问题我之前帮团队排查过好几次,给你列几个最核心的排查方向,按优先级来:
生产环境APNs证书未正确配置
企业账号的开发和生产推送证书是完全独立的,哪怕你开发环境的证书没问题,生产环境的可能没生成、过期,或者没部署到推送服务器上。去Apple Developer后台的「Certificates, Identifiers & Profiles」里,找到对应App ID的「Push Notifications」选项,确认Production标签下的证书是有效的(没过期、状态是Active),并且推送服务器上安装的是这个生产证书,不是开发环境的。Provisioning Profile环境不匹配
上线打包用的Provisioning Profile必须是Production类型的,不能是Development版。你可以验证一下:右键IPA包→显示包内容→找到embedded.mobileprovision,用文本编辑器打开后,搜索aps-environment字段,如果值是development,那就是用错了Profile,导致App还是连接到沙箱APNs服务器,自然收不到生产推送。APNs服务器地址配置错误
生产和沙箱环境的APNs服务器地址完全不同,sandbox=0时必须指向生产服务器:- 传统TCP接口:
gateway.push.apple.com:2195(推送)、feedback.push.apple.com:2196(设备反馈) - HTTP/2接口:
https://api.push.apple.com:443
别把生产推送请求发到沙箱服务器(api.sandbox.push.apple.com:443),这是非常容易犯的低级错误。
- 传统TCP接口:
设备Token环境不兼容
开发环境和生产环境的设备Token是不一样的!你在沙箱模式下获取的Token,放到生产环境的推送请求里是无效的。上线后必须让用户重新打开App,获取生产环境的Token,再用这个Token发起推送请求。推送权限未正确获取
哪怕是企业内部应用,iOS系统的推送权限逻辑和普通App一致:- 检查用户是否在首次打开App时允许了推送权限;
- 确认App代码里正确实现了
UNUserNotificationCenter的授权流程(iOS 10+),并且在上线包中没有遗漏这部分逻辑; - 让用户去「设置→你的App→通知」里确认推送权限已开启。
网络/防火墙限制
有些企业内部的防火墙可能屏蔽了生产APNs服务器的端口(比如443、2195),但允许沙箱服务器的访问。可以在推送服务器上用以下命令测试连通性:telnet api.push.apple.com 443如果连接失败,就得找运维团队开放对应端口。
Payload格式问题
虽然生产和沙箱环境的Payload格式基本一致,但有时候开发时的测试字段可能导致生产推送失败。确保aps字段格式正确:alert可以是字符串或包含title/body的字典;badge必须是整数;sound是有效音频文件名或default;
避免在aps里加入无效字段,自定义字段要放在aps之外。
内容的提问来源于stack exchange,提问作者user7477041

