此文主要以证书生成配置为主,实现简单推送,部分截图与内容来自于互联网,若对大家有所帮助,还请给个赞O(∩_∩)O~~。如有误,请指出,一起探讨。
一、 推送原理
Provider是指某个iPhone软件的Push服务器。APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。上图可以分为三个阶段。
* 第一阶段:Push服务器应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
* 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
* 第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
1. 应用程序注册消息推送。
2. IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
3. 应用程序将deviceToken发送给PUSH服务端程序。
4. 服务端程序向APNS服务发送消息。
5. APNS服务将消息发送给iPhone应用程序。无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。
二、 证书的创建
1. 创建本地请求证书文件–CertificateSigningRequest
- 钥匙串访问 –> 证书助理 –> 从证书颁发机构请求证书;
- 填写邮箱和名称(可以随意填写) –> 存储到磁盘
- 选择继续-保存至桌面即可(此文件可长期重复使用,只作为本机器的一个识别作用)
2. 进入苹果开发者网站,生成证书以及profiles
依次选择Member Center - Certificates, Identifiers &Profiles - Certificates
选择当前要设置通知的APP IDs
这里我以新建一个APP IDs为例,若公司已有项目APP IDs,则略过此步
选择右上角”+”号创建一个APPID
填写name以及Bundle ID
Bundle ID需要与Xcode里项目Bundle ID一致
勾选push notification 并完成提交
找到刚创建好的APP IDs,可以看到下面的通知选项处提示Configurable,表示证书还没配置,点击Edit进行编辑
这里看到推送证书分为2个版本,一个开发模式,一个生产模式,即我们在开发测试时使用开发模式证书,发布上线后采用生产模式证书,两个都要创建(本次只作开发模式演示,当然创建生产版证书的步骤也是一样的)
Choose File选择最开始创建在桌面的Request文件
创建证书OK后 下载到本地
开发版和生产版证书都创建好后,此时这里已经都是启用状态了。
生成XCODE使用的provisioning文件,该文件用于真机调试:
生成过程:
进入developer.apple.com,选择member center - Certificates, Identifiers & Profiles - Provisioning Profiles,然后选择创建Provisioning file,接着选择iOS App Development ,下一步选择AppId,选中之前建立的支持push的appid,接着下一步选择支持push的certificate,下一步勾选需要支持的device id,最后一步设置provisioning文件的文件名,这样provisioning文件就生成了。
3. 生成服务端使用的证书文件
- 首先双击前面保存的cer文件,此时会打开“钥匙串访问”软件,里面会出现一个Apple Development IOS push services证书,一个公用密钥和一个专用秘钥,秘钥的名称与证书助理中填写的名称一致。
- 选中证书,导出为 apns-dev-cert-development.p12 文件
- 选中专有秘钥,导出为apns-dev-key-development.p12文件
- 通过终端命令将这些文件转换为PEM格式:
- 设置密码,建议所有都为一个密码
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert-development.pem -in apns-dev-cert-development.p12
openssl pkcs12 -nocerts -out apns-dev-key-development.pem -in apns-dev-key-development.p12
- 最后, 需要将两个pem文件合并成一个apns-dev.pem文件,此文件在连接到APNS时需要使用:
“`
cat apns-dev-cert-development.pem apns-dev-key-noenc-development.pem > apns-dev-development.pem
####4. 测试证书
执行下面命令:
telnet gateway.sandbox.push.apple.com 2195(apns的测试环境)
telnet gateway.push.apple.com 2195(apns的正式环境)
它将尝试发送一个规则的,不加密的连接到APNS。如果你看到下面的反馈,那说明你的MAC能够到达APNS。按下Ctrl+C关闭连接。如果得到一个错误信息,那么你需要确保你的防火墙允许2195端口,一般这里都不会出现什么问题。
![终端显示](http://upload-images.jianshu.io/upload_images/1085368-a72adc48d5be13db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下面我们使用生成的SSL证书和私钥来设置一个安全的链接去链接苹果服务器,执行命令如下:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-dev-cert-development.pem -key apns-dev-key-development.pem
“`
执行之后需要输入密码,就是上面我们设置的密码即可。
如果链接是成功的,你可以随便输入一个字符,按下回车,服务器就会断开链接,如果建立连接时有问题,OpenSSL会给你返回一个错误信息。
输出结果如下,则说明是正确链接了,把上述合并的apns-dev-development.pem给服务端使用。
如果有错误,请检查是否导出正确的推送证书。