Python使用HTTP2實現蘋果原生推送

原文地址:html

http://52sox.com/python-use-h...node

提及蘋果的推送,可能不少開發人員就開始頭疼了,由於實現蘋果推送服務是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推送成功後的截圖:

apns2.jpg

然後是Binary API推送的接口的截圖:

apns.jpg

能夠看到,咱們成功的接收到了推送的消息。相比舊的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...

相關文章
相關標籤/搜索