原文转自http://blog.sina.com.cn/s/blog_68661bd80101p26l.html
网上关于C++服务端的APNS代码比较少,给我们后台人员找资料比较烦,凭现在网上的海量资料,PushMeBaby那个程序,PushNotificationDemo那个demo。加上我曾做过PHP,所以很容易就把推送用那两种方式下推送程序DEMO做出来,无论用开发证书还是产品证书,调通都不是难事。
bogon:~chenshuangchou$ opensslx509 -in aps_production.cer -inform der -out PushChatCert.pem
得到PushChatCert.pem
双击安装aps_production.cer到钥匙串,在钥匙串中找到刚才安装的推送证书,点开,右键导出秘要,命名为XXX.p12;demo中是csc123.p12
bogon:~chenshuangchou$ opensslpkcs12 -nocerts -out PushChatKey.pem -in csc123.p12
此处需要输入密码,demo中的密码:csc123
重复确认密码,得到PushChatKey.pem
@"{"aps":{"alert":"This is some fancymessage.","badge":1,"sound":"default"}}";
alert指地是弹出的内容,badge指地是软件在主界面icon的数字,sound指地是收到消息提示的声音。
Push的条件
1.必须要有苹果开发者账号。无论是企业账号还是公司账号或者是个人开发者账号,均能做推送。上一讲说过,苹果安全机制中用证书验证签名信息。推送也需要证书,而证书只能在开发者网站进行下载。
2.必须要有一个苹果系统,无所谓虚拟机,黑苹果还是原装苹果系统。推送证书的生成必须提供一个CSR文件,这个CRS文件包含该系统的标示与开发者账号信息,并在钥匙串生成密钥。
3.如果要测试推送,必须要准备一台iPhone,因为模拟器不支持推送。
push机制
推送消息就是一个socket连接,这个socket连接发送到apns(苹果消息推送服务器)。然后由apns发送消息到手机,在用户打开消息时,跳转到相应的app软件。(见图)
阶段一:Provider[服务端]把要发送的消息,目的IOS设备标识打包,发送给APNS;
阶段二:APNS在自身的已注册Push服务的IOS设备列表中,查找有相应标识的IOS设备,并将消息发送到IOS设备;
阶段三:IOS设备把发送的消息传递给对应的应用程序,并且按照设定弹出Push通知。
证书配置
1.包含推送的功能的app,在开发者网站上创建AppIDs时,必须使用明确的appid(ExplicitApp ID)作为签名的前缀,不能使用带有*的WildcardApp ID。
2.并在AppServices中启用PushNotifications功能,然后为这个Appid创建一个证书。创建证书需要用钥匙串从颁发机构请求证书,填写开发者账号邮箱和用户名,生成CRS文件。推送通知的证书有两种,一种是开发SSL证书,一种是产品SSL证书。
证书区别
两种证书的区别:
1、开发证书可以在软件开发时就能获得token,而发布证书必须在软件发布之后才能获得。在程序开发过程中开发证书就可以推送,而发布证书不行。
2、开发证书在推送消息时,连接apns的地址是gateway.sandbox.push.apple.com,而发布证书连接的是gateway.push.apple.com。
消息设置
[[UIApplication sharedApplication]registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert |UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound)];
//判断程序是不是由推送服务完成的
if (launchOptions) {
NSDictionary*pushNotificationKey = [launchOptionsobjectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if (pushNotificationKey) {
[selfalertNotice:@""withMSG:@"这是通过推送窗口启动的程序,你可以在这里处理推送内容"cancleButtonTitle:@"知道了"otherButtonTitle:nil];
}
}
- (void)application:(UIApplication *)appdidRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
}
- (void)application:(UIApplication *)appdidFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
}
//程序处于启动状态,或者在后台运行时,会接收到推送消息,解析处理
- (void)application:(UIApplication *)applicationdidReceiveRemoteNotification:(NSDictionary *)userInfo
{
}