如何用自身APNs密钥向不同PassTypeID的Apple Wallet Pass发推送通知
Apple Wallet Pass跨账号APNs推送的正确流程
核心误解澄清
你对PassKit的运作逻辑理解有误:PassKit是苹果官方系统级服务,它本身就是APNs推送的发起方之一,不需要第三方提供APNs密钥——当你通过PassKit更新Pass时,实际是苹果服务器代为完成推送,而非你的应用直接调用APNs接口。
跨账号推送的限制与解决方案
苹果的APNs密钥是与开发者账号绑定的,每个密钥只能用于推送该账号下注册的主题(PassTypeID本质就是APNs主题)。这就是你遇到TopicDisallowed错误的原因:你的APNs密钥无权推送其他开发者账号的PassTypeID主题。
要实现给用户提供的PassTypeID对应的设备发推送,有两种可行方案:
- 方案一:让用户提供其开发者账号的APNs密钥
你需要用户上传对应PassTypeID所在开发者账号的APNs密钥,用这个密钥来推送该PassTypeID作为主题的通知。这是最直接的合规方式,符合苹果的权限逻辑。 - 方案二:通过苹果的Pass更新服务间接触发推送
你不需要直接调用APNs,而是通过苹果的Pass更新机制间接触发推送:- 当需要更新Pass时,你的后端基于创建Pass时配置的
webServiceURL,向苹果的Pass更新接口发送变更请求 - 苹果会验证请求的合法性(基于你创建Pass时使用的用户开发者证书)
- 由苹果服务器负责向绑定该Pass的设备发送APNs推送,触发Pass更新
- 当需要更新Pass时,你的后端基于创建Pass时配置的
关于aioapns库的使用说明
如果坚持直接调用APNs接口,必须满足两个条件:
- 使用的APNs密钥属于目标PassTypeID所在的开发者账号
- 推送时的
topic参数严格设置为该PassTypeID
内容的提问来源于stack exchange,提问作者Kamil Haładyn
相关产品推荐
相关产品推荐

