iOS推送通知未收到但Azure推送遥测显示‘Success’,如何进一步排查?
从你给出的Azure遥测结果来看:
return (<ApnsOutcomeCounts><Outcome><Name>Success</Name><Count>1</Count></Outcome></ApnsOutcomeCounts> )
这说明Azure已经成功把推送给到了APNs服务器,所以问题基本可以排除后端连接、证书有效性这些环节(你已经更新了最新证书,这点很棒),大概率出在设备端或者应用的本地配置/代码逻辑上。下面是我整理的针对性排查步骤:
先确认推送令牌是否有效且最新
用户重装应用、重置设备,甚至系统更新后,旧的APNs令牌可能会失效,但如果后端还在复用旧令牌发推送,就会出现“后端显示成功,但设备收不到”的情况。你可以在应用每次启动时,重新获取令牌并上报给后端,确保发送用的是当前设备的有效令牌。另外检查下后端存储的令牌格式——必须是64位的十六进制字符串,不能有空格、换行或者其他多余字符。再仔细核对设备端的通知权限细节
虽然你说已经获取了所有权限,但还是要抠细节:- 打开设备「设置」>「你的应用」>「通知」,确认「允许通知」是开启状态,同时「锁定屏幕」「通知中心」「横幅」这些展示选项都没被关掉;
- 如果是iOS 15及以上版本,别忘了检查「专注模式」——有没有把你的应用加到了「静音通知」的列表里,或者当前启用的专注模式直接屏蔽了所有通知。
用Xcode查看设备的APNs实时日志
拿测试设备连接Xcode,打开「Window」>「Devices and Simulators」,选中你的设备后点击「Open Console」。然后发送测试推送,在控制台里搜索「apns」关键词,就能看到设备接收推送的全流程日志。如果有失败,日志里会明确给出原因——比如Invalid token(令牌无效)、Failed to display notification(通知展示失败)之类的,这些是最直接的排查线索。分场景测试不同类型的推送
APNs支持多种推送类型,你可以分别测试:- 发送带
alert字段的普通通知,看设备是否弹出横幅/声音提醒; - 发送带
content-available: 1的静默推送,然后在Xcode调试面板里看应用的didReceiveRemoteNotification方法是否被触发(前提是应用后台模式已经勾选了「远程通知」)。
如果某一类能收到另一类不行,那基本就是应用的推送处理逻辑有问题。
- 发送带
检查应用的推送回调代码是否正确实现
重点看这几个地方:- 如果你用了iOS 13+的SceneDelegate,要确保
scene(_:didReceiveRemoteNotification:)方法正确处理了通知(别只在AppDelegate里写逻辑); - 确认
didRegisterForRemoteNotificationsWithDeviceToken方法里,获取令牌的代码没有错误——比如把Data转成字符串时,有没有用正确的格式(别直接转成UTF8字符串,要用十六进制编码); - 静默推送需要同时满足两个条件:
content-available设为1,且项目的「Background Modes」里勾选了「Remote notifications」(在Xcode的Signing & Capabilities里设置)。
- 如果你用了iOS 13+的SceneDelegate,要确保
切换网络环境测试
有些企业内网、VPN会屏蔽APNs使用的TCP 5223端口,导致设备收不到推送。你可以让测试设备切换到手机蜂窝网络,或者普通家用WiFi,再发测试推送试试——如果换网络后能收到,那就是网络环境的问题。
内容的提问来源于stack exchange,提问作者Questioner

