最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python搭建APNS蘋(píng)果推送通知推送服務(wù)的相關(guān)模塊使用指南

 更新時(shí)間:2016年06月02日 16:12:20   作者:piglei  
這里總結(jié)了一份Python搭建蘋(píng)果推送通知推送服務(wù)的相關(guān)模塊使用指南,包括PyAPNs、基于twisted框架的pyapns以及apns-client三個(gè)模塊的介紹,需要的朋友可以參考下

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)該是你最好的選擇。

相關(guān)文章

  • Python調(diào)用命令行進(jìn)度條的方法

    Python調(diào)用命令行進(jìn)度條的方法

    這篇文章主要介紹了Python調(diào)用命令行進(jìn)度條的方法,涉及Python進(jìn)度條的調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-05-05
  • 10個(gè)Python Itertools方法助你事半功倍

    10個(gè)Python Itertools方法助你事半功倍

    itertools模塊就是一個(gè)很好的例子,它為開(kāi)發(fā)者提供了許多強(qiáng)大的工具,可以用更短的代碼來(lái)操作Python的可迭代對(duì)象,本文主要介紹了Python中itertools高效迭代工具,感興趣的可以了解一下
    2024-04-04
  • Django定時(shí)任務(wù)Django-crontab的使用詳解

    Django定時(shí)任務(wù)Django-crontab的使用詳解

    測(cè)試平臺(tái)執(zhí)行測(cè)試用例時(shí),可以借助jenkins之類(lèi)的CI/CD工具,也可以使用定時(shí)任務(wù)crontab,作為測(cè)試開(kāi)發(fā)工程師,我們可能沒(méi)有權(quán)限去操作服務(wù)器,那么我們就只能使用django-crontab,在指定時(shí)間循環(huán)執(zhí)行測(cè)試用例,對(duì)定時(shí)任務(wù)Django-crontab的使用感興趣的朋友一起看看吧
    2022-07-07
  • Pandas使用Merge與Join和Concat分別進(jìn)行合并數(shù)據(jù)效率對(duì)比分析

    Pandas使用Merge與Join和Concat分別進(jìn)行合并數(shù)據(jù)效率對(duì)比分析

    這篇文章主要給大家介紹了關(guān)于pandas中DataFrame數(shù)據(jù)合并連接(merge、join、concat)的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Python中schedule模塊定時(shí)任務(wù)的使用方法(2)

    Python中schedule模塊定時(shí)任務(wù)的使用方法(2)

    這篇文章主要介紹了Python中schedule模塊定時(shí)任務(wù)的使用方法,文章基于上一篇文章的內(nèi)容展開(kāi)的后續(xù),需要的朋友可以參考一下
    2022-05-05
  • Linux系統(tǒng)(CentOS)下python2.7.10安裝

    Linux系統(tǒng)(CentOS)下python2.7.10安裝

    這篇文章主要為大家詳細(xì)介紹了Linux系統(tǒng)(CentOS)下python2.7.10安裝圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Python Metaclass原理與實(shí)現(xiàn)過(guò)程詳細(xì)講解

    Python Metaclass原理與實(shí)現(xiàn)過(guò)程詳細(xì)講解

    MetaClass元類(lèi),本質(zhì)也是一個(gè)類(lèi),但和普通類(lèi)的用法不同,它可以對(duì)類(lèi)內(nèi)部的定義(包括類(lèi)屬性和類(lèi)方法)進(jìn)行動(dòng)態(tài)的修改??梢赃@么說(shuō),使用元類(lèi)的主要目的就是為了實(shí)現(xiàn)在創(chuàng)建類(lèi)時(shí),能夠動(dòng)態(tài)地改變類(lèi)中定義的屬性或者方法
    2022-11-11
  • Python腳本實(shí)現(xiàn)網(wǎng)卡流量監(jiān)控

    Python腳本實(shí)現(xiàn)網(wǎng)卡流量監(jiān)控

    這篇文章主要介紹了Python腳本實(shí)現(xiàn)網(wǎng)卡流量監(jiān)控,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2015-02-02
  • PyCharm控制臺(tái)堆棧亂碼問(wèn)題解決方案

    PyCharm控制臺(tái)堆棧亂碼問(wèn)題解決方案

    PyCharm環(huán)境都已經(jīng)配置成了UTF-8編碼,控制臺(tái)打印中文也不會(huì)出現(xiàn)亂碼,但報(bào)錯(cuò)堆棧信息中如果有中文會(huì)出現(xiàn)中文亂碼,遇到這樣的問(wèn)題如何解決呢,下面小編給大家?guī)?lái)了PyCharm控制臺(tái)堆棧亂碼問(wèn)題解決方案,感興趣的朋友一起看看吧
    2023-12-12
  • 用python爬取豆瓣前一百電影

    用python爬取豆瓣前一百電影

    大家好,本篇文章主要講的是用python爬取豆瓣前一百電影,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下
    2022-01-01

最新評(píng)論

华池县| 尼勒克县| 池州市| 辛集市| 长治市| 华池县| 喀喇沁旗| 平遥县| 城步| 宜阳县| 封丘县| 临潭县| 寿阳县| 枣庄市| 玛纳斯县| 大英县| 洪雅县| 邵武市| 定南县| 收藏| 安丘市| 宣汉县| 鄯善县| 丰宁| 怀安县| 化州市| 青海省| 册亨县| 阿克苏市| 佛学| 长沙县| 射阳县| 凉城县| 安远县| 淮安市| 乐清市| 璧山县| 安仁县| 九龙县| 凌海市| 长沙市|