⼿把⼿教你配置苹果APNS推送服务钿畑的博客钿畑的博客
钿畑的⽂章索引
苹果apple id注册
1. 什么是推送通知
2. 什么是APNS?
3. 推送流程
3.1 获取设备device_token阶段
3.2 消息推送过程
3.3 完整流程介绍
4. Push机制类型
5. 正式开⼯
5.1 准备⼯作
5.2 证书⽣成
6. 客户端制作
7. php服务器端配置
8. 测试
8. 附录:
8.1 JSON⽰例
8.2 检验证书是否正确的⽅法:
8.3 Push故障排除
8.4 APNS信息包结构体
8.5 消息⼤批量发送问题
8.6 参考连接
1. 什么是推送通知
消息通知分本地通知和远程推送通知,是没有运⾏在前台的应⽤程序可以让它们的⽤户获得相关消息通知的⽅式。消息通知可能是⼀条消息,即将发⽣的⽇历事件,或远程服务器的新数据。当被操作系统显⽰时,本地通知和推送通知看起来⼀样。它们可以显⽰⼀个警告信息或在应⽤程序的图标上⾯显⽰⼀个徽标。它们也可以在警告窗或徽标显⽰时播放⼀段声⾳。推送通知是在 iOS 3.0 和 Mac OS X v7.0 之后引⼊的。本地通知是在 iOS 4.0 之后引⼊的。它们都不⽀持 Mac OS X,当⽤户被通知相应的应⽤程序有消息,事件,或其他数据时,他们可以启动该应⽤程序并查看详情。他们也可以选择忽略通知,此时应⽤程序没有被激活。
本地通知和推送通知为不同的需求⽽设计的。本地通知是本地 iPhone、iPad、或iPod touch 上⾯的应⽤发起的。相反推送通知(⼜称远程通知)是从其他设备上⾯到达的。它来⾃⼀个远程设备——应⽤程序的提供者——并在有新的消息需要查看或新的数据需要下载的时候被推送到本地设备上⾯的应⽤,常见的本地通知像iphone的⽇历,或者qq这些都是本地推送,⽐如还安装了优酷,qq视频这些软件,允许推送后,每天会给你发些新的视频消息,这些就是远程推送。
2. 什么是APNS?
苹果推送通知服务(APNs)是推送通知的⽹关,iPhone ipad 对于应⽤程序在后台运⾏有诸多限制,考
虑到⼿机电池电量,应⽤不允许在后台进⾏过多的操作。因此,当⽤户切换到其他程序后,原先的程序⽆法保持运⾏状态。对于那些需要保持持续连接状态的应⽤程序(⽐如社区⽹络应⽤),将不能收到实时的信息。推送是解决轮询所造成的流量消耗和电量消耗的⼀个⽐较好的解决⽅案
为解决这⼀限制,苹果推出了APNs(苹果推送通知服务 Apple Push Notification services)。APNs 允许设备与苹果的推送通知服务器保持常连接状态。当你想发送⼀个推送通知给某个⽤户的iPhone上的应⽤程序时,你可以使⽤ APNs 发送⼀个推送消息给⽬标设备上已安装的某个应⽤程序。
苹果的推送服务APNs基本原理简单来说就是苹果利⽤⾃⼰专门的推送服务器(APNs)接收来⾃我们⾃⼰应⽤服务器的需要被推送的信息,然后推送到指定的iOS设备上,然后由设备通知到我们的应⽤程序,设备以通知或者声⾳的形式通知⽤户有新的消息。推送的前提是装有我们应⽤的设备需要向APNs服务器注册,注册成功后APNs服务器会返给我们⼀个
device_token,拿到这个token后我们将这个token发给我们⾃⼰的应⽤服务器,当有需要被推送的消息时,我们的应⽤服务器会将消息按指定的格式打包,然后结合设备的device_token ⼀并发给APNs服务器,由于我们的应⽤和APNs维持⼀个基于TCP的长连接,APNs将新消息推送到我们设备上,然后在屏幕上显⽰出新消息来。
顺便说下安卓的推送,Android消息推送采⽤MQTT协议,服务器端采⽤mosquito+PhpMQTTClient,
有兴趣的同学可以看看
mosquito:/
PhpMQTTClient  :github/tokudu/PhpMQTTClient
3. 推送流程
3.1 获取设备device_token阶段
整个过程基本就这样,下⾯我们看⼀下设备注册APNs的流程图:
上图完成了如下步骤:
1.Device连接APNs服务器并携带设备序列号
2.连接成功,APNs经过打包和处理产⽣device_token并返回给注册的Device
3.Device携带获取的device_token向我们⾃⼰的应⽤服务器注册
4.完成需要被推送的Device在APNs服务器和我们⾃⼰的应⽤服务器注册
执⾏顺序如下所⽰:
这⾥要提到的⼀点是,我们的设备和APNS服务器之间的通讯是基于SSL协议的TCP流通讯,⼆者之间维持⼀个长连接,当从APNS服务器注册成功后,⼀定要将device_token发送给我们的应⽤服务器,因为在推送过程中,⾸相是由我们的应⽤服务器(上图中Provider)将需要推送的消息结合device_token按指定格式(后⾯会提到)打包然后发送给APNS服务器,然后由APNS服务器推送给我们的设备。
3.2 消息推送过程
好了,注册设备的过程完成了,接下来就是如何推送了:
推送的过程经过如下步骤:
1.⾸先,安装了具有推送功能的应⽤,我们的设备在有⽹络的情况下会连接苹果推送服务器,连接过程中,APNS会验证device_token,连接成功后维持⼀个长连接;
2.Provider(我们⾃⼰的服务器)收到需要被推送的消息并结合被推送设备的device_token⼀起打包发送给APNS服务器;
3.APNS服务器将推送信息推送给指定device_token的设备;
4.设备收到推送消息后通知我们的应⽤程序并显⽰和提⽰⽤户(声⾳、弹出框)
3.3 完整流程介绍
⽐较直观的流程参照下图:
1. 应⽤启⽤推送通知功能,需要⽤户确认;
2. 应⽤收到设备识别ID(device token),相当于接收推送通知的地址;
3. 应⽤将设备识别ID发送到你开发的服务器;
4. 当有推送通知的需要时,你就可以通过你开发的服务组件发送信息到苹果的服务器上;
5. 苹果推送通知服务将信息推送到⽤户的设备上。
上图显⽰了我们的应⽤服务器将消息推送到我们的App的完整路径,其实真正完成推送的是APNS服务器,我们⾃⼰的应⽤服务器只是将需要推送的消息告诉苹果服务器,⾄于如何维护消息队列或如何保证消息能被推送到指定的设备上,这些都由苹果APNS给我们做完了
4. Push机制类型
四种:徽章、提⽰框、声⾳和横幅,具体表现形式如下图
Push机制的4个组件
Provider
APNS
iPhone设备
Client App
其中APNS(Apple Push Notification Service)是由苹果提供的消息推送服务中⼼,所有的消息都经由这⾥转发给相应的设备
5. 正式开⼯
5.1 准备⼯作
你得有台ios设备,iphone,ipad
5.1.2 为推送通知获取授权
为了给提供者这边开发和配置推送通知,你必须从开发者中⼼(即苹果官⽹ DevCenter)取得 SSL 授权证书。每个授权证书限制必须对应⼀个单独的应⽤,由应⽤的Bundle ID 标识。⽽
为了给提供者这边开发和配置推送通知,你必须从开发者中⼼(即苹果官⽹ DevCenter)取得 SSL 授权证书。每个授权证书限制必须对应⼀个单独的应⽤,由应⽤的Bundle ID 标识。⽽且该授权证书也被限制⽤于以下两个环境之⼀,沙箱环境(⽤于开发和测试)和⽣产环境。这些环境都拥有它⾃⼰的 IP 地址,⽽且需要它们⾃⼰的授权证书。你必须同时获得这些环境的的配置⽂件(即 Provisioning profiles)。
5.1.3 提供者和APNs之间通过⼆进制接⼝通信
⼆进制接⼝是异步的,⽽且它使⽤ TCP ⽅式通过 sock 连接把⼆进制内容的推送通知发送给 APNs。沙箱和⽣产环境都有⾃⼰独⽴的接⼝,每个都有它⾃⼰的地址和端⼝。对于每个接⼝,你需要使⽤ TLS(或 SSL)和已经拿到的 SSL 授权证书来建⽴⼀条到 APNs 的安全通信通道。提供者把推送通知打包并通过该通道发送给 APNs。APNs 包含了⼀个反馈服务,它负责维护每个应⽤的传递通知失败的设备列表(即APNs 当前⽆法把推送通知传递到这些设备上⾯的对应的应⽤)。提供者应该周期性的连接到反馈服务来查看推送失败的设备以便它可以把之前失败的通知重复发送过
去。
开发状态服务器地址 gateway.sandbox.push.apple 2195
产品状态服务器地址 gateway.push.apple 2195
Development和Production两个版本对应的apns device token是不同的,前者是develop的mobileprovision下获取的。后者是production的mobileprovision获取的。
Development和Production两个版本可以共⽤⼀个App ID(不推荐。共⽤时每次调试前都要删除设备上的app,重新打包⽣成。⽽且公⽤appid会经常抓狂,早上⾏,下午就不⾏了。所以不推荐),但是不能共⽤⼀个mobileprovision,所以要单独⽣成Distribution的证书供production版本使⽤。
注:Distribution的版本是⽆法在设备上debug调试的!
Development和Production两个版本的code sign是不同的,前者是iPhone Developer,后者是iPhone Distribution。注意不能搞错。
⽆论是Development Push SSLCertificate还是Production Push SSL Certificate 都有过期时间的。Development Push SSL Certificate有效期⼤概四个⽉左右,⽽ProductionPush SSL Certificate的有效期是⼀年。需要注意在过期之前⽣成新的证书,以免影响使⽤。
5.2 证书⽣成
5.2.1 过程简介
先概述下⼤致过程,然后下⾯会截图给出详细的步骤
在Mac上⽣成 Apple推送通知SSL许可证:
1. 登录到 apple Developer Connection Portal 并点击 App IDs
2. 创建⼀个不使⽤通配符的 App ID 。通配符 ID 不能⽤于推送通知服务。例如,我们的iPhone程序ID像这样:54im.PushChat
3. 点击App ID旁的“Configure”,然后按下按钮⽣产推送通知许可证。根据“向导”指导的步骤⽣成⼀个签名并上传,最后下载⽣成的许可证。
4. 通过双击.cer⽂件将你的 aps_ 引⼊Keychain中。
5. 在Mac上启动 Keychain助⼿,然后在login keychain中选择 Certificates分类。你将看到⼀个可扩展选项“Apple Development Push Servicescom.54im.PushChat”
6. 扩展此选项然后右击“Apple Development Push Services” > Export “Apple Development Push Services:com.54im.PushChat”。保存为 PushChat_cert.p12 ⽂件。
7. 扩展“Apple Development Push Services” 对“Private Key”做同样操作,保存为 PushChat_key.p12 ⽂件。
8. 需要通过终端命令将这些⽂件转换为PEM格式:
openssl pkcs12 -clcerts -nokeys -out cert.pem -in PushChat_cert.p12
9. 转换得到key的pem:
openssl pkcs12 -nocerts -out key.pem -in PushChat_key.p12
10. 如果你想要移除密码,要么在导出/转换时不要设定或者执⾏:
openssl rsa -in key.pem -out key.unencrypted.pem
11. 最后,你需要将键和许可⽂件合成为apns-dev.pem⽂件,此⽂件在连接到APNS时需要使⽤:
cat apns-dev-cert.pem key.unencrypted.pem > ck.pem
5.2.2 配置详解
1. 创建APPID
⾸先登陆我们的Apple Developer后台为将要使⽤推送服务的App新建⼀个App ID,如下图,点击新建后输⼊基本信息
我把要改的地⽅截图下来了,⾼⼿勿笑哦,屌丝第⼀次⽤mac,也是第⼀次进苹果开发者后台。