很多应用程序都具备了ios推送消息这个功能,
首先,我们需要了解下IOS推送的原理了,以下图辅以理解:
Provider-为IOS设备应用程序提供Push的服务器,(如果IOS设备的应用程序是客户端的话,那么Provider可以理解为服务端消息的发起者; 使用.NET还是PHP作为Provider,IOS开发人员自行选择。APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。iPhone:用来接收APNS下发下来的消息;Client App:IOS设备上的应用程序,用来接收iphone传递APNS下发的消息到制定的一个客户端 app消息的最终响应者;
写陈述下php实现IOS开发推送:首先,需要一个pem的证书,该证书需要与开发时签名用的一致。 生成pem证书方法如下:登录 http://developer.apple.com/iphone/manage/overview/index.action 然后点击 App IDs;
创建一个 Apple ID 。通配符 ID 不能用于推送通知服务。如, com.itotem.iphone;点击Apple ID旁的“Configure”,根据“向导” 的步骤生成一个签名上传,然后下载生成的许可证。
双击.cer文件将你的 aps_developer_identity.cer 导入Keychain中。
在Mac上启动 Keychain助手,然后在login keychain中选择 Certificates分类。看到一个可扩展选项“Apple Development Push Services”
扩展此选项然后右击“Apple Development Push Services” > Export “Apple Development Push Services ID123”。保存为 apns-dev-cert.p12 文件。
扩展“Apple Development Push Services” 对“Private Key”做同样操作,保存为 apns-dev-key.p12 文件。
通过终端命令将这些文件转换为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
最后,你需要将键和许可文件合成为apns-dev.pem文件,此文件在连接到APNS时需要使用:
cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem
php代码如下:1.
2.$deviceToken = $_POST['token']; //取得Token
3.$body = array(“aps” => array(“alert” => ‘message’, “badge” => 2, “sound”=>’default’)); //推送方式,包含内容和声音
4.$ctx = stream_context_create();
5.//如果在Windows的服务器上,寻找pem路径会有问题,路径修改成这样的方法:
6.//$pem = dirname(__FILE__) . ‘/’ . ‘apns-dev.pem’;
7.//linux 的服务器直接写pem的路径即可
8.stream_context_set_option($ctx, “ssl”, “local_cert”, “apns-dev.pem”);
9.$pass = ”123123“;
10.stream_context_set_option($ctx, ‘ssl’, ‘passphrase’, $pass);
11.//此处有两个服务器需要选择,如果是开发测试用,选择第二名sandbox的服务器并使用Dev的pem证书,如果是正是发布,使用Product的pem并选用正式的服务器
12.$fp = stream_socket_client(“ssl://gateway.push.apple.com:2195“, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
13.$fp = stream_socket_client(“ssl://gateway.sandbox.push.apple.com:2195″, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
14.if (!$fp) {
15.print “Failed to connect $err $errstrn”;
16.return;
17.}
18.print “Connection OK\n”;
19.$payload = json_encode($body);
20.$msg = chr(0) . pack(“n”,32) . pack(“H*”, str_replace(‘ ‘, ”, $deviceToken)) . pack(“n”,strlen($payload)) . $payload;
21.print “sending message :” . $payload . “\n”;
22.fwrite($fp, $msg);
23.fclose($fp);
24.?>
如果是.net作为应用程序的流程
.net应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
新建一个App ID 和SSL certificate文件:用你的付过费的apple帐号登录到iOS Provisioning Portal。新建一个App ID。Description:中输入PushChat;Bundle Seed ID:默认选择Generate New;Bundle Identifier:输入com.mysoft.PushChat.
在 PushChatAppDelegate.m代码中添加下面方法获取deviceToken :
- (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{NSLog(@My token is: %@, deviceToken);}- (void)application:(UIApplication*)application didFailToRegisterForRemoteNotificationsWithError:(NSError*)error{NSLog(@Failed to get token, error: %@, error);}
获取到的deviceToken,我们可以通过webservice服务提交给.net应用程序,这里我简单处理,直接打印出来,拷贝到.net应用环境中使用。
这个证书可以通过我们前面生成的两个文件中得到。
不管是用PHP还是.NET作为推送程序,文件、证书好了之后是下一步操作。
php情况下的:到这里证书已经准备完毕,接下来,我们在xcode中新建一个测试工程,注意设置工程的Bundle Identifier必须与上面建的APP ID 里的相同。在didFinishLaunchingWithOptions 中加入一下代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[self.window makeKeyAndVisible];
[[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge |UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert];
return YES;
}
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken {
NSLog(@"regisger success:%@", pToken);
}
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{
UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"推送通知" message:@"信息" delegate:selfcancelButtonTitle:@"Cancel" otherButtonTitles:nil, nil];
[alert show];
[alert release];
}
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {
NSLog(@"Regist fail%@",error);
}
接下来我们访问http://localhost/push/push.php
ios设备就会接收到一条推送消息了
另外去除标记的方法为,在viewDidApper中加入
如果是.net作为应用程序的流程
使用OpenSSL
1、将aps_developer_identity.cer转换成 aps_developer_identity.pem格式。
openssl x509 -in aps_developer_identity.cer -inform DER -out aps_developer_identity.pem -outform PEM
2、将p12格式的私钥转换成pem,需要设置4次密码,密码都设置为:abc123。
openssl pkcs12 -nocerts -out PushChat_Noenc.pem -in PushChat.p12
3、用certificate和the key 创建PKCS#12格式的文件。
openssl pkcs12 -export -in aps_developer_identity.pem -inkey PushChat_Noenc.pem -certfile PushChat.certSigningRequest -name aps_developer_identity -out aps_developer_identity.p12
这样我们就得到了在.net应用程序中使用的证书文件:aps_developer_identity.p12。
在.net应用程序中发送通知。
有个开源的类库:apns-sharp。
地址是:http://code.google.com/p/apns-sharp/。
我们下载源代码,对里面的JdSoft.Apple.Apns.Notifications做相应的调整就能用了。
我们根据DeviceToken和p12File对JdSoft.Apple.Apns.Notifications.Test做相应的调整,如下图。
以上,说明的是分别说明了再.net和php作为provider的情况下的IOS开发消息推送的问题。