ios推送服务,php服务端

本文转载至http://my.oschina.net/AStar/blog/176531

生成证书 
证书生成参考: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 
}

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

<?php 
//手机注册应用返回唯一的deviceToken 
$deviceToken = ‘eb87b209 6395a040 a1cf85e5 15b6e972 20ec883f 6b3ac80f 02b92a1a 58cf273e‘; 
//ck.pem通关密码 
$pass = ‘[email protected]#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个字符长度限制;超出范围不能发送

时间: 2024-10-16 11:42:54

ios推送服务,php服务端的相关文章

IOS 推送消息 php做推送服务端

IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下: iOS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器. 上图可以分为三个阶段: 第一阶段:应用程序把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有

IOS推送http2使用netty服务启动异常

IOS推送http2使用netty服务启动异常 现象 使用netty开发×××送HTTP2,本机运行正常,部署至linux服务器异常. 原因 是linux服务器内核版本过低,所使用GLIBC类库版本过低.netty要求GLIBC_2.10,我的服务器最高才GLIBC_2.5. linux查看GLIBC版本命令 strings /lib64/libc.so.6 |grep GLIBC_ 解决办法 升级linux内核版本以及GLIBC类库版本. 以下附netty服务器异常日志 2018-11-18

iOS 推送证书

push 服务器证书 钥匙串:登入-->证书,选项里面导出证书命名为cert.p12,跟密钥命名为key.p12 需要将上面的2个.p12文件转成.pem格式: openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12 openssl pkcs12 -nocerts -out key.pem -in key.p12 如果需要对 key不进行加密: openssl rsa -in key.pem -out key.unencrypted.

教你做IOS推送 包会!

最近在研究iOS的推送问题,遇到了一些问题,最终整理了一下,放在这里和大家分享. APNS的推送机制 首先我们看一下苹果官方给出的对iOS推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. 上图可以分为三个阶段: 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相

手把手教你做iOS推送

最近在研究iOS的推送问题,遇到了一些问题,最终整理了一下,放在这里和大家分享. APNS的推送机制 首先我们看一下苹果官方给出的对iOS推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. 上图可以分为三个阶段: 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相

iOS推送小结--swift语言

APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. iPhone当然就是我们的iOS设备了,CllentApp就是我们的客户端程序 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把

iOS 推送通知流程

别的不说,现在AppDelegate.m中添加以下代码块 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     // 将这行代码插入     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationT

iOS推送之远程推送

最近公司项目升级重构(重写),除了本来我所负责的模块,最后临危受命接了推送(远程和本地)相关的模块,顺便把推送的相关知识复习了一遍.后期连续工作十几天加上最后一天的通(瞎)宵(熬)达(一)旦(夜),也算是不辱使命.此文除了讲解远程推送相关的基本知识外,也会涉及一些推送相关的奇淫技巧.另外本文主要讲解远程推送,后续会出一篇iOS推送之本地推送(iOS Notification Of Local Notification)的姊妹篇. 此篇文章的逻辑如下图所示: 图0-0 此篇文章的逻辑图 远程推送原

iOS推送之本地推送

写此文的原因可见此文章的姊妹篇iOS推送之远程推送(iOS Notification Of Remote Notification),如果你看过了它的姊妹篇,了解过了远程推送,那么再来看此本地推送,真真是易如反掌啊! 此篇文章的逻辑如下图所示: 图0-0 此篇文章的逻辑图 本地推送介绍 本地推送和远程推送的功能是一样的,都是要提醒用户去做某些事情.但是和远程推送不同的就是本地推送是不需要设备联网的,而远程推送是必需要设备联网的,因为只有联网状态下,才能和苹果的APNs服务器建立长连接,从而推送消

一步一步教你做ios推送

最近在研究ios的推送问题,遇到了一些问题,最终整理了一下.放在这里和大家分享 APNS的推送机制 首先我们看一下苹果官方给出的对ios推送机制的解释.如下图 Provider就是我们自己程序的后台服务器,APNS是Apple Push Notification Service的缩写,也就是苹果的推送服务器. 上图可以分为三个阶段: 第一阶段:应用程序的服务器端把要发送的消息.目的iPhone的标识打包,发给APNS. 第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应