原文地址:html
提及苹果的推送,可能不少开发人员就开始头疼了,由于实现苹果推送服务是1个比较蛋疼的事情,因而便引入了第3方推送平台,好比极光、信鸽之类的服务。
因为苹果原生APNs蛋疼的协议,导致原本很简单的1个推送服务让人望而却步。直到苹果最近的HTTP2协议的出现才有所改善。
一直以来,http2这样新潮的名字都只能出如今nodejs、go这样的编程语言中。在网上输入关键字http2,点击进去就会发现各类各样使用nodejs实现的HTTP2服务器,利用nginx版本1.9.5版本搭建HTTP2服务之类的文章。这些文章确实让人热血沸腾、激动人心。
然而,在Python中迟迟不见有任何的实现,难免以为已经落伍了。实际上,在项目过程当中更多追求的是稳定和健壮,更多关于新潮的技术只能先看看。好比最近比较火的直播节目,实际上用Python也是能够彻底实现的,并且性能仍是挺不错的。
下面是一些编程语言使用HTTP2的原生推送的实现:python
node-apn,1个基于nodejs语言的实现。nginx
apns-http2,1个基于Java语言的实现git
apns2,1个基于Go语言的实现github
而在Python中,还彻底停留在旧的Binary API的版本中,而惟一的1个HTTP2的实现PyAPNs2在Python2中不能正常的运行。不过,不要灰心,下面咱们本身动手写1个。
在这里,咱们简单的经过Python来实现如下内容:编程
原生APNs推送json
推送的异常处理api
下面咱们分别来进行说明。服务器
首先来看下官方的文档,若是你直接从百度上进行搜索而后进行点击后会发现对应的连接跳转是1个404页面,关于这个问题已经在苹果APNs推送页面丢失问题中进行说明了,其跳转后的地址以下:
而实际对应页面的地址应该以下所示:
因为苹果官方采用了HTTP2协议,相比以前的Binary API而言,能够说简化了不少内容,天然而言代码也精简了不少。
为了实现HTTP2的推送服务,咱们须要安装hyper这个库,它是1个Python实现的HTTP2的客户端,咱们能够经过pip进行安装。
而该库主要依赖于cryptography、pyOpenSSL这2个库,所以咱们须要提早安装好cython和openssl的C库开发文件。
pip install hyper
安装完成hyper后,咱们能够经过以下的方式来实现1个推送服务:
from hyper import HTTPConnection, tls token = 'xxxxxx-xxxxx-xxxx-xxxxx' payload = { 'aps': { 'alert': '测试推送', 'sound': 'default', 'badge': 1, } } headers = { "apns-topic": '证书的主题名称', } conn = HTTPConnection('api.development.push.apple.com:443', ssl_context=tls.init_context(cert='证书文件名称')) conn.request('POST', '/3/device/%s' % token, body=json.dumps(payload), headers=headers) resp = conn.get_response() d = resp.read()
能够看到,这个推送服务的核心代码只有寥寥3行就已经完成了。在这里,咱们经过HTTPConnection链接到苹果推送服务器的443端口上,而后咱们初始化推送证书。
以后咱们经过POST方法请求苹果的推送服务器,在这里须要传递要推送的设备的Token,而后推送的内容为1个JSON的格式,最后再附对应的头信息便可。
若是推送失败后,苹果的推送服务器会返回1个错误的信息。下面是1个HTTP2推送成功后的截图:
然后是Binary API推送的接口的截图:
能够看到,咱们成功的接收到了推送的消息。相比旧的Binary API接口,HTTP2的推送服务的速度快2倍以上,在测试的时候,基本上在5s内就能够收到,而旧的接口基本上等待15-30s才能够收到。
而在HTTP2协议中,主要有如下一些响应的状态码:
200,推送成功。
400,请求有问题。
403,证书或Token有问题。
405,请求方式不正确,只支持POST请求
410,设备的Token与证书不一致
更多状态码能够查阅。
上述推送服务虽然简单,可是操做起来仍是挺繁琐了,特别是错误处理这块。在这里,要感谢我隔壁哥们的辛勤付出,他对上述的代码进行了封装并进行了开源。
咱们能够经过pip直接进行安装:
pip install applepush
而后咱们只须要在代码中进行以下的调用便可:
from applepush import ApplePush apns = ApplePush('证书文件名称', 'bundle ID') resp = apns.single_push('苹果设备token', "推送内容")
而返回的结果相似以下:
{ 'status': 成功为200,错误为其它, 'headers': { 'apns-id': 苹果推送返回的UUID, }, 'data': 苹果接口返回的字符串, 'error_msg': 错误缘由,若是推送成功为None }
而后咱们根据返回的结果与实际业务进行结合。
虽然经过Python使用HTTP2来实现苹果的推送服务是1个比较简单的事情,甚至会以为比较枯燥无味的事情。
可是,若是你从Binary API到HTTP2,把这2个协议研究一遍,再把证书的签名及转换的内容过一遍,能够查看另1篇文章使用openssl实现私钥和证书的转换,或许你会收获更多。
固然,在这个过程当中还有其余一些内容,好比根据证书内容来自动实现识别推送环境(测试仍是生产),进而不一样的推送版本,以及如何嵌入C库来实现更快的HTTP2推送服务都是能够实现的。
参考文章:
https://imququ.com/post/nginx...
http://hyper.readthedocs.io/e...