原文:http://52sox.com/python-use-http2-for-apns
提及苹果的推送,可能很多开拓职员就开始头疼了,由于实现苹果推送做事是1个比较蛋疼的事情,于是便引入了第3方推送平台,比如极光、信鸽之类的做事。
由于苹果原生 APNs 蛋疼的协议,致使本来很大略的1个推送做事让人望而生畏。直到苹果最近的 HTTP 2协议的涌现才有所改进。

一贯以来, http 2这样新潮的名字都只能涌如今 nodejs 、 go 这样的编程措辞中。在网上输入关键字 http 2,点击进去就会创造各种各样利用 nodejs 实现的 HTTP 2做事器,利用 nginx 版本1.9.5版本搭建 HTTP 2 做事之类的文章。这些文章确实让人热血沸腾、激动民气。
然而,在 Python 中迟迟不见有任何的实现,不免以为已经后进了。实际上,在项目过程中更多追求的是稳定和健壮,更多关于新潮的技能只能先看看。比如最近比较火的直播节目,实际上用 Python 也是可以完备实现的,而且性能还是挺不错的。
下面是一些编程措辞利用 HTTP 2的原生推送的实现:
node-apn,1个基于nodejs措辞的实现。
apns-http2,1个基于Java措辞的实现
apns2,1个基于Go措辞的实现
而在 Python 中,还完备勾留在旧的 Binary API的版本中,而唯一的1个HTTP 2的实现PyAPNs2在Python2中不能正常的运行。不过,不要灰心,下面我们自己动手写1个。
在这里,我们大略的通过 Python 来实现以下内容:
原生 APNs 推送
推送的非常处理
下面我们分别来进行解释。
文档解释
首先来看下官方的文档,如果你直接从百度上进行搜索然后进行点击后会创造对应的链接跳转是1个404页面,关于这个问题已经在苹果APNs推送页面丢失问题中进行解释了,其跳转后的地址如下:
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html
而实际对应页面的地址该当如下所示:
https://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/APNSOverview.html
由于苹果官方采取了 HTTP 2协议,比较之前的 Binary API 而言,可以说简化了很多内容,自然而言代码也精简了很多。
依赖的库
为了实现 HTTP 2的推送做事,我们须要安装 hyper 这个库,它是1个 Python 实现的 HTTP 2的客户端,我们可以通过 pip 进行安装。
而该库紧张依赖于 cryptography 、 pyOpenSSL 这2个库,因此我们须要提前安装好 cython 和 openssl 的 C 库开拓文件。
pip install hyper
实际代码
安装完成 hyper 后,我们可以通过如下的办法来实现1个推送做事:
from hyper import HTTPConnection, tlstoken = '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个 HTTP 2推送成功后的截图:
而后是 Binary API 推送的接口的截图:
可以看到,我们成功的吸收到了推送的。比较旧的 Binary API 接口, HTTP 2的推送做事的速率快2倍以上,在测试的时候,基本上在5 s 内就可以收到,而旧的接口基本上等待15-30 s 才可以收到。
而在 HTTP 2协议中,紧张有以下一些相应的状态码:
200,推送成功。
400,要求有问题。
403,证书或 Token 有问题。
405,要求办法禁绝确,只支持 POST 要求
410,设备的 Token 与证书不一致
更多状态码可以查阅。
开源的实现
上述推送做事虽然大略,但是操作起来还是挺繁琐了,特殊是缺点处理这块。在这里,要感谢我隔壁哥们的费力付出,他对上述的代码进行了封装并进行了开源。
我们可以通过 pip 直接进行安装:
pip install applepush
然后我们只须要在代码中进行如下的调用即可:
from applepush import ApplePushapns = ApplePush('证书文件名称', 'bundle ID')resp = apns.single_push('苹果设备token', \公众推送内容\公众)
而返回的结果类似如下:
{ 'status': 成功为200,缺点为其它, 'headers': { 'apns-id': 苹果推送返回的UUID, }, 'data': 苹果接口返回的字符串, 'error_msg': 缺点缘故原由,如果推送成功为None}
然后我们根据返回的结果与实际业务进行结合。
结语
虽然通过 Python 利用 HTTP 2来实现苹果的推送做事是1个比较大略的事情,乃至会以为比较呆板无味的事情。 但是,如果你从 Binary API到HTTP2,把这2个协议研究一遍,再把证书的署名及转换的内容过一遍,可以查看另1篇文章利用openssl实现私钥和证书的转换,或许你会收成更多。
当然,在这个过程中还有其他一些内容,比如根据证书内容来自动实现识别推送环境(测试还是生产),进而不同的推送版本,以及如何嵌入 C 库来实现更快的 HTTP 2推送做事都是可以实现的。
参考文章:
https://imququ.com/post/nginx-http2-patch.html
http://hyper.readthedocs.io/en/latest/
【灯塔大数据】微信"大众号先容:中国电大数据技能创新,自主研发了业内领先的“灯塔”大数据行业运用创新平台,灯塔面向市场研究、广告营销、商业地理、金融征信、人力资源等诸多行业领域,供应零售研究、消费者研究、店铺选址、精准营销、泛义征信,背景调查等做事,助力企业在大数据时期扬帆远航。
微信"大众号【灯塔大数据】关键字信息:
【IDC】 下载IDC报告原文
【六个关键词】 下载运营商大数据PPT
【大数据日】 下载演讲材料
【十月融资】下载2016年10月投融资月报
【网络安全】获取国民网络安全报告全文
【23个情由】下载《大数据让你愉快的23个情由》电子书
【思维导图】下载12种工具的获取办法
【 灯塔 】 查看更多关键字回答