第一次做苹果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:443

  • Production 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推送【详解】的更多相关文章

  1. 基于B/S模式的推送

    基于B/S模式的推送 https://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这 ...

  2. 手把手教你配置苹果APNS推送服务|钿畑的博客 | 钿畑的博客

    http://www.360doc.com/content/15/0118/17/1073512_441822850.shtml# 钿畑的文章索引 1. 什么是推送通知 2. 什么是APNS? 3. ...

  3. Android 基于Netty接收和发送推送解决方案的消息字符串(三)

    在上一篇文章中<Android 基于Netty的消息推送方案之概念和工作原理(二)> .我们介绍过一些关于Netty的概念和工作原理的内容,今天我们先来介绍一个叫做ChannelBuffe ...

  4. 基于双向BiLstm神经网络的中文分词详解及源码

    基于双向BiLstm神经网络的中文分词详解及源码 基于双向BiLstm神经网络的中文分词详解及源码 1 标注序列 2 训练网络 3 Viterbi算法求解最优路径 4 keras代码讲解 最后 源代码 ...

  5. APNS推送原理详解

    推送是解决轮询所造成的流量消耗和电量消耗的一个比较好的解决方案,在Android上,虽然Google提供了GCM(之前为C2DM),但在国内基本等于没用,各大Android应用基本都自己架设推送Ser ...

  6. php课程 1-3 web项目中php、html、js代码的执行顺序是怎样的(详解)

    php课程 1-3 web项目中php.html.js代码的执行顺序是怎样的(详解) 一.总结 一句话总结:b/s结构 总是先执行服务器端的先.js是客户端脚本 ,是最后执行的.所以肯定是php先执行 ...

  7. iOS apns推送

    前言:推送分为本地推送以及远程推送. 两者的区别为本地推送一般为定时推送.定期推送或者位置推送.而远程推送更为多样化,能满足较高的要求.当然远程推送需要服务器端开发,开发流程较复杂. 1.本地推送只需 ...

  8. iOS开发之功能模块--Apns推送中的的json格式介绍

    在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...

  9. Apns推送中的的json格式介绍

    在开发向苹果Apns推送消息服务功能,我们需要根据Apns接受的数据格式进行推送.下面接受我在进行apns推送时候总结的一点apns服务接受的Json数据格式 示例 1: 以下负载包含哦一个简单的 a ...

随机推荐

  1. 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。

    环境:景安快云服务器(听说很垃圾,但是公司买的,我也刚来),CentOS-6.8-x86_64,Apache,MySQL5.1,PHP5.3. 问题:现公司有一个php系统,需要重复向后台发送ajax ...

  2. oralce 分离表和索引

    总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的硬盘上.   “同时 ...

  3. 本地测试读取redis和普通文件缓存的速度,redis慢一倍?

    重新测试了,换成了Linux服务器,php5.6,512内存.连续读取1千次不同的文件(每个文件41KB),redis也是1千个不同的key,文件缓存还是比redis快! 但是,但是,后来我换成连续读 ...

  4. Python图表绘制Matplotlib

    引入 import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# 导入相关模块 使用 # 图表窗口1 → plt.sho ...

  5. Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理

    找到当前作者关联的所有书籍对象: ORM多对多关联查询的原理: 编辑作者:

  6. Python--day28--摘要算法

    摘要算法:

  7. centos linux mysql 10060远程错误代码

    Navicat for MySQL远程连接数据错误代码10060 1.登陆远程linux服务器命令界面 vim /etc/sysconfig/iptables  进入防火墙配置修改 增加以下两条防火墙 ...

  8. P1006 输出第二个整数

    题目描述 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数.把第二个输入的整数输出. 输入格式 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数. 输出格式 输出输入的三个整数 ...

  9. JS(JavaScript)的深入了解1(更新中···)

    面向对象 1.单列模式 2.工厂模式 3.构造函数 (1) 类Js天生自带的类Object 基类Function Array Number Math Boolean Date Regexp Strin ...

  10. 使用Ant Design写一个仿微软ToDo

    实习期的第一份活,自己看Ant Design的官网学习,然后用Ant Design写一个仿微软ToDo. 不做教学目的,只是记录一下. 1.学习 Ant Design 是个组件库,想要会用,至少要知道 ...