APNs简介

本贴最后更新于 3129 天前,其中的信息可能已经时移世改

 

一、介绍

APNs(Apple Push Notification Service)是苹果提供的“远程通知(Remote notification)”服务,用于对苹果设备(IOS、OS X、tvOS)发送通知(这些设备上安装了你的App)。

 

二、基本概念

通信结构

每个设备通过长连接连接到APNs服务器,当通知到来,会反馈给用户:哪个App、通知的数目、通知的内容甚至声音等。需要你自己的服务器(APNs中称为Provider)构造消息,和APNs服务器保持链接,并调用APNs 的API,APNs负责将消息转发到具体用户。看个图就明白了:

 

A remote notification from a provider to a client application

                                          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

 

具体安全机制:https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW3

 

通信协议

2015年,苹果升级了APNs服务,使用基于HTTP/2的新协议,取代之前的二进制协议。简化了一些操作,而最大的改进是,能够知道通知是否成功完成(显然是因为HTTP是同步请求)。苹果建议新的App使用新协议。

 

 

Feedback Service

对于使用旧协议来说,如果目标设备没有安装你的App,会被Feedback Service加入到失败列表,你可以请求Feedback Service,获取列表决定下次不再发送以减轻Provider服务器负载。

Feedback Service说明:https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Appendixes/BinaryProviderAPI.html#//apple_ref/doc/uid/TP40008194-CH106-SW4

 

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

 

四、参考

APNs官方文档:https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

APNs Payload:https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/TheNotificationPayload.html

 

相关帖子

1 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • ScienJus

    notnoop 这个更新速度确实太坑了,javapns 当年就说有很多坑。剩下可以选择的看来只有 dbay-as-for-java 和 pushy 了。这两种有人用过么?可不可以交流一下?