Python搭建APNS蘋(píng)果推送通知推送服務(wù)的相關(guān)模塊使用指南
APNS 是蘋(píng)果為IOS設(shè)備提供的推送服務(wù),全稱(chēng)是(Apple Push Notification service)。 如果你有接觸移動(dòng)互聯(lián)網(wǎng)相關(guān)的開(kāi)發(fā)的話(huà),應(yīng)該對(duì)它很熟悉。
接下來(lái)我會(huì)給大家簡(jiǎn)單介紹一下Python下的一些APNS相關(guān)的模塊以及其特點(diǎn)。
模塊介紹:
PyAPNs
項(xiàng)目地址: https://github.com/djacobs/PyAPNs
PyAPNs是我最早使用的APNS模塊,它應(yīng)該是我要介紹的所有模塊里面最簡(jiǎn)單的,最新的源碼 只有384行,實(shí)現(xiàn)了APNS的基本功能,包括發(fā)送推送、使用Frame群發(fā)推送、feedback 接口等。
它的所有驗(yàn)證都是在客戶(hù)端做的,比如每一個(gè)Payload不超過(guò)256字節(jié)。
簡(jiǎn)單來(lái)說(shuō),就是盡量復(fù)用你的鏈接,不要頻繁的建立和斷開(kāi),不然會(huì)被當(dāng)做DoS攻擊處理。所以 我們使用它來(lái)發(fā)送推送時(shí)應(yīng)該這么干:
... ... # 復(fù)用這個(gè)gateway_server apns.gateway_server.send_notification(token_hex, payload)
復(fù)用這個(gè)gateway_server也就是連接,但是到APNS Server的鏈接是很不穩(wěn)定的,很多情況下 都會(huì)被斷開(kāi),比如網(wǎng)絡(luò)原因、發(fā)送了非法的token等。所以我們還需要一個(gè)重連的機(jī)制。
但PyAPNs模塊沒(méi)有為你處理這些,所以你需要自己去處理那些出錯(cuò)的情況,這也是使用 這個(gè)模塊最不方便的地方。
所以我的建議是,除非你自己需要去寫(xiě)一個(gè)APNS的Provider,那你可以以這個(gè)模塊作為起點(diǎn)。 否則,如果你想在你的項(xiàng)目里面快速用上推送服務(wù)的話(huà),建議還是選擇別的模塊。
示例:
import time from apns import APNs, Frame, Payload apns = APNs(use_sandbox=True, cert_file='cert.pem', key_file='key.pem') # Send a notification token_hex = 'b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b87' payload = Payload(alert="Hello World!", sound="default", badge=1) apns.gateway_server.send_notification(token_hex, payload) # Send multiple notifications in a single transmission frame = Frame() identifier = 1 expiry = time.time()+3600 priority = 10 frame.add_item('b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b87', payload, identifier, expiry, priority) apns.gateway_server.send_notification_multiple(frame) # Get feedback messages for (token_hex, fail_time) in apns.feedback_server.items(): # do stuff with token_hex and fail_time 對(duì)于更復(fù)雜的alerts,比如自定義按鈕,可以使用PayloadAlert類(lèi) alert = PayloadAlert("Hello world!", action_loc_key="Click me") payload = Payload(alert=alert, sound="default")
pyapns(twisted)
項(xiàng)目地址: https://github.com/samuraisam/pyapns
他們使用的就是這個(gè)項(xiàng)目作為他們的推送服務(wù)的provider,所以我之后把推送從PyAPNs遷移到了這個(gè)項(xiàng)目, 使用下來(lái)其實(shí)還是挺不錯(cuò)的,這個(gè)項(xiàng)目的主要特點(diǎn)是:
它其實(shí)是一個(gè)基于twisted的server,所有發(fā)送推送的請(qǐng)求都通過(guò)它來(lái)和蘋(píng)果的服務(wù)器交互。
對(duì)Django和Pylons有原生支持。
支持多個(gè)APP。
因?yàn)楹吞O(píng)果的推送服務(wù)器是由這個(gè)provider維持的長(zhǎng)連接,所以你每次發(fā)送推送的時(shí)候都直接 這個(gè)provier進(jìn)行叫交互,這樣的的好處是每一次的接口調(diào)用返回都很快,真正推送到蘋(píng)果服務(wù)器的過(guò)程 則是由這個(gè)provider異步來(lái)完成。
但是這個(gè)模塊很長(zhǎng)時(shí)間都沒(méi)有維護(hù)了,其實(shí)Apple那邊的協(xié)議在這段時(shí)間里已經(jīng)進(jìn)行了一些更新。 但這個(gè)模塊沒(méi)有跟上。
我使用這個(gè)模塊碰到的最大的問(wèn)題就是 群發(fā)推送的效果得不到保證。
雖然這個(gè)模塊的demo里面有對(duì)批量發(fā)送推送進(jìn)行支持,但是我的使用經(jīng)驗(yàn)是,這個(gè)模塊的群發(fā) 推送效果比較差,而且缺少?gòu)奶O(píng)果Server拿到錯(cuò)誤反饋的邏輯。
因?yàn)門(mén)wisted的代碼風(fēng)格實(shí)在不怎么喜歡,所以我群發(fā)碰到問(wèn)題后開(kāi)始尋找別的解決方案。
apns-client
項(xiàng)目地址: https://bitbucket.org/sardarnl/apns-client/
總結(jié)一下就是:
維持持久鏈接。SSL協(xié)議的握手環(huán)節(jié)是很慢的。當(dāng)每一個(gè)連接被建立之后,它應(yīng)該一直保持最少幾分鐘來(lái)等待 下一次的推送。
支持改進(jìn)過(guò)的的協(xié)議格式。Apple的程序員們?cè)O(shè)計(jì)了一個(gè)臭名昭著的推送協(xié)議。他們更新了一個(gè)版本,這個(gè)版本可以讓你知道 每一次群發(fā)推送里面到底是哪一個(gè)單獨(dú)的消息出了問(wèn)題。
清晰的Python API
沒(méi)有把驗(yàn)證這塊寫(xiě)進(jìn)代碼里,而是直接返回APNS的錯(cuò)誤信息
使用這個(gè)模塊來(lái)發(fā)送推送也很簡(jiǎn)單:
from apnsclient import * # 可以使用Session對(duì)象來(lái)維持連接池 session = Session() con = session.get_connection("push_sandbox", cert_file="sandbox.pem") # 發(fā)送推送和得到反饋 messge = Message(["my", "device", "tokens"], alert="My message", badge=10) # Send the message. srv = APNs(con) res = srv.send(message) # Check failures. Check codes in APNs reference docs. for token, reason in res.failed.items(): code, errmsg = reason print "Device faled: {0}, reason: {1}".format(token, errmsg) # Check failures not related to devices. for code, errmsg in res.errors: print "Error: ", errmsg
對(duì)于我來(lái)說(shuō),這個(gè)模塊最大的優(yōu)點(diǎn)就是為你處理了連接有可能被異常斷開(kāi)重連的情況。而且代碼不像 pyapns這樣晦澀,更直觀(guān),可讀性更高。所以你如果要在它的基礎(chǔ)上做一些修改也沒(méi)有任何問(wèn)題。
經(jīng)過(guò)我的使用經(jīng)驗(yàn),使用apns-client來(lái)處理百萬(wàn)級(jí)別這種量級(jí)的推送沒(méi)有任何問(wèn)題,到達(dá)率也很好。
所以如果你沒(méi)有特殊的需求的話(huà),apns-client應(yīng)該是你最好的選擇。
- python實(shí)現(xiàn)京東訂單推送到測(cè)試環(huán)境,提供便利操作示例
- python獲取地震信息 微信實(shí)時(shí)推送
- python爬蟲(chóng)_微信公眾號(hào)推送信息爬取的實(shí)例
- Python編程之微信推送模板消息功能示例
- 利用Python將每日一句定時(shí)推送至微信的實(shí)現(xiàn)方法
- Python編程實(shí)現(xiàn)微信企業(yè)號(hào)文本消息推送功能示例
- 使用Python制作自動(dòng)推送微信消息提醒的備忘錄功能
- python3實(shí)現(xiàn)釘釘消息推送的方法示例
- python微信聊天機(jī)器人改進(jìn)版(定時(shí)或觸發(fā)抓取天氣預(yù)報(bào)、勵(lì)志語(yǔ)錄等,向好友推送)
- python3實(shí)現(xiàn)zabbix告警推送釘釘?shù)氖纠?/a>
- python給微信好友定時(shí)推送消息的示例
- python實(shí)現(xiàn)美團(tuán)訂單推送到測(cè)試環(huán)境,提供便利操作示例
相關(guān)文章
python+matplotlib實(shí)現(xiàn)鼠標(biāo)移動(dòng)三角形高亮及索引顯示
這篇文章主要介紹了Python+matplotlib實(shí)現(xiàn)鼠標(biāo)移動(dòng)三角形高亮及索引顯示,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01pycharm 實(shí)現(xiàn)復(fù)制一行的快捷鍵
這篇文章主要介紹了pycharm 實(shí)現(xiàn)復(fù)制一行的快捷鍵,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01Python基于gevent實(shí)現(xiàn)高并發(fā)代碼實(shí)例
這篇文章主要介紹了Python基于gevent實(shí)現(xiàn)高并發(fā)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05python圖像處理-利用一行代碼實(shí)現(xiàn)灰度圖摳圖
這篇文章主要介紹了python圖像處理-利用一行代碼實(shí)現(xiàn)灰度圖摳圖,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Python實(shí)現(xiàn)帶參數(shù)的用戶(hù)驗(yàn)證功能裝飾器示例
這篇文章主要介紹了Python實(shí)現(xiàn)帶參數(shù)的用戶(hù)驗(yàn)證功能裝飾器,結(jié)合實(shí)例形式分析了Python用戶(hù)驗(yàn)證裝飾器具體定義及使用技巧,需要的朋友可以參考下2018-12-12pytorch+sklearn實(shí)現(xiàn)數(shù)據(jù)加載的流程
這篇文章主要介紹了pytorch+sklearn實(shí)現(xiàn)數(shù)據(jù)加載,之前在訓(xùn)練網(wǎng)絡(luò)的時(shí)候加載數(shù)據(jù)都是稀里糊涂的放進(jìn)去的,也沒(méi)有理清楚里面的流程,今天整理一下,加深理解,也方便以后查閱,需要的朋友可以參考下2022-11-11tensorflow之獲取tensor的shape作為max_pool的ksize實(shí)例
今天小編就為大家分享一篇tensorflow之獲取tensor的shape作為max_pool的ksize實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python非單一.py文件用Pyinstaller打包發(fā)布成exe
第一次將自己做的python爬蟲(chóng)項(xiàng)目打包成exe,所以留個(gè)筆記,本文詳細(xì)的介紹了python非單一.py文件用Pyinstaller打包發(fā)布成exe,具有一定的參考價(jià)值,感興趣的可以了解一下2022-03-03Python實(shí)現(xiàn)字典的key和values的交換
本文給大家分別介紹了在python3.0和2.7版本下實(shí)現(xiàn)字典的key和values的交換的程序代碼,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。2015-08-08