限時乾貨下載:添加微信公眾號「數據玩家「fbigdata」」
回復【7】免費獲取【完整數據分析資料!(包括SPSS、SAS、SQL、EXCEL、Project)!】
說起蘋果的推送,可能很多開發人員就開始頭疼了,因為實現蘋果推送服務是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推送頁面丟失問題中進行說明了,其跳轉后的地址如下:
://developer.apple.com/library/content/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html
而實際對應頁面的地址應該如下所示:
://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 庫開發文件。
實際代碼
安裝完成 hyper 后,我們可以通過如下的方式來實現1個推送服務:
fromhyperimportHTTPConnectiontlstoken='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'%tokenbody=json.dumps(payload),headers=headers)resp=conn.get_responsed=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
然後我們只需要在代碼中進行如下的調用即可:
fromapplepushimportApplePushapns=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推送服務都是可以實現的。