服务器第三方ios推送方式

来源:互联网 发布:sp版羽毛球拍淘宝店 编辑:程序博客网 时间:2024/06/04 18:19

2、推送服务端编程

内容提供者接收到设备的令牌并保存起来,在有新的内容需要推送的时候,他们将启动一个服务程序逐个设备推送他们的内容。在推送具体的过程中并非直接 由内容提供者,直接发送给用户设备,而是服务程序与APNS通讯建立信任连接,然后把数据推送给APNS,再由APNS利用安全通道推送给用户设备。

如果要编写内容提供者的推送服务程序,我们需要进行SSL认证编程,以及构建APNS数据包,数据包分为3个主要部分:Command(命令)、deviceToken(令牌)和Payload(载荷)。载荷不能超过256字节,是JSON格式,例如:

01{“aps” : {
02 
03“alert” : ”You got your emails.”,
04 
05“badge” : 9,
06 
07“sound” : ”bingbong.aiff”
08 
09}
10 
11}


作为推出服务程序可以使用很多计算机语言实现,如果从便于管理角度看,使用PHP、Java和.NET,甚至是Note.js都是可以选择的。本书重点介绍PHP和Java编写推送服务程序。

使用PHP实现推送服务

PHP是非常不错的服务器端脚本,这么多年来没有被JavaEE和.NET蚕食掉,说明它有过人之处。PHP编程简单很多人原意使用,实现本章推送服务也很简单。下面代码是实现了推送的PHP代码:

01<?php
02 
03  
04 
05$deviceToken= ’1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db’;
06 
07//推送方式,包含内容和声音
08 
09$body = array(“aps” => array(“alert” => ’新年好. from PHP’,”badge” => 11,”sound”=>’default’)); ①
10 
11//创建数据流上下文对象
12 
13$ctx = stream_context_create();
14 
15//设置pem格式文件
16 
17$pem = ”apns-dev.pem”; ②
18 
19//设置数据流上下文的本地认证证书
20 
21stream_context_set_option($ctx,”ssl”,”local_cert”, $pem); ③
22 
23$pass = ”51work6.com”;
24 
25//设置数据流上下文的密码
26 
27stream_context_set_option($ctx, ’ssl’, ’passphrase’, $pass);  ④
28 
29//产品发布APNS服务器,gateway.push.apple.com
30 
31//测试APNS服务器,gateway.sandbox.push.apple.com
32 
33//socket通讯
34 
35$fp = stream_socket_client(“ssl://gateway.sandbox.push.apple.com:2195″, $err, $errstr, 60,
36 
37STREAM_CLIENT_CONNECT, $ctx); ⑤
38 
39if (!$fp) {
40 
41echo ”连接失败.”;
42 
43return;
44 
45}
46 
47print ”连接OK\n”;
48 
49//载荷信息,JSON编码
50 
51$payload = json_encode($body); ⑥
52 
53//构建发送的二进制信息
54 
55$msg = chr(0) . pack(“n”,32) . pack(“H*”, str_replace(‘ ’, ”, $deviceToken))
56 
57. ack(“n”,strlen($payload)) . $payload; ⑦
58 
59echo ”发送消息:” . $payload .”\n”;
60 
61fwrite($fp, $msg);
62 
63fclose($fp);
64 
65  
66 
67?>


打开终端窗口执行如下命令:

1$ openssl pkcs12 -in 证书.p12 -out apns-dev.pem -nodes
2 
3Enter Import Password:
4 
5MAC verified OK


回车后需要输入密码,这个密码是导出“证书.p12”时候设置的密码。

PHP代码编写完成可以运行PHP了,有两种方法可以运行,一种是把这个文件放到Apache HTTP服务器目录下,并保证Apache下安装和 PHP,然后用浏览器运行,在浏览器中输入http://localhost/phpPNs/Pusher.php,这个URL是我自己 Apache HTTP服务器上的PHP文件。

21

另外一种方法,简单的多,我们不需要安装Apache HTTP服务器,只需要安装了PHP解释器就可以了,我们在终端中运行下面的指令:

$ php -f Pusher.php

连接OK

发送消息:{“aps”:{“alert”:”\u65b0\u5e74\u597d. from PHP”,”badge”:11,”sound”:”default”}}

这样就可以推送通知了,如果一切正常推送成功,用户的设备就可以接收到通知了。

使用Java推送服务

上面我们介绍了PHP实现的推送服务程序,使用其它语言编写基本的过程也一样的,这一节我们就介绍Java推送服务程序。由于具体的流程与PHP一 样,这里我们就不再自己编写Java的实现代码,而是使用别人已经封装好的javapns(http://code.google.com/p /javapns/)类库,它封装了socket实现细节问题,开发起来变的比较简单了。

下面代码是实现了推送的Java代码:

package com._51work6; import javapns.Push;import javapns.notification.PushNotificationPayload; public class Pusher { public static void main(String[] args) {try {PushNotificationPayload payload = new PushNotificationPayload(); ①payload.addCustomAlertBody(“新年好!from Java”); ②payload.addBadge(11);  ③payload.addSound(“default”); ④ Push.payload(payload, ”ssl/证书.p12″, ”51work6.com”, false,“1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db”); ⑤ } catch (Exception e) {e.printStackTrace();}}}


上面的代码还依赖与下面的类库:bcprov-jdk15-146.jar、JavaPNS_2.2.jar和log4j-1.2.15.jar。 其中bcprov-jdk15-146.jar和JavaPNS_2.2.jar可以在http://code.google.com/p /javapns/下载到。log4j-1.2.15.jar到http://logging.apache.org/log4j/1.2 /download.html下载。

这个Java程序的运行我们就不再介绍了,它是一个Java Application可以在有jre环境运行,我们可以把它做成JavaWeb程序,这样就可以在浏览器中发送通知了。


准备工作

1.获取手机注册应用的deviceToken(iphone手机注册应用时返回唯一值deviceToken)

2.获取ck.pem文件(做手机端的给)

3.获取pass phrase(做手机端的给)

 

testpush.php文件

[php] view plaincopy
  1. <?php  
  2. //手机注册应用返回唯一的deviceToken  
  3. $deviceToken = '6ad7b13f b05e6137 a46a60ea 421e5016 4b701671 cc176f70 33bb9ef4 38a8aef9';  
  4. //ck.pem通关密码  
  5. $pass = 'jetson';     
  6. //消息内容  
  7. $message = 'A test message!';  
  8. //badge我也不知是什么  
  9. $badge = 4;  
  10. //sound我也不知是什么(或许是推送消息到手机时的提示音)  
  11. $sound = 'Duck.wav';  
  12. //建设的通知有效载荷(即通知包含的一些信息)  
  13. $body = array();  
  14. $body['id'] = "4f94d38e7d9704f15c000055";  
  15. $body['aps'] = array('alert' => $message);  
  16. if ($badge)  
  17.   $body['aps']['badge'] = $badge;  
  18. if ($sound)  
  19.   $body['aps']['sound'] = $sound;  
  20. //把数组数据转换为json数据  
  21. $payload = json_encode($body);  
  22. echo strlen($payload),"\r\n";  
  23.   
  24. //下边的写法就是死写法了,一般不需要修改,  
  25. //唯一要修改的就是:ssl://gateway.sandbox.push.apple.com:2195这个是沙盒测试地址,ssl://gateway.push.apple.com:2195正式发布地址  
  26. $ctx = stream_context_create();  
  27. stream_context_set_option($ctx'ssl''local_cert''ck.pem');    
  28. stream_context_set_option($ctx'ssl''passphrase'$pass);  
  29. $fp = stream_socket_client('ssl://gateway.sandbox.push.apple.com:2195'$err$errstr, 60, STREAM_CLIENT_CONNECT, $ctx);  
  30. if (!$fp) {  
  31.     print "Failed to connect $err $errstr\n";  
  32.     return;  
  33. }  
  34. else {  
  35.    print "Connection OK\n<br/>";  
  36. }  
  37. // send message  
  38. $msg = chr(0) . pack("n",32) . pack('H*'str_replace(' '''$deviceToken)) . pack("n",strlen($payload)) . $payload;  
  39. print "Sending message :" . $payload . "\n";    
  40. fwrite($fp$msg);  
  41. fclose($fp);  
  42. ?>  



0 0
原创粉丝点击