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