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,依托一个或几个系统常驻进程运作,是全局的(接管所有应用的消息推送),可看作是独立于应用之外,设备与苹果的服务器之间维持一个长连接进行消息传递。
主要流程为:
- 服务器端将消息先发送到苹果的APNs;
- 由苹果的APNs将消息推送到客户的设备端;
- 由iOS系统将接收到的消息分发给相应的App。
2、详细过程
过程如下:
- 首先是设备与APNS Server建立连接;
- APP首次启动向APNS Server注册deviceToken。APNS Server返回deviceToken给APP;
- APP将deviceToken发送给PUSH服务端程序;
- 服务端程序向APNS服务发送消息;
- 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