摘要:由于蘋果原生蛋疼的協(xié)議致使本來很簡單的個(gè)推送服務(wù)讓人望而卻步。直到蘋果最近的協(xié)議的出現(xiàn)才有所改善。如果推送失敗后蘋果的推送服務(wù)器會(huì)返回個(gè)錯(cuò)誤的信息。結(jié)語雖然通過使用來實(shí)現(xiàn)蘋果的推送服務(wù)是個(gè)比較簡單的事情甚至?xí)X得比較枯燥無味的事情。
原文地址:
http://52sox.com/python-use-h...
說起蘋果的推送,可能很多開發(fā)人員就開始頭疼了,因?yàn)閷?shí)現(xiàn)蘋果推送服務(wù)是1個(gè)比較蛋疼的事情,于是便引入了第3方推送平臺(tái),比如極光、信鴿之類的服務(wù)。
由于蘋果原生APNs蛋疼的協(xié)議,致使本來很簡單的1個(gè)推送服務(wù)讓人望而卻步。直到蘋果最近的HTTP2協(xié)議的出現(xiàn)才有所改善。
一直以來,http2這樣新潮的名字都只能出現(xiàn)在nodejs、go這樣的編程語言中。在網(wǎng)上輸入關(guān)鍵字http2,點(diǎn)擊進(jìn)去就會(huì)發(fā)現(xiàn)各種各樣使用nodejs實(shí)現(xiàn)的HTTP2服務(wù)器,利用nginx版本1.9.5版本搭建HTTP2服務(wù)之類的文章。這些文章確實(shí)讓人熱血沸騰、激動(dòng)人心。
然而,在Python中遲遲不見有任何的實(shí)現(xiàn),不免覺得已經(jīng)落伍了。實(shí)際上,在項(xiàng)目過程中更多追求的是穩(wěn)定和健壯,更多關(guān)于新潮的技術(shù)只能先看看。比如最近比較火的直播節(jié)目,實(shí)際上用Python也是可以完全實(shí)現(xiàn)的,而且性能還是挺不錯(cuò)的。
下面是一些編程語言使用HTTP2的原生推送的實(shí)現(xiàn):
node-apn,1個(gè)基于nodejs語言的實(shí)現(xiàn)。
apns-http2,1個(gè)基于Java語言的實(shí)現(xiàn)
apns2,1個(gè)基于Go語言的實(shí)現(xiàn)
而在Python中,還完全停留在舊的Binary API的版本中,而唯一的1個(gè)HTTP2的實(shí)現(xiàn)PyAPNs2在Python2中不能正常的運(yùn)行。不過,不要灰心,下面我們自己動(dòng)手寫1個(gè)。
在這里,我們簡單的通過Python來實(shí)現(xiàn)以下內(nèi)容:
原生APNs推送
推送的異常處理
下面我們分別來進(jìn)行說明。
文檔說明首先來看下官方的文檔,如果你直接從百度上進(jìn)行搜索然后進(jìn)行點(diǎn)擊后會(huì)發(fā)現(xiàn)對(duì)應(yīng)的鏈接跳轉(zhuǎn)是1個(gè)404頁面,關(guān)于這個(gè)問題已經(jīng)在蘋果APNs推送頁面丟失問題中進(jìn)行說明了,其跳轉(zhuǎn)后的地址如下:
舊的官方地址
而實(shí)際對(duì)應(yīng)頁面的地址應(yīng)該如下所示:
新的官方地址
由于蘋果官方采用了HTTP2協(xié)議,相比之前的Binary API而言,可以說簡化了很多內(nèi)容,自然而言代碼也精簡了很多。
依賴的庫為了實(shí)現(xiàn)HTTP2的推送服務(wù),我們需要安裝hyper這個(gè)庫,它是1個(gè)Python實(shí)現(xiàn)的HTTP2的客戶端,我們可以通過pip進(jìn)行安裝。
而該庫主要依賴于cryptography、pyOpenSSL這2個(gè)庫,因此我們需要提前安裝好cython和openssl的C庫開發(fā)文件。
pip install hyper實(shí)際代碼
安裝完成hyper后,我們可以通過如下的方式來實(shí)現(xiàn)1個(gè)推送服務(wù):
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()
可以看到,這個(gè)推送服務(wù)的核心代碼只有寥寥3行就已經(jīng)完成了。在這里,我們通過HTTPConnection連接到蘋果推送服務(wù)器的443端口上,然后我們初始化推送證書。
之后我們通過POST方法請(qǐng)求蘋果的推送服務(wù)器,在這里需要傳遞要推送的設(shè)備的Token,然后推送的內(nèi)容為1個(gè)JSON的格式,最后再附對(duì)應(yīng)的頭信息即可。
如果推送失敗后,蘋果的推送服務(wù)器會(huì)返回1個(gè)錯(cuò)誤的信息。下面是1個(gè)HTTP2推送成功后的截圖:
而后是Binary API推送的接口的截圖:
可以看到,我們成功的接收到了推送的消息。相比舊的Binary API接口,HTTP2的推送服務(wù)的速度快2倍以上,在測試的時(shí)候,基本上在5s內(nèi)就可以收到,而舊的接口基本上等待15-30s才可以收到。
而在HTTP2協(xié)議中,主要有以下一些響應(yīng)的狀態(tài)碼:
200,推送成功。
400,請(qǐng)求有問題。
403,證書或Token有問題。
405,請(qǐng)求方式不正確,只支持POST請(qǐng)求
410,設(shè)備的Token與證書不一致
更多狀態(tài)碼可以查閱。
開源的實(shí)現(xiàn)上述推送服務(wù)雖然簡單,但是操作起來還是挺繁瑣了,特別是錯(cuò)誤處理這塊。在這里,要感謝我隔壁哥們的辛勤付出,他對(duì)上述的代碼進(jìn)行了封裝并進(jìn)行了開源。
我們可以通過pip直接進(jìn)行安裝:
pip install applepush
然后我們只需要在代碼中進(jìn)行如下的調(diào)用即可:
from applepush import ApplePush apns = ApplePush("證書文件名稱", "bundle ID") resp = apns.single_push("蘋果設(shè)備token", "推送內(nèi)容")
而返回的結(jié)果類似如下:
{ "status": 成功為200,錯(cuò)誤為其它, "headers": { "apns-id": 蘋果推送返回的UUID, }, "data": 蘋果接口返回的字符串, "error_msg": 錯(cuò)誤原因,如果推送成功為None }
然后我們根據(jù)返回的結(jié)果與實(shí)際業(yè)務(wù)進(jìn)行結(jié)合。
結(jié)語雖然通過Python使用HTTP2來實(shí)現(xiàn)蘋果的推送服務(wù)是1個(gè)比較簡單的事情,甚至?xí)X得比較枯燥無味的事情。
但是,如果你從Binary API到HTTP2,把這2個(gè)協(xié)議研究一遍,再把證書的簽名及轉(zhuǎn)換的內(nèi)容過一遍,可以查看另1篇文章使用openssl實(shí)現(xiàn)私鑰和證書的轉(zhuǎn)換,或許你會(huì)收獲更多。
當(dāng)然,在這個(gè)過程中還有其他一些內(nèi)容,比如根據(jù)證書內(nèi)容來自動(dòng)實(shí)現(xiàn)識(shí)別推送環(huán)境(測試還是生產(chǎn)),進(jìn)而不同的推送版本,以及如何嵌入C庫來實(shí)現(xiàn)更快的HTTP2推送服務(wù)都是可以實(shí)現(xiàn)的。
參考文章:
https://imququ.com/post/nginx...
http://hyper.readthedocs.io/e...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/44286.html
摘要:用局部變量存儲(chǔ)本地范圍之外的變量值,如果它們?cè)诤瘮?shù)中的使用多于一次。將它的值存入一個(gè)局部變量,消除一次搜索過程。地將此值存入一個(gè)局部變量中。 總結(jié)了一下《高性能javascript》書中比較核心的點(diǎn),并補(bǔ)充了一些點(diǎn)。 第一章 DOM標(biāo)簽 將所有 標(biāo)簽放置在頁面的底部,緊靠 body 關(guān)閉標(biāo)簽的上方。此法可以保證頁面在腳本 運(yùn)行之前完成解析。 將腳本成組打包。頁面的 標(biāo)簽越少,頁面的加...
閱讀 1768·2021-10-11 10:57
閱讀 2352·2021-10-08 10:14
閱讀 3393·2019-08-29 17:26
閱讀 3340·2019-08-28 17:54
閱讀 3020·2019-08-26 13:38
閱讀 2885·2019-08-26 12:19
閱讀 3608·2019-08-23 18:05
閱讀 1277·2019-08-23 17:04