jpush http://docs.jpush.cn/display/dev/iOS
前几天给app增加了推送服务,看了好多资料,最终实现了。在此整理一下,理清思路以便以后复习。
原理分析
================================
至于推送的原理,我大致提一下:
功能实现
==================================
实现这功能,要分两部分:
1、配置app发布证书,
2、配置我们的推送服务器用的推送证书
配置app发布证书
====================
需要到开发中心 iOS Provisioning Portal-》AppID栏把相应的app开通推送服务,最终结果如下图:
如果你不清楚什么是iOS Provisioning Portal什么是appid 那就看一下这个iOS应用的真机调试,为自己的app申请一个appid。
一般注册后appid中这个push notification是黄色的,并没有开通,需要配置。下面说说如何配置:
1、首先配置推送服务需要证书,跟配置真机测试时一样没,
b、 生成Certificate Signing Request (CSR):
最终保存一个PushTest.certSigningRequest 保存于桌面
2、有了这个证书后,去开发者中心配置app的推送服务
a)在App IDs中选择自己对应的app ,然后发现 push Notification选项是黄色的,然后点击配置
注意:如果当初在添加appid时,使用了com.pan-apps.*
b)然后配置推送服务
由于现在只是用于开发测试,就选择第一个项,点击configure
c)下面就需要上传我们在第一步中生成的PushTest.certSigningRequest了
可能需要点时间,现在已经生成成功了,再继续
点击下载,我这里名字是:aps_development.cer ,,然后你会发现,推送的状态变成了绿色了
d )然后需要在Provisioning栏中重新创建一个profile 用于真机测试或者打包ipa,如下:
完成后点击下载刚生成的profile文件,如下图:
下载之后双击导入到Xcode。这样我们的有推送功能的打包证书就配置好了,下面需要我们在工程种加入相关代码,
在我们的程序的Appdelegate 文件中加入下面代码:
- ( BOOL )application:(UIApplication *)application didFinishLaunchingWithOp |
|
{ |
|
// Let the device know we want to receive push notifications |
|
[[UIApplication sharedApplication] registerForRemoteNotific |
|
(UIRemoteNotificationType |
|
return YES; |
|
} |
|
/ |
|
- ( void )application:(UIApplication*)application didRegisterForRemoteNoti |
|
{ |
|
NSLog(@ "My token is: %@" , deviceToken); |
|
} |
|
- ( void )application:(UIApplication*)application didFailToRegisterForRemo |
|
{ |
|
NSLog(@ "Failed to get token, error: %@" , error); |
|
} |
然后在配置中code sign 字段中选择刚下载的profile 进行真机安装,有玩过真机测试的应该很清楚吧。
真机运行会获得deviceToken,
我的deviceToken如下:
现在前端的事情我们都完成了,下面剩下的就时配置一个推送服务器了。
===========================
配置我们的推送服务器用的推送证书
1、首先导出p12文件
我们之前生成了PushTest.certSigningRequest文件,那么在钥匙串中会生成一个密钥,把它导出来
把它导出到桌面
2、生成php服务器连接苹果推送服务器APNS的证书
现在,我们已经有了3个文件:
PushTest.certSigningRequest
aps_development.cer
push.p12
我都是存在桌面的
现在我打开终端,cd到桌面,
a)、把.cer文件转换成.pem文件:
$ openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
c)、最后。把私钥和证书整合到一个.pem文件里:
$ cat PushChatCert.pem PushChatKey.pem > ck.pem
d)、为了测试证书是否工作,执行下面的命令:
$ telnet gateway.sandbox.push.apple.com 2195
Trying 17.172.232.226…
Connected to gateway.sandbox.push-apple.com.akadns.net.
Escape character is ‘^]’.
它将尝试发送一个规则的,不加密的连接到APNS服务。如果你看到上面的反馈,那说明你的MAC能够到达APNS。按下Ctrl+C 关闭连接。如果得到一 个错误信息,那么你需要确保你的防火墙允许2195端口。
然后再次连接,这次用我们的SSL证书和私钥来设置一个安全的连接:
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
Enter pass phrase for PushChatKey.pem:
你会看到一个完整的输出,让你明白OpenSSL在后台做什么。如果连接是成功的,你可以键入一些字符。当你按下回车后,服务就会断开连接。如果 在建立连接时有问题,OpenSSL将会给你一个错误消息,
ck.pem文件就是我们需要得到php连接APNS 的文件,将ck.pem和push.php放入同一目录上传到服务器,push.php的代码如下: