一、介绍
APNs(Apple Push Notification Service)是苹果提供的“远程通知(Remote notification)”服务,用于对苹果设备(IOS、OS X、tvOS)发送通知(这些设备上安装了你的App)。
二、基本概念
通信结构
每个设备通过长连接连接到APNs服务器,当通知到来,会反馈给用户:哪个App、通知的数目、通知的内容甚至声音等。需要你自己的服务器(APNs中称为Provider)构造消息,和APNs服务器保持链接,并调用APNs 的API,APNs负责将消息转发到具体用户。看个图就明白了:
Pushing a remote notification from a provider to a client app
APNs中设备到APNs服务器、Provider到APNs服务器,所有通信是加密的。Provider想要调用APNs 的API,必须要提供证书(SSL certificates)以证明身份。证书相关参考:https://developer.apple.com/library/mac/documentation/IDEs/Conceptual/AppDistributionGuide/AddingCapabilities/AddingCapabilities.html#//apple_ref/doc/uid/TP40012582-CH26-SW11
通信协议
2015年,苹果升级了APNs服务,使用基于HTTP/2的新协议,取代之前的二进制协议。简化了一些操作,而最大的改进是,能够知道通知是否成功完成(显然是因为HTTP是同步请求)。苹果建议新的App使用新协议。
- 新的APNs Provider API(基于HTTP/2):https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/APNsProviderAPI.html
- 旧的Binary Provider API(基于TCP):https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Appendixes/BinaryProviderAPI.html
Feedback Service
对于使用旧协议来说,如果目标设备没有安装你的App,会被Feedback Service加入到失败列表,你可以请求Feedback Service,获取列表决定下次不再发送以减轻Provider服务器负载。
Payload
APNs Payload是通信协议中,包含具体通知内容的结构。基于json格式,是最重要的一部分了,直接关系到通知的效果,文档很详细:https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/TheNotificationPayload.html
三、Java客户端
Provider服务器和APNs服务器通信的类库,最常用的Java客户端notnoop目前看(2016-05-28)还不支持HTTP/2新协议,这跟它更新缓慢有直接关系。然而,另一个pushy项目在早在0.5版本提供了支持。
- javapns: http://code.google.com/p/javapns/
- notnoop: https://github.com/notnoop/java-apns
- pushy:https://github.com/relayrides/pushy(relayrides.github.io/pushy/)
- aerogear-unifiedpush-server:https://github.com/aerogear/aerogear-unifiedpush-server
- Apache基于notnoop的客户端:http://camel.apache.org/apns.html
- 国内一个作者:https://github.com/RamosLi/dbay-as-for-java
各个客户端差异没有深入了解,TODO
四、参考
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于