1.推送过程简介
(1)App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请。若注册成功,回调函数application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken 会被触发,App可以得到deviceToken,该token就是一个与设备相关的字符串.
(2)App获取到DeviceToken(插个嘴,获取DeviceToken的方法可以参考我的另外一篇博客:iOS开发之获取设备的Token)后,将DeviceToken发送给自己的服务端。
(3)服务端拿到DeviceToken以后,使用证书文件,向苹果的APNS服务器发起一个SSL连接。连接成功之后,发送一段JSON串,该JSON串包含推送消息的类型及内容。
(4)苹果的APNS服务器得到JSON串以后,向App发送通知消息,使得App的回调函数application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo被调用,App从userInfo中即可得到推送消息的内容。
2. 用到的证书文件及生成过程
(1)certSigningRequest文件,该文件在MAC系统中生成,用于在Apple网站上申请推送证书文件。
生成过程:
打开应用程序中的“钥匙串访问”软件,从菜单中选择 “钥匙串访问”-》“证书助理”-》“从证书颁发机构请求证书”,邮箱和名称随便填写,然后选择保存到磁盘,就可以在本地生成一个 CertificateSigningRequest.certSigningRequest文件(当然这个名字你随便起都可以的)。
(2)注册一个支持push的app id,后面会用到。
生成过程:
进入developer.apple.com,选择member center -Certificates, Identifiers & Profiles -Identifiers- App Ids,然后选择注册app id,设置appid名称,同时,app id suffix一栏必须选择explicit app id,然后设置bundle id,最后勾选App Services中的Push Notifications,这样就可以注册一个支持push的aphid。
(3) 推送证书cer文件,该文件在developer.apple.com中生成,用于生成服务端需要的文件。
生成过程:
进入developer.apple.com,选择member center -Certificates, Identifiers & Profiles - Certificates,然后选择创建certificate,类型分为Development和Product。这里以Development为 例,选择Apple Push Notification service SSL (Sandbox) ,然后下一步,选择之前生成的支持push的AppId,然后下一步,提交之前创建的CSR文件,再下一步就可以生成cer文件,然后保存到本地。
(4)生成服务端使用的证书文件。如果是使用网上的mac 版PushMeBaby工具,在mac机器上进行推送消息的发送,那么有上面的cer文件就够了。如果是使用PHP、java/c#开发自己的服务端,那 么还需要将上面的cer文件做一个转换,生成pem文件或者p12文件。
选中证书,导出为 apns-dev-cert.p12 文件
选中专有秘钥,导出为apns-dev-key.p12文件
生成php用的pem文件过程为:(因为我们后台是java写的,所以这个就没有截图)
首先双击前面保存的cer文件,此时会打开“钥匙串访问”软件,里面会出现一个Apple Development IOS push services证书,一个公用密钥和一个专用秘钥,秘钥的名称与证书助理中填写的名称一致。
通过终端命令将这些文件转换为PEM格式:
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
最后, 需要将两个pem文件合并成一个apns-dev.pem文件,此文件在连接到APNS时需要使用:
cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem
生成java/c#用的p12文件过程为:
生成p12的文件列表
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12
openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12
当你用终端执行完上面这2句语句过后,就会变成这种样子:
在原来的基础上,是不是多了 2个.pem文件。这2个.pem文件就是合成推送证书的关键了。
最后,使用终端执行下面的语句:
openssl pkcs12 -export -in apns-dev-cert.pem -inkey apns-dev-key.pem -certfile CertificateSigningRequest.certSigningRequest -name "push" -out push.p12
这样就得到了推送证书,将它发给你们公司写后台的人员,就坐等推送消息的到来咯!