iOS实现从后台向手机客户端推送消息的代码.docx

上传人:b****1 文档编号:1656675 上传时间:2023-05-01 格式:DOCX 页数:11 大小:19.97KB
下载 相关 举报
iOS实现从后台向手机客户端推送消息的代码.docx_第1页
第1页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第2页
第2页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第3页
第3页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第4页
第4页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第5页
第5页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第6页
第6页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第7页
第7页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第8页
第8页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第9页
第9页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第10页
第10页 / 共11页
iOS实现从后台向手机客户端推送消息的代码.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

iOS实现从后台向手机客户端推送消息的代码.docx

《iOS实现从后台向手机客户端推送消息的代码.docx》由会员分享,可在线阅读,更多相关《iOS实现从后台向手机客户端推送消息的代码.docx(11页珍藏版)》请在冰点文库上搜索。

iOS实现从后台向手机客户端推送消息的代码.docx

iOS实现从后台向手机客户端推送消息的代码

iOS实现从后台向手机客户端推送消息的代码

iOS客户端消息推送其实是一个有点复杂的方法,这里介绍了一个PHP做服务端,向iOS客户端推送消息的步骤和代码。

1.deviceToken是从ios中得到

-(void)application:

(UIApplication*)applicationdidRegisterForRemoteNotificationsWithDeviceToken:

(NSData*)pToken{

NSLog(@"regisgersuccess:

%@",pToken);

//注册成功,将deviceToken保存到应用服务器数据库中

}

2.步骤

1.登录iPhoneDeveloperConnectionPortal()然后点击AppIDs

2.创建一个AppleID。

通配符ID不能用于推送通知服务。

如,com.itotem.iphone

3.点击AppleID旁的“Configure”,根据“向导”的步骤生成一个签名上传,然后下载生成的许可证。

4.双击.cer文件将你的aps_developer_identity.cer导入Keychain中。

5.在Mac上启动Keychain助手,然后在loginkeychain中选择Certificates分类。

看到一个可扩展选项“AppleDevelopmentPushServices”

6.扩展此选项然后右击“AppleDevelopmentPushServices”>Export“AppleDevelopmentPushServicesID123”。

保存为apns-dev-cert.p12文件。

(这里要注意的是在Certificates分类中)

7.扩展“AppleDevelopmentPushServices”对“PrivateKey”做同样操作,保存为apns-dev-key.p12文件。

8.通过终端命令将这些文件转换为PEM格式:

opensslpkcs12-clcerts-nokeys-outapns-dev-cert.pem-inapns-dev-cert.p12

opensslpkcs12-nocerts-outapns-dev-key.pem-inapns-dev-key.p12

9.最后,你需要将键和许可文件合成为apns-dev.pem文件,此文件在连接到APNS时需要使用:

catapns-dev-cert.pemapns-dev-key-noenc.pem>apns-dev.pem

3.php调用

php

$deviceToken='2bf6e8f97942b07e3dd790d70f52x18a4d50338b5bb00f6f14d8bb6f775a6d98';//没有空格

$body=array("aps"=>array("alert"=>'message',"badge"=>2,"sound"=>'default'));//推送方式,包含内容和声音

$ctx=stream_context_create();

//如果在Windows的服务器上,寻找pem路径会有问题,路径修改成这样的方法:

//$pem=dirname(__FILE__).'/'.'apns-dev.pem';

//linux的服务器直接写pem的路径即可

stream_context_set_option($ctx,"ssl","local_cert","apns-dev.pem");

$pass="xxxxxx";

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

//此处有两个服务器需要选择,如果是开发测试用,选择第二名sandbox的服务器并使用Dev的pem证书,如果是正是发布,使用Product的pem并选用正式的服务器

$fp=stream_socket_client("ssl:

//:

2195",$err,$errstr,60,STREAM_CLIENT_CONNECT,$ctx);

$fp=stream_socket_client("ssl:

//:

2195",$err,$errstr,60,STREAM_CLIENT_CONNECT,$ctx);

if(!

$fp){

echo"Failedtoconnect$err$errstrn";

return;

}

print"ConnectionOK";

$payload=$body);

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

echo"sendingmessage:

".$payload."";

fwrite($fp,$msg);

fclose($fp);

?

>

iOS实现推送消息并用PHP做推送服务端的方法

IOS推送消息是许多IOS应用都具备的功能,最近也在研究这个功能,参考了很多资料终于搞定了,下面就把步骤拿出来分享下:

iOS消息推送的工作机制可以简单的用下图来概括:

Provider是指某个iPhone软件的Push服务器,APNS是ApplePushNotificationService的缩写,是苹果的服务器。

上图可以分为三个阶段:

第一阶段:

应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。

第二阶段:

APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发送到iPhone。

第三阶段:

iPhone绿色软件下载吧把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。

从上图我们可以看到:

1、应用程序注册消息推送。

2、iOS从APNSServer获取devicetoken,应用程序接收devicetoken。

3、应用程序将devicetoken发送给PUSH服务端程序。

4、服务端程序向APNS服务发送消息。

5、APNS服务将消息发送给iPhone应用程序。

无论是iPhone客户端和APNS,还是Provider和APNS,都需要通过证书进行连接。

下面我介绍一下几种用到的证书。

一、CSR文件

1、生成CertificateSigningRequest(CSR)

2、填写你的邮箱和常用名称,并选择保存到硬盘。

这样就在本地生成了一个Push.certSigningRequest文件。

二、p12文件

1、导出密钥。

这样就生成了一个Push.p12文件。

三、SSLcertificate文件

1、用你付过费的帐号登录到iOSProvisioningPortal,并新建一个AppID,这个过程可以参考:

iOS应用的真机调试,这样就会生成下面这条记录:

2、点击右侧的Configure:

3、点击DevelopmentPushSSLCertificate一行后的Configure:

4、点击Continue:

5、选择前面生成好的Push.certSigningRequest文件,点击Generate,出现如下所示的页面:

6、点击Continue:

7、点击Download,并将文件命名为aps_developer_identity.cer。

8、点击Done,你会发现状态变成了Enabled:

到现在为止,我们已经生成了三个文件:

1、Push.certSigningRequest

2、Push.p12

3、aps_developer_identity.cer

双击aps_developer_dientity.cer注册到你的钥匙串中,这样你的钥匙串中就会有

二、准备profile证书,因为推送消息只能再真机上测试,所以要建一个profile证书

点击"newprofile"为上面新建的APPID建个profile,成功之后下载*_Dev_Profile.mobileprovision

双击将其加入到xcode的ProvisioningProfiles中,这里有一点要注意,再将这个加入xcode之前如果之前已经加入过一定要把之前加入的删掉,如果有多个的话会出错。

三、工程代码

到这里证书已经准备完毕,接下来,我们在xcode中新建一个测试工程,注意设置工程的BundleIdentifier必须与上面建的APPID里的相同

在didFinishLaunchingWithOptions中加入一下代码

-(BOOL)application:

(UIApplication*)applicationdidFinishLaunchingWithOptions:

(NSDictionary*)launchOptions

{

[self.windowmakeKeyAndVisible];

[[UIApplicationsharedApplication]registerForRemoteNotificationTypes:

UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert];

returnYES;

}

-(void)application:

(UIApplication*)applicationdidRegisterForRemoteNotificationsWithDeviceToken:

(NSData*)pToken{

NSLog(@"regisgersuccess:

%@",pToken);

//注册成功,将deviceToken保存到应用服务器数据库中

}

-(void)application:

(UIApplication*)applicationdidReceiveRemoteNotification:

(NSDictionary*)userInfo{

//处理推送消息

UIAlertView*alert=[[UIAlertViewalloc]initWithTitle:

@"通知"message:

@"我的信息"delegate:

selfcancelButtonTitle:

@"取消"otherButtonTitles:

nil,nil];

[alertshow];

[alertrelease];

NSLog(@"%@",userInfo);

}

-(void)application:

(UIApplication*)applicationdidFailToRegisterForRemoteNotificationsWithError:

(NSError*)error{

NSLog(@"Registfail%@",error);

}

到这里一切顺利的话我们就可以在真机运行了,注册成功我们会得到iphone的deviceToken,

Mytokenis:

<740f4707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bb78ad>

四、在应用服务器采用php的方式将消息推送给APNS,

1、php连接APNS也是需要证书的,还记得我们上面获得的几个证书吗?

打开终端,对上面的证书做如下处理,

cd进入证书所在目录

把.cer文件转换成.pem文件:

$opensslx509-inaps_developer_identity.cer-informder

-outPushChatCert.pem

把私钥Push.p12文件转换成.pem文件:

$opensslpkcs12-nocerts-outPushChatKey.pem-inPush.p12

EnterImportPassword:

MACverifiedOK

EnterPEMpassphrase:

Verifying–EnterPEMpassphrase:

你首先需要为.p12文件输入passphrase密码短语,这样OpenSSL可以读它。

然后你需要键入一个新的密码短语来加密PEM文件。

还是使用”pushchat”来作为PEM的密码短语。

你需要选择一些更安全的密码短语。

注意:

如果你没有键入一个PEMpassphrase,OpenSSL将不会返回一个错误信息,但是产生的.pem文件里面将不会含有私钥。

最后。

把私钥和证书整合到一个.pem文件里:

$catPushChatCert.pemPushChatKey.pem>ck.pem

为了测试证书是否工作,执行下面的命令:

$telnet2195

Trying17.172.232.226…

Connectedtogateway.sandbox.push-.

Escapecharacteris‘^]’.

它将尝试发送一个规则的,不加密的连接到APNS服务。

如果你看到上面的反馈,那说明你的MAC能够到达APNS。

按下Ctrl+C关闭连接。

如果得到一个错误信息,那么你需要确保你的防火墙允许2195端口。

然后再次连接,这次用我们的SSL证书和私钥来设置一个安全的连接:

$openssls_client-connect:

2195

-certPushChatCert.pem-keyPushChatKey.pem

EnterpassphraseforPushChatKey.pem:

你会看到一个完整的输出,让你明白OpenSSL在后台做什么。

如果连接是成功的,你可以键入一些字符。

当你按下回车后,服务就会断开连接。

如果在建立连接时有问题,OpenSSL将会给你一个错误消息,

ck.pem文件就是我们需要得到php连接APNS的文件,将ck.pem和push.php放入同一目录上传到服务器,push.php的代码如下:

php

//这里是我们上面得到的deviceToken,直接复制过来(记得去掉空格)

$deviceToken='740f4707bebcf74f9b7c25d48e3358945f6aa01da5ddb387462c7eaf61bb78ad';

//Putyourprivatekey'spassphrasehere:

$passphrase='abc123456';

//Putyouralertmessagehere:

$message='Myfirstpushtest!

';

////////////////////////////////////////////////////////////////////////////////

$ctx=stream_context_create();

stream_context_set_option($ctx,'ssl','local_cert','ck.pem');

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

//OpenaconnectiontotheAPNSserver

//这个为正是的发布地址

//$fp=stream_socket_client(“ssl:

//:

2195“,$err,$errstr,60,//STREAM_CLIENT_CONNECT,$ctx);

//这个是沙盒测试地址,发布到appstore后记得修改哦

$fp=stream_socket_client(

'ssl:

//:

2195',$err,

$errstr,60,STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT,$ctx);

if(!

$fp)

exit("Failedtoconnect:

$err$errstr".PHP_EOL);

echo'ConnectedtoAPNS'.PHP_EOL;

//Createthepayloadbody

$body['aps']=array(

'alert'=>$message,

'sound'=>'default'

);

//EncodethepayloadasJSON

$payload=$body);

//Buildthebinarynotification

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

//Sendittotheserver

$result=fwrite($fp,$msg,strlen($msg));

if(!

$result)

echo'Messagenotdelivered'.PHP_EOL;

else

echo'Messagesuccessfullydelivered'.PHP_EOL;

//Closetheconnectiontotheserver

fclose($fp);

?

>

接下来我们访问http:

//localhost/push/push.php

iphone就会接收到一条推送消息了,如果有问题的话就检查上面的操作步骤,特别是加红的部分

另外去除标记的方法为,在viewDidApper中加入

intbadge=[UIApplicationsharedApplication].applicationIconBadgeNumber;

if(badge>0)

{

badge--;

[UIApplicationsharedApplication].applicationIconBadgeNumber=badge;

}

给一个参考地址:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2