iOS 推送与 APNs

第一个真正的问题

入职第二周,老王找到我:「iOS 用户投诉说收不到推送,特别是晚上发的消息。」

我查了一下推送日志,全是 Invalid token。可能是用户卸载了 App,或者 token 过期了。

我们用的极光推送统一封装了 iOS 和安卓,但这也意味着:我们无法直接控制推送参数,失败时只能看到极光返回的错误,看不到真正的原因。

APNs 的工作流程

Apple Push Notification service(APNs)是苹果官方的推送服务,所有 iOS App 的推送都必须经过它。

1. App 在用户设备上注册推送
2. APNs 返回一个 device token
3. App 把 token 发给我们的服务器
4. 我们的服务器用 token 通过 APNs 发送推送

关键概念:Device Token

Device token 是 APNs 分配给每个设备的唯一标识。它不是设备 ID,也不是用户 ID,而是 APNs 内部使用的标识。

Device token 可能变化:

  • 用户卸载重装 App
  • 用户恢复设备
  • 用户升级系统
  • Apple 定期更新 token

所以需要定期更新 token,并在推送失败时检测 token 是否失效。

Token 失效处理

当前表结构没有处理 token 失效的问题——同一个用户可能有多台设备,失效的 token 一直在被使用。

APNs 的反馈服务

APNs 提供反馈服务(Feedback Service),会告诉我们哪些 token 已失效。我写脚本定期查询失效 token,清理设备表。

部署后,失效 token 问题减少了 80%。

一句话

iOS 推送的核心是 APNs 与 token 管理:token 会变、会失效,要定期更新、用反馈服务清理。设备表是所有推送渠道的基础设施——下一节看安卓这个更复杂的世界。

发现内容有问题?

告诉我们哪里需要改进。