Python搭建APNS苹果推送通知推送服务的相关模块使用指南
APNS 是苹果为IOS设备提供的推送服务,全称是(Apple Push Notification service)。 如果你有接触移动互联网相关的开发的话,应该对它很熟悉。 接下来我会给大家简单介绍一下Python下的一些APNS相关的模块以及其特点。 模块介绍: PyAPNs 项目地址: https://github.com/djacobs/PyAPNs 它的所有验证都是在客户端做的,比如每一个Payload不超过256字节。 ... ... # 复用这个gateway_server apns.gateway_server.send_notification(token_hex,payload) 复用这个gateway_server也就是连接,但是到APNS Server的链接是很不稳定的,很多情况下 都会被断开,比如网络原因、发送了非法的token等。所以我们还需要一个重连的机制。 但PyAPNs模块没有为你处理这些,所以你需要自己去处理那些出错的情况,这也是使用 这个模块最不方便的地方。 所以我的建议是,除非你自己需要去写一个APNS的Provider,那你可以以这个模块作为起点。 否则,如果你想在你的项目里面快速用上推送服务的话,建议还是选择别的模块。 示例: 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 对于更复杂的alerts,比如自定义按钮,可以使用PayloadAlert类 alert = PayloadAlert("Hello world!",action_loc_key="Click me") payload = Payload(alert=alert,sound="default") pyapns(twisted) 项目地址: https://github.com/samuraisam/pyapns 它其实是一个基于twisted的server,所有发送推送的请求都通过它来和苹果的服务器交互。 但是这个模块很长时间都没有维护了,其实Apple那边的协议在这段时间里已经进行了一些更新。 但这个模块没有跟上。 我使用这个模块碰到的最大的问题就是 群发推送的效果得不到保证。 虽然这个模块的demo里面有对批量发送推送进行支持,但是我的使用经验是,这个模块的群发 推送效果比较差,而且缺少从苹果Server拿到错误反馈的逻辑。 因为Twisted的代码风格实在不怎么喜欢,所以我群发碰到问题后开始寻找别的解决方案。 apns-client 项目地址: https://bitbucket.org/sardarnl/apns-client/ 维持持久链接。SSL协议的握手环节是很慢的。当每一个连接被建立之后,它应该一直保持最少几分钟来等待 下一次的推送。 from apnsclient import * # 可以使用Session对象来维持连接池 session = Session() con = session.get_connection("push_sandbox",cert_file="sandbox.pem") # 发送推送和得到反馈 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 对于我来说,这个模块最大的优点就是为你处理了连接有可能被异常断开重连的情况。而且代码不像 pyapns这样晦涩,更直观,可读性更高。所以你如果要在它的基础上做一些修改也没有任何问题。 经过我的使用经验,使用apns-client来处理百万级别这种量级的推送没有任何问题,到达率也很好。 所以如果你没有特殊的需求的话,apns-client应该是你最好的选择。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |