iOS开发:对苹果APNs远程推送原理的理解
Posted wuwuFQ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发:对苹果APNs远程推送原理的理解相关的知识,希望对你有一定的参考价值。
本篇是对APNs推送原理的一个理解,希望看完后,能让你掌握一个知识点。
APNs
是Apple Push Notification Service
的缩写,也就是苹果的推送服务器。
远程通知的传递涉及几个关键组件:
- 您公司的服务器或第三方服务商,称为提供商服务器
- Apple 推送通知服务 (APNs)
- 用户的设备
- 您的应用在用户设备上运行
我们要实现一个消息的推送,大概分两步:注册推送 和 推送消息。
注册推送
- 启动APP时,通常会去请求推送权限,当用户点击允许后,手机就会拿着设备标识、推送证书发送给
APNs服务器
,苹果收到这些信息后,会根据推送证书、设备标识、APP信息去验证是否具有推送权限,如果有推送权限,苹果会将这台设备信息放入推送列表中。 - 在苹果通过权限校验后,会根据设备标识和APP标识生成一个
deviceToken
,并将这个deviceToken
返回给APP。 deviceToken
送达手机后,,则将deviceToken
直接传给自己的服务器即可;如果是接入了第三方SDK,则传给第三方服务商的后端,后续的推送由第三方完成。
推送消息
- 当服务器有消息需要推送给APP时,服务器会携带推送证书和推送的消息体去通知
APNs
APNs
收到需要推送的消息后,对携带的证书进行鉴权,如果通过,则根据APNs
的推送规则,将消息下发给手机。- 当手机收到来自苹果的推送消息后,在展示前会先判断开发者是否有实现推送消息拦截,如果没有,则直接展示;如果有实现拦截,则交给开发者处理。
以上就是整个推送的大概流程,接下来我们梳理下细节:手机怎么和APNs
建立连接的?服务器怎么和APNs
建立连接的?deviceToken
会过期吗?
设备向APNs注册应用程序
与 Apple 推送通知服务 (APNs) 通信并接收一个唯一的设备令牌来标识您的应用程序。
设备和APNs通信的前提:
- App配置了远程推送功能
- 代码注册了远程通知
UIApplication.shared.registerForRemoteNotifications()
- 用户授权同意了远程推送
提供商服务器和 APNs 之间创建安全连接
提供商服务器和 APNs
的连接分为两种,基于令牌的连接 和 基于证书的连接。
建立与 APNs 的基于令牌的连接
基于令牌的身份验证提供了一种与 APNs
通信的无状态方式。无状态通信比基于证书的通信更快,因为它不需要 APNs
来查找与您的提供商服务器相关的证书或其他信息。
使用基于令牌的身份验证还有其他优势:
- 您可以使用来自多个提供商服务器的相同令牌。
- 您可以使用一个令牌为您公司的所有应用程序分发通知。
- 基于令牌的请求比基于证书的请求稍大,因为每个请求都包含令牌。
- 必须至少每小时使用 Apple 提供给您的提供商令牌签名密钥更新和加密您的令牌一次(苹果要求20分钟最多一次,60分钟最少一次)
基于令牌的连接可以向多个App(在一个开发者帐户下的App)发送通知,通信更快,但通知消息体较大,需要定期刷新您的令牌
第三方提供商一般使用这个方式,如极光推送等
建立与 APNs 的基于证书的连接
通过基于证书的身份验证,您可以使用提供商证书(推送证书)在您的提供商服务器和 APNs 之间建立安全连接。您可以通过您的开发者帐户从 Apple 获得此证书。
- 由于信任是在服务器级别建立的,因此各个通知请求仅包含您的有效负载和设备令牌。它们不包含身份验证令牌,这会稍微减少每个通知请求的大小。
- 您必须为每个应用程序创建单独的证书,还必须为每个应用程序的通知管理单独的 APNs 连接
基于证书的连接相对简单,通知消息体稍小,需要为每个App创建一个推送证书
设备令牌deviceToken的特性
使用 APNs 注册您的应用程序并接收全球唯一的设备令牌,这实际上是您的应用程序在当前设备上的地址。您的提供商服务器必须拥有此令牌才能向设备发送通知。
一个应用程序的设备令牌不能用于另一个应用程序,即使两个应用程序安装在同一台设备上也是如此。这两个应用程序都必须请求自己唯一的设备令牌并将其转发到您的提供商服务器。(设备令牌并不是这个设备所有的App都一样,这一点很多博客都解释错了,设备令牌是App在这个设备上的地址)
那么设备令牌会过期吗?会变化吗?
官方明确指出:当用户从备份中恢复设备、用户在新设备上安装您的应用程序以及用户重新安装操作系统时,APNs 会发出一个新令牌
当APP被卸载后,APP服务器和APNS还会向APP发送消息吗?
答案是否定的。因为APNs
有反馈机制(feedback service)。当APNs
服务器把消息推送给我们的设备,但设备无法找到APP发送给它时,就会给APNs
服务器返回一条反馈信息,记录该设备已卸载APP,无法收到推送消息,那以后就不会再给那台设备推送消息了。
参考文献:developer.apple.com
以上是关于iOS开发:对苹果APNs远程推送原理的理解的主要内容,如果未能解决你的问题,请参考以下文章