您的位置:首页 > 编程语言 > PHP开发

ios推送服务,php服务端

2014-04-09 10:02 274 查看
生成证书 

证书生成参考:https://parse.com/tutorials/ios-push-notifications 

会生成三个文件 

xxx.cer 

xxx.certSigningRequest 

xxx.p12 

用PHP做推送需要 

推送证书生成。 

生成pem步骤: 

1.下载下来你配置好的推送证书aps_developer_identity.cer 文件。 

2.转换 .cer 文件到 .pem 文件: 

openssl x509 -in aps_developer_identity.cer -inform der -out PushChatCert.pem 

3.在把你“钥匙”推送证书导出成的.p12到.pem文件: 

openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChatKey.p12 

Enter Import Password:  

MAC verified OK 

Enter PEM pass phrase:  

Verifying - Enter PEM pass phrase:  

4.合并两个pem文件:cat PushChatCert.pem PushChatKey.pem > ck.pem 

5.测试证书是否可用: 

openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem 

****************客户端推送处理,以下在AppDelegate文添加**************** 

  //是否支持注册推送 

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 



    /*............... */ 

   //消息推送支持的类型 

    UIRemoteNotificationType types =(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert); 

    //注册消息推送 

    [[UIApplication sharedApplication]registerForRemoteNotificationTypes:types]; 



发送推送的思路:先获取手机的 deviceToken ,然后发送到我们的服务器 

 //获取DeviceToken成功 

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 



    NSLog(@"注册device token"); 

    NSLog(@"DeviceToken: {%@}",deviceToken); 

    //这里进行的操作,是将Device Token发送到服务端 

    NSString *tokenStr = [deviceToken description]; 

    NSString *pushToken = [[[tokenStr stringByReplacingOccurrencesOfString:@"<" withString:@""] 

                            stringByReplacingOccurrencesOfString:@">" withString:@""] 

                           stringByReplacingOccurrencesOfString:@" " withString:@""]; 

    //注册到我们的服务器 

    NSString *url = @"http://api.xxxxxxcom/index.php?r=site/saveIphoneDeviceToken&device_token=";

    url = [url stringByAppendingFormat:@"%@", pushToken]; 

    [[AFOSCClient sharedClient]getPath:url parameters:Nil 

                                success:^(AFHTTPRequestOperation *operation, id responseObject) { 

                                    NSLog(@"注册成功"); 

                               } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

                                   NSLog(@"注册失败"); 

                               }]; 



然后是处理接收推送消息 

 //注册消息推送失败 

- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error 



    NSLog(@"注册消息推送失败"); 

    NSLog(@"Register Remote Notifications error:{%@}",[error localizedDescription]); 



//处理收到的消息推送 

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo 



//    NSLog(@"Receive remote notification : %@",userInfo); 

//    NSLog(@"%@",[userInfo objectForKey:@"aps"]); 

    NSDictionary *aps = [userInfo objectForKey:@"aps"]; 

//    NSLog(@"%@",[aps objectForKey:@"alert"]); 

    NSString *msg = [aps objectForKey:@"alert"]; 

//    NSLog(@"%@",[userInfo objectForKey:@"alert"]); 

    UIAlertView *alert = 

    [[UIAlertView alloc] initWithTitle:@"温馨提示" 

                               message:msg 

                              delegate:nil 

                     cancelButtonTitle:@"确定" 

                     otherButtonTitles:nil]; 

    [alert show]; 

    [UIApplication sharedApplication].applicationIconBadgeNumber = 0;//把badge设置为0 

//或者用下面的代码:

NSString* nsalert = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];
if(nsalert && [nsalert length] > 0)
{
        UIAlertView *pAlert = [[UIAlertView alloc] initWithTitle:@"消息提示"
                                                         message:nsalert
                                                        delegate:self
                                               cancelButtonTitle:@"详细"
                                               otherButtonTitles:@"关闭", nil];
        [pAlert show];
        [pAlert release];
}
CFShow([userInfo description]);

//接收到push  打开程序以后设置badge的值
NSString *badgeStr = [[userInfo objectForKey:@"aps"] objectForKey:@"badge"];
if (badgeStr != nil)
[UIApplication sharedApplication].applicationIconBadgeNumber = [badgeStr intValue];

//接收到push  打开程序以后会震动
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);



****************服务器端push.php**************** 

<?php 

//手机注册应用返回唯一的deviceToken 

$deviceToken = 'eb87b209 6395a040 a1cf85e5 15b6e972 20ec883f 6b3ac80f 02b92a1a 58cf273e'; 

//ck.pem通关密码 

$pass = '13!@#23';    

//消息内容 

$message = '这是一条推送测试通知1'.time(); 

//badge我也不知是什么 

//$badge = 1; 

//sound我也不知是什么(或许是推送消息到手机时的提示音) 

$sound = 'Duck.wav'; 

//建设的通知有效载荷(即通知包含的一些信息) 

$body = array(); 

$body['aps'] = array('alert' => $message); 

//if ($badge) 

//  $body['aps']['badge'] = $badge; 

if ($sound) 

  $body['aps']['sound'] = $sound; 

//把数组数据转换为json数据 

$payload = json_encode($body); 

echo strlen($payload),"\r\n"; 

//下边的写法就是死写法了,一般不需要修改, 

//唯一要修改的就是:ssl://gateway.sandbox.push.apple.com:2195这个是沙盒测试地址,ssl://gateway.push.apple.com:2195正式发布地址 

$ctx = stream_context_create(); 

stream_context_set_option($ctx, 'ssl', 'local_cert', dirname(__FILE__) . '\\' . 'dev_ck.pem');   

stream_context_set_option($ctx, 'ssl', 'passphrase', $pass); 

$fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx); 

if (!$fp) { 

    print "Failed to connect $err $errstr\n"; 

    return; 



else { 

   print "Connection OK\n<br/>"; 



// send message 

$msg = chr(0) . pack("n",32) . pack('H*', str_replace(' ', '', $deviceToken)) . pack("n",strlen($payload)) . $payload; 

print "Sending message :" . $payload . "\n";   

fwrite($fp, $msg); 

fclose($fp); 

?> 

php服务端如果出问题,请检查是否开通ssl模块 

Apache需要开启ssl模块,通过查看Apache的官方文档得知,使用ssl需要Apache开启三个支持模块分别是: 

mod_include 

mod_cgi 

mod_expires 

*注意:ios 的推送消息有256个字符长度限制;超出范围不能发送 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios php 服务器 推送