python3 三行代码基于HTTP2完美实现APNS推送【详解】
第一次做苹果APNS(Apple Push Notification service)推送,关于APNS推送原理以及证书的获取方式网上已经有许多资料,在此不做过多赘述,需要注意的是证书分为测试证书和正式证书两种,建议直接用通用版的正式证书
大家可以参考网上的这篇博客:点击这里查看
从苹果下载到的证书是.cer格式的,若要完成推送,需要转换为.pem格式,python已自带openssl,此步骤需要输入之前设置的密码:
openssl pkcs12 -in Development.p12 -out developent.pem
要进行python推送,自然少不了安装相应的python包:
pip install applepush
至此便可尝试推送:
from applepush import ApplePush
apns =ApplePush('证书文件名称','bundle ID')
resp =apns.single_push('苹果设备token',"推送内容")
如果成功实现推送,那恭喜你没有踩到坑,如果推送失败,请参考以下解决方案:
1.如果是测试环境,请确认是否是 测试环境下的DeviceToken+测试证书/通用的正式证书+测试服务器
如果是从App Store下载的正式环境,请确认是否是 正式环境下的DeviceToken+通用的正式证书+正式服务器
关于正式服务器与测试服务器地址,可参照官网进行对比:点此查看
2.如果是正式环境,会回复BadDeviceTocken,需要在下载的python包中做修改:
打开安装目录下Anacoda3\Lib\site-packages\applepush\core.py文件,将url地址改为以下,正式的服务器地址:
def __init__(self, cert, apns_topic):
self.cert = cert
self.headers = {"apns-topic": apns_topic}
self.api_url = 'api.push.apple.com:443'
self.api_path = '/3/device/%s'
Development server:
api.development.push.apple.com:443Production server:
api.push.apple.com:443
也可自行添加推送参数或修改代码使其兼容正式服务器与测试服务器:
def single_push(self, token,alert,content,badge=1):
"""
发送单个设备
:param token:设备
:param alert:弹出的消息
:param badge:红点数字
:return:
"""
token = self.handle_token(token)
payload = {
"aps":{
"alert":{
"title":alert, # iOS7、8设置无效,iOS9一般设置为appName
#"subtitle":EXCEPTIONTYPES, # 一般使用title就能满足需求
"body":content
},
"badge":1, #角标数
"sound":"default", #声音
"userinfo":{ #通知内容信息
"playid":"",
"username":"tom",
"sex":1
}
}
}
self.api_url1 = 'api.development.push.apple.com:443'
conn = HTTPConnection(self.api_url, ssl_context=tls.init_context(cert=self.cert))
conn.request('POST', self.get_api_path(token), body=json.dumps(payload), headers=self.headers)
resp = conn.get_response()
if resp.status==200:
return self.make_response(resp)
else:
conn = HTTPConnection(self.api_url1, ssl_context=tls.init_context(cert=self.cert))
conn.request('POST', self.get_api_path(token), body=json.dumps(payload), headers=self.headers)
resp = conn.get_response()
return self.make_response(resp)
python3 三行代码基于HTTP2完美实现APNS推送【详解】的更多相关文章
- 基于B/S模式的推送
基于B/S模式的推送 https://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这 ...
- 手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客
http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. ...
- Android 基于Netty接收和发送推送解决方案的消息字符串(三)
在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> .我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...
- 基于双向BiLstm神经网络的中文分词详解及源码
基于双向BiLstm神经网络的中文分词详解及源码 基于双向BiLstm神经网络的中文分词详解及源码 1 标注序列 2 训练网络 3 Viterbi算法求解最优路径 4 keras代码讲解 最后 源代码 ...
- APNS推送原理详解
推送是解决轮询所造成的流量消耗和电量消耗的一个比较好的解决方案,在Android上,虽然Google提供了GCM(之前为C2DM),但在国内基本等于没用,各大Android应用基本都自己架设推送Ser ...
- php课程 1-3 web项目中php、html、js代码的执行顺序是怎样的(详解)
php课程 1-3 web项目中php.html.js代码的执行顺序是怎样的(详解) 一.总结 一句话总结:b/s结构 总是先执行服务器端的先.js是客户端脚本 ,是最后执行的.所以肯定是php先执行 ...
- iOS apns推送
前言:推送分为本地推送以及远程推送. 两者的区别为本地推送一般为定时推送.定期推送或者位置推送.而远程推送更为多样化,能满足较高的要求.当然远程推送需要服务器端开发,开发流程较复杂. 1.本地推送只需 ...
- iOS开发之功能模块--Apns推送中的的json格式介绍
在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...
- Apns推送中的的json格式介绍
在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...
随机推荐
- 9-6 UVa 11400
参考 http://www.cnblogs.com/Kiraa/p/5510757.html http://www.cnblogs.com/zhaopAC/p/5159950.html 根据题目说明中 ...
- vue通信、传值的方式
原文博主地址:https://blog.csdn.net/qq_35430000/article/details/79291287 看完还是受益匪浅,讲得很详细..感谢!
- vue 使用webpack打包后路径报错以及 alias 的使用
一.vue 使用webpack打包后路径报错(两步解决) 1. config文件夹 ==> index.js ==> 把assetsPublicPath的 '/ '改为 './' 2. b ...
- 2019-7-12-wpf-VisualBrush-已知问题
title author date CreateTime categories wpf VisualBrush 已知问题 lindexi 2019-7-12 21:7:41 +0800 2018-2- ...
- H3C STP监控与维护
- linux 重用 short 为 I/O 内存
short 例子模块, 在存取 I/O 端口前介绍的, 也能用来存取 I/O 内存. 为此, 你必须告 诉它使用 I/O 内存在加载时; 还有, 你需要改变基地址来使它指向你的 I/O 区. 例如, ...
- 1024程序员节!(JAVA Code)
点我:传送门 程序员节快乐~ 水水题 A import java.util.*; import java.io.*; public class Main { public static void m ...
- Linux 内核热插拔操作
热插拔事件的实际控制是通过一套存储于 kset_hotplug_ops 结构的方法完成. struct kset_hotplug_ops { int (*filter)(struct kset *ks ...
- vue-learning:30 - component - 组件实例的引用方式
组件实例的引用方式 ref / $refs $root $parent $children 扩展查找任意组件实例的方法 在vue开发的项目中,通常会以一棵嵌套的组件树的形式来组织项目. 都存在着一个根 ...
- vue-learning:26 - component - 组件三大API之一:prop
组件三大API之一: prop prop的大小写 prop接收类型 字符串数组形式 对象形式: type / required / default / validator prop传递类型: 静态传递 ...