• 推送通知iOS客户端编写实现及推送服务器端编写


    http://blog.csdn.net/tonny_guan/article/details/8963262

    1、iOS客户端编程

    推送通知技术在Mac OS X和iOS系统上都可以运行,我们本章主要介绍iOS客户端编程,推送通知的编程比较简单,编程的关键是获得令牌,这是从APNS返回的,然后还有把提交给内容提供商。下面我们看看开发之前的一些准备工作。

    配置Xcode工程

    编写iOS推送应用需要在Xcode工程中进行一些配置,这些配置是主要是设置代码签名标识,代码签名标识的前提要有配置概要文件(Provisioning Profiles)。

    有了配置概要文件即可以设置代码签名标识了,需要下载概要文件到本地,代码签名标识需要选择这个配置概要文件。选择TAGETS→MyNotes→Code Signing Identity,选择你自己的代码签名标识。

    20

    设置完成之后可以开始编码工作了。

    代码实现

    推送通知的代码实现主要分为两个步骤,第一步注册接收通知,第二步接收注册结果。这些工作都是在应用程序委托对象AppDelegate中实现的。

    我们先看看注册部分的代码:

    [cpp] view plaincopy
     
    1. - (BOOL)application:(UIApplication *)application  
    2.   
    3. didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
    4.   
    5. {  
    6.   
    7. //注册接收通知类型  
    8.   
    9. [[UIApplication sharedApplication] registerForRemoteNotificationTypes:  
    10.   
    11. (UIRemoteNotificationTypeBadge  
    12.   
    13. | UIRemoteNotificationTypeSound  
    14.   
    15. | UIRemoteNotificationTypeAlert)];  
    16.   
    17. //设置图标标记  
    18.   
    19. application.applicationIconBadgeNumber = 1;  
    20.   
    21. return YES;  
    22.   
    23. }  



    注册过程比较长,它通过APNS从苹果公司返回,注册结束后的回调方法代码:

    [cpp] view plaincopy
     
    1. - (void)application:(UIApplication*)application  
    2.   
    3. didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken  
    4.   
    5. {  
    6.   
    7. NSLog(@”设备令牌: %@”, deviceToken); ①  
    8.   
    9. NSString *tokeStr = [NSString stringWithFormat:@"%@",deviceToken];  ②  
    10.   
    11. if ([tokeStr length] == 0) {  
    12.   
    13. return;  
    14.   
    15. }  
    16.   
    17. NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"<>"];  
    18.   
    19. tokeStr = [tokeStr stringByTrimmingCharactersInSet:set];  ③  
    20.   
    21. tokeStr = [tokeStr stringByReplacingOccurrencesOfString:@" " withString:@""];  ④  
    22.   
    23. NSString *strURL = @”http://192.168.1.103/push_chat_service.php”; ⑤  
    24.   
    25. NSURL *url = [NSURL URLWithString:strURL];  
    26.   
    27. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];  
    28.   
    29. [request setPostValue:tokeStr forKey:@"token"];  
    30.   
    31. [request setPostValue:@"98Z3R5XU29.com.51work6.PushChat" forKey:@"appid" ];  
    32.   
    33. [request setDelegate:self];  
    34.   
    35. NSLog(@”发送给服务器”);  
    36.   
    37. [request startAsynchronous];  ⑥  
    38.   
    39. }  
    40.   
    41.    
    42.   
    43. - (void)application:(UIApplication*)application  
    44.   
    45. didFailToRegisterForRemoteNotificationsWithError:(NSError*)error  
    46.   
    47. {  
    48.   
    49. NSLog(@”获得令牌失败: %@”, error);  
    50.   
    51. }  



    2、推送服务端编程

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

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

    [cpp] view plaincopy
     
    1. {“aps” : {  
    2.   
    3. “alert” : ”You got your emails.”,  
    4.   
    5. “badge” : 9,  
    6.   
    7. “sound” : ”bingbong.aiff”  
    8.   
    9. }  
    10.   
    11. }  



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

    使用PHP实现推送服务

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

    [cpp] view plaincopy
     
    1. <?php  
    2.   
    3.    
    4.   
    5. $deviceToken= ’1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db’;  
    6.   
    7. //推送方式,包含内容和声音  
    8.   
    9. $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.   
    21. stream_context_set_option($ctx,”ssl”,”local_cert”, $pem); ③  
    22.   
    23. $pass = ”51work6.com”;  
    24.   
    25. //设置数据流上下文的密码  
    26.   
    27. stream_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.   
    37. STREAM_CLIENT_CONNECT, $ctx); ⑤  
    38.   
    39. if (!$fp) {  
    40.   
    41. echo ”连接失败.”;  
    42.   
    43. return;  
    44.   
    45. }  
    46.   
    47. print ”连接OK ”;  
    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.   
    59. echo ”发送消息:” . $payload .” ”;  
    60.   
    61. fwrite($fp, $msg);  
    62.   
    63. fclose($fp);  
    64.   
    65.    
    66.   
    67. ?>  



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

    [cpp] view plaincopy
     
    1. $ openssl pkcs12 -in 证书.p12 -out apns-dev.pem -nodes   
    2.   
    3. Enter Import Password:  
    4.   
    5. MAC 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”:”u65b0u5e74u597d. from PHP”,”badge”:11,”sound”:”default”}}

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

    使用Java推送服务

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

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

    [java] view plaincopy
     
    1. package com._51work6;  
    2.   
    3.    
    4.   
    5. import javapns.Push;  
    6.   
    7. import javapns.notification.PushNotificationPayload;  
    8.   
    9.    
    10.   
    11. public class Pusher {  
    12.   
    13.    
    14.   
    15. public static void main(String[] args) {  
    16.   
    17. try {  
    18.   
    19. PushNotificationPayload payload = new PushNotificationPayload(); ①  
    20.   
    21. payload.addCustomAlertBody(“新年好!from Java”); ②  
    22.   
    23. payload.addBadge(11);  ③  
    24.   
    25. payload.addSound(“default”); ④  
    26.   
    27.    
    28.   
    29. Push.payload(payload, ”ssl/证书.p12″, ”51work6.com”, false,  
    30.   
    31. “1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db”); ⑤  
    32.   
    33.    
    34.   
    35. catch (Exception e) {  
    36.   
    37. e.printStackTrace();  
    38.   
    39. }  
    40.   
    41. }  
    42.   
    43. }  



    上面的代码还依赖与下面的类库: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程序,这样就可以在浏览器中发送通知了。

  • 相关阅读:
    TCP拥塞控制算法 — CUBIC的补丁(二)
    TCP拥塞控制算法 — CUBIC的补丁(四)
    Class chart
    Class array
    Bool to int
    using in the function
    unsafe
    resources contain {0}
    Using Nullable Types
    Microsoft.Ink namespace
  • 原文地址:https://www.cnblogs.com/xuejinhui/p/4432164.html
Copyright © 2020-2023  润新知