【iOS】 推送服务的配置和实现

前几天给app增加了推送服务,看了好多资料,最终实现了。在此整理一下,理清思路以便以后复习。

原理分析

================================

至于推送的原理,我大致提一下:

         大致如上图:

             1)、app 向苹果推送服务器(apns)注册,注册后获取deviceToken,

             2)、然后app 把这个deviceToken 发给我们自己的推送服务器,保存下来。

             3)、当需要推送时,我们就可以通过我们推送服务器,把需要的推送的目标设备的deviceToken、推送内容等等参数 发给apns,这样apns 就会把推送内容发给相应的设备。

             基本上,ios的推送就是这样的流程。

功能实现

==================================

实现这功能,要分两部分:

1、配置app发布证书,

2、配置我们的推送服务器用的推送证书

配置app发布证书

====================

需要到开发中心 iOS Provisioning Portal-》AppID栏把相应的app开通推送服务,最终结果如下图:

如果你不清楚什么是iOS Provisioning Portal什么是appid 那就看一下这个iOS应用的真机调试,为自己的app申请一个appid。

一般注册后appid中这个push notification是黄色的,并没有开通,需要配置。下面说说如何配置:

1、首先配置推送服务需要证书,跟配置真机测试时一样没,  先要用自己的mac电脑导出一个证书,

a、打开钥匙串访问

b、 生成Certificate Signing Request (CSR):

1 2

最终保存一个PushTest.certSigningRequest 保存于桌面

2、有了这个证书后,去开发者中心配置app的推送服务

3

a)在App IDs中选择自己对应的app ,然后发现 push Notification选项是黄色的,然后点击配置

注意:如果当初在添加appid时,使用了com.pan-apps.*  这种星号统配符的,将无法使用推送功能

b)然后配置推送服务

4

由于现在只是用于开发测试,就选择第一个项,点击configure

c)下面就需要上传我们在第一步中生成的PushTest.certSigningRequest了

89

可能需要点时间,现在已经生成成功了,再继续

10

11

点击下载,我这里名字是:aps_development.cer ,,然后你会发现,推送的状态变成了绿色了

12

d )然后需要在Provisioning栏中重新创建一个profile 用于真机测试或者打包ipa,如下:

13

完成后点击下载刚生成的profile文件,如下图:

下载之后双击导入到Xcode。这样我们的有推送功能的打包证书就配置好了,下面需要我们在工程种加入相关代码,

在我们的程序的Appdelegate 文件中加入下面代码:

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

{

// Let the device know we want to receive push notifications

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:

(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];

return YES;

}

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

- (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);

}

然后在配置中code sign 字段中选择刚下载的profile 进行真机安装,有玩过真机测试的应该很清楚吧。

真机运行会获得deviceToken,

我的deviceToken如下:

现在前端的事情我们都完成了,下面剩下的就时配置一个推送服务器了。

===========================

配置我们的推送服务器用的推送证书 

1、首先导出p12文件

我们之前生成了PushTest.certSigningRequest文件,那么在钥匙串中会生成一个密钥,把它导出来

14

把它导出到桌面

15

2、生成php服务器连接苹果推送服务器APNS的证书

现在,我们已经有了3个文件:

PushTest.certSigningRequest

aps_development.cer

push.p12

我都是存在桌面的

现在我打开终端,cd到桌面,

a)、把.cer文件转换成.pem文件:

$ openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem

     b)、把私钥Push.p12文件转换成.pem文件:这里需要输入3次密码

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

         Enter Import Password:

         MAC verified OK

         Enter PEM pass phrase:

         Verifying – Enter PEM pass phrase:

c)、最后。把私钥和证书整合到一个.pem文件里:

$ cat PushChatCert.pem PushChatKey.pem > ck.pem

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

$ telnet gateway.sandbox.push.apple.com 2195

Trying 17.172.232.226…

Connected to gateway.sandbox.push-apple.com.akadns.net.

Escape character is ‘^]’.

它将尝试发送一个规则的,不加密的连接到APNS服务。如果你看到上面的反馈,那说明你的MAC能够到达APNS。按下Ctrl+C 关闭连接。如果得到一 个错误信息,那么你需要确保你的防火墙允许2195端口。

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

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

Enter pass phrase for PushChatKey.pem:

你会看到一个完整的输出,让你明白OpenSSL在后台做什么。如果连接是成功的,你可以键入一些字符。当你按下回车后,服务就会断开连接。如果 在建立连接时有问题,OpenSSL将会给你一个错误消息,

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


<?php

// 这里是我们上面得到的deviceToken,直接复制过来(记得去掉空格)
$deviceToken = '740f4707bebcf74f 9b7c25d4 8e3358945f6aa01da5ddb387462c7eaf 61bb78ad';

// Put your private key's passphrase here:  上面配置推送服务器密钥时设置的密码
$passphrase = 'abc123456';

// Put your alert message here:
$message = 'My first push test!';

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

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

// Open a connection to the APNS server
//这个为正是的发布地址
 //$fp = stream_socket_client(“ssl://gateway.push.apple.com:2195“, $err, $errstr, 60, //STREAM_CLIENT_CONNECT, $ctx);
//这个是沙盒测试地址,发布到appstore后记得修改哦
$fp = stream_socket_client(
'ssl://gateway.sandbox.push.apple.com:2195', $err,
$errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);

if (!$fp)
exit("Failed to connect: $err $errstr" . PHP_EOL);

echo 'Connected to APNS' . PHP_EOL;

// Create the payload body
$body['aps'] = array(
'alert' => $message,
'sound' => 'default'
);

// Encode the payload as JSON
$payload = json_encode($body);

// Build the binary notification
$msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;

// Send it to the server
$result = fwrite($fp, $msg, strlen($msg));

if (!$result)
echo 'Message not delivered' . PHP_EOL;
else
echo 'Message successfully delivered' . PHP_EOL;

// Close the connection to the server
fclose($fp);
?>

接下来我们访问http://localhost/push/push.php   iphone就会接收到一条推送消息了

====================

参考:

http://zxs19861202.iteye.com/blog/1532460

http://blog.csdn.net/zhuqilin0/article/details/6527113

发表评论

电子邮件地址不会被公开。 必填项已用*标注