APNs简述

Apple Push Notification server(APNs),即苹果推送通知服务。

APNs出现需求

由于移动设备内存、CPU、电池容量等各种因素,iOS不允许APP进程常驻后台(时限大概为10min)。

当用户主动关闭APP或后台APP进入后台达到限定时长后,意味着该APP进程的结束,在一定程度上保证了手机的流畅度与使用时长。但这也同时意味着服务器无法主动和用户交互(如实时推送消息),为了解决这个限制,苹果推出了APNs,允许设备和服务器分别与苹果的推送服务器保持长连接状态。

iOS通知

iOS通知分为本地通知和远程通知两类,APNs是远程通知功能的核心。

本地通知

由本地应用触发,一般是基于时间的通知形式,如闹钟、日历、待办事项等。

远程通知

通过自建服务器推送消息的通知形式。

APNs推送流程

苹果官方APNs概述:Local and Remote Notification Programming Guide: APNs Overview (apple.com)

以下为APNs推送流程图:

img

  • Provider:自建应用服务器
  • APNs:苹果APNs推送通知服务器
  • Device:苹果设备
  • Client App:应用

大致流程可分为以下4点:

  1. 苹果设备安装应用后会向APNs服务器进行注册,注册成功后APNs服务器返回一个deviceToken,且二者之间会维持一个基于SSL协议的TCP流通讯的长连接。
  2. 拿到deviceToken后设备会将其发送至自建应用服务器
  3. 有消息需要被推送时,自建服务器会将消息按指定格式结合deviceToken一并打包发送给APNs
  4. APNs将新消息推送至设备,并在设备屏幕上显示出来(因为设备和服务器之间维持了一个长连接)

结合上述过程可以发现,真正完成推送的是APNs服务器,消息一定是由APNs服务器推送给我们的设备,自建应用服务器只是将需要推送的消息告诉APNs服务器。至于如何维护消息队列或如何保证消息能被推送到指定设备上,这些功能都是由APNs实现的。

deviceToken

deviceToken是一个APP安装在设备上的唯一标识符,一个APP在不同设备上的deviceToken不同,同一台设备重新安装同一个APPdeviceToken也会不同。

项目代码AppDelegate中有一个回调方法,当APNs注册成功后通过该回调方法可以获取到返回的deviceToken

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

APNs拿到这个包之后会验证包结构是否正确,验证无误后会提取其中的消息,再将消息推送至指定设备。

消息体结构如下:

{
	"aps":{
		"alert":{	// 显示在用户设备上的推送标题内容
			"title":"Test Request",
			"body":"This is a test msg.",
		},
		"badge":5,	// 显示的数量(整形类型),是在应用icon右上角显示的数量,提示有几条未读信息
		"sound":"default"	// 推送消息声
	}
}

其实这就是一个JSON结构体,上述代码只是一种简单消息体,详情可见苹果官方文档:Local and Remote Notification Programming Guide: Creating the Remote Notification Payload (apple.com)

安全架构

APNs用连接信任(connection trust)和token信任(token trust)来控制通信入口。

连接信任

连接信任主要有两个作用:

  1. 保证APNs连接的服务器是苹果已同意允许进行通信的服务器。
  2. 保证APNs连接设备的合法性,由APNs处理。

我们所需要完成的工作就是处理服务器和APNs之间的连接安全性。

服务器与APNs之间的连接信任

每个服务器必须有一个唯一的provider证书和私钥,均用于验证连接,其中provider证书需在苹果开发者官网申请。

服务器通过TLS验证和APNs进行连接,过程为四步握手:

740Ngv.jpg

  1. 初始化TLS连接,即服务器给APNs发送请求。
  2. APNs服务器向服务器返回APNs证书,即公钥。
  3. 服务器端收到后生成provider证书并返回给APNs
  4. APNs收到验证后即可建立TLS连接,但并不是使用HTTPS,而是HTTP/2

常见问题

从设备卸载应用后如何处理推送消息

当我们卸载应用后便不会再收到推送消息,也就是说APNsProvider得知用户已卸载了应用,那么这个过程是怎么实现的呢?

这是通过利用苹果提供的反馈服务(Feedback Service),它是APNs的一部分,APNs会持续更新Feedback Service列表,当Provider将信息发给APNsAPNs再将消息推送到设备时,若设备无法将消息推送给指定应用,则会向APNs返回一个反馈信息,而这个反馈信息就记录在Feedback Service中。对于这种机制,Provider应该定时检测Feedback Service列表,然后删除在自己数据库中记录的deivce Token,从而判断应用已卸载的情况。

在连接Feedback Service的过程中,同样使用长连接方式,连接成功之后会直接接收由APNs传输给我们的反馈列表,传输完成后就会断开连接,然后根据最新的反馈列表更新应用服务器数据库。

文章许可:本文采用CC BY-NC-SA 4.0许可协议,转载请注明出处。