iOS推送APNs

iOS推送APNs

Posted by Ted on February 26, 2021

0、通知

iOS中的推送通知,主要有以下几种推送:

  • 本地通知:iOS在本地发出的通知,功能开发集成在UserNotifications.framework内,常见应用:闹钟提醒。
  • 在线推送:APP在前台时,消息通过自建的网络长连接从服务器推送到应用,常见应用:微信在前台时的消息推送。
  • APNs:APP未被唤起或者处于后台,通过苹果服务器远程推送消息给应用。
Notifications 回顾
  • iOS 3 - Apple 引入推送通知
  • iOS 4 - 引入本地通知
  • iOS 5 - 有了通知中心
  • iOS 6 - 通知中心与iCloud同步
  • iOS 7 - 后台靜默推送
  • iOS 8 - 重新設定了通知许可权,可互动通知
  • iOS 9 - 支援在通知中回复信息,Provider API 等等
  • iOS 10 - 新增了UserNotificationKit框架,整合了关于通知的方法,新增了图片音频视频等格式
  • iOS 12 - 新增了通知分组、隐式推送、通知内容拓展

1、APNs

APNs,即 Apple Push Notification Service,依托一个或几个系统常驻进程运作,是全局的(接管所有应用的消息推送),可看作是独立于应用之外,设备与苹果的服务器之间维持一个长连接进行消息传递。

img

主要流程为:

  1. 服务器端将消息先发送到苹果的APNs;
  2. 由苹果的APNs将消息推送到客户的设备端;
  3. 由iOS系统将接收到的消息分发给相应的App。

2、详细过程

img

img

过程如下:

  1. 首先是设备与APNS Server建立连接;
  2. APP首次启动向APNS Server注册deviceToken。APNS Server返回deviceToken给APP;
  3. APP将deviceToken发送给PUSH服务端程序;
  4. 服务端程序向APNS服务发送消息;
  5. APNS服务将消息发送给设备,设备转发给对应的APP。

3、APNs的安全架构

APNs使用两个“信任”来实施端到端、密码验证和身份验证:连接信任和设备令牌信任(connection trust and device token trust.)。

连接信任(connection trust)在消息Providers和APN之间、APN和设备device之间起作用。

  • 提供程序到APN的连接信任:确保提供程序和APN之间的连接仅适用于与Apple达成推送通知传递协议的公司拥有的授权提供程序。通过签名证书来保证授权。
  • APN到设备的连接信任:可确保只有授权的设备才能连接到APN来接收通知。APNs会自动强制与每个设备建立连接信任,以确保设备的合法性。

设备令牌信任(device token trust)对于每个远程通知都是端到端的。它确保仅在正确的起点(提供者)和终点(设备)之间路由通知。

deviceToken是不透明的NSData实例,其中包含Apple分配给特定设备上特定应用程序的唯一标识符。只有APN才能解码和读取deviceToken的内容。每个应用程序实例在向APN注册时都会收到其唯一的deviceToken,然后必须将token转发给它的提供者,推送通知请求中包含设备令牌;APN使用设备令牌来确保仅将通知传递给预期的唯一应用程序设备组合。

APN可以出于多种原因发行新的deviceToken:

  • 用户在新设备上安装您的应用
  • 用户从备份中还原设备
  • 用户重新安装操作系统
  • 其他系统定义的事件

4、DeviceToken

device token: APNs uses device tokens to identify each unique app and device combination. It also uses them to authenticate the routing of remote notifications sent to a device.(device token是APNs用于区分识别每个iOS设备和设备上不同app的一个标识符,还可以用于APNs通过它将推送消息路由到指定设备上)

deviceToken注意事项:

  • 获取deviceToken跟app是否申请了推送权限无关,即使是禁用了远程推送,也可以正确获取deviceToken。如果没有申请权限,会以静默推送形式呈现。

If you do not request and receive authorization for your app’s interactions, the system delivers all remote notifications to your app silently.

  • 安装应用后第一次打开APP获取deviceToken时必须联网。如果在获取时没有网络,在重新连接网络后会第一时间返回deviceToken。
  • 不需要缓存DeviceToken。如果已经生成了有效的DeviceToken,系统或有缓存,在 重新安装App、重装系统、或者从备份还原系统时,会重新生成DeviceToken并更新缓存。
  • debug环境下是向开发环境的APNs服务器申请DeviceToken,而release环境是向生产环境的APNs服务器申请的。如果环境不匹配,则会出现Bad deviceToken错误。
  • deviceToken与bundleId存在着关联。如果deviceToken与证书中的bundleId不匹配,会返回DeviceTokenNotForTopic