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,选择你自己的代码签名标识。

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

代码实现

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

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

  1. - (BOOL)application:(UIApplication *)application
  2. didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  3. {
  4. //注册接收通知类型
  5. [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
  6. (UIRemoteNotificationTypeBadge
  7. | UIRemoteNotificationTypeSound
  8. | UIRemoteNotificationTypeAlert)];
  9. //设置图标标记
  10. application.applicationIconBadgeNumber = 1;
  11. return YES;
  12. }

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

  1. - (void)application:(UIApplication*)application
  2. didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
  3. {
  4. NSLog(@”设备令牌: %@”, deviceToken); ①
  5. NSString *tokeStr = [NSString stringWithFormat:@"%@",deviceToken];  ②
  6. if ([tokeStr length] == 0) {
  7. return;
  8. }
  9. NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"\<\>"];
  10. tokeStr = [tokeStr stringByTrimmingCharactersInSet:set];  ③
  11. tokeStr = [tokeStr stringByReplacingOccurrencesOfString:@" " withString:@""];  ④
  12. NSString *strURL = @”http://192.168.1.103/push_chat_service.php”; ⑤
  13. NSURL *url = [NSURL URLWithString:strURL];
  14. ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
  15. [request setPostValue:tokeStr forKey:@"token"];
  16. [request setPostValue:@"98Z3R5XU29.com.51work6.PushChat" forKey:@"appid" ];
  17. [request setDelegate:self];
  18. NSLog(@”发送给服务器”);
  19. [request startAsynchronous];  ⑥
  20. }
  21. - (void)application:(UIApplication*)application
  22. didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
  23. {
  24. NSLog(@”获得令牌失败: %@”, error);
  25. }

2、推送服务端编程

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

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

  1. {“aps” : {
  2. “alert” : ”You got your emails.”,
  3. “badge” : 9,
  4. “sound” : ”bingbong.aiff”
  5. }
  6. }

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

使用PHP实现推送服务

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

  1. <?php
  2. $deviceToken= ’1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db’;
  3. //推送方式,包含内容和声音
  4. $body = array(“aps” => array(“alert” => ’新年好. from PHP’,”badge” => 11,”sound”=>’default’)); ①
  5. //创建数据流上下文对象
  6. $ctx = stream_context_create();
  7. //设置pem格式文件
  8. $pem = ”apns-dev.pem”; ②
  9. //设置数据流上下文的本地认证证书
  10. stream_context_set_option($ctx,”ssl”,”local_cert”, $pem); ③
  11. $pass = ”51work6.com”;
  12. //设置数据流上下文的密码
  13. stream_context_set_option($ctx, ’ssl’, ’passphrase’, $pass);  ④
  14. //产品发布APNS服务器,gateway.push.apple.com
  15. //测试APNS服务器,gateway.sandbox.push.apple.com
  16. //socket通讯
  17. $fp = stream_socket_client(“ssl://gateway.sandbox.push.apple.com:2195″, $err, $errstr, 60,
  18. STREAM_CLIENT_CONNECT, $ctx); ⑤
  19. if (!$fp) {
  20. echo ”连接失败.”;
  21. return;
  22. }
  23. print ”连接OK\n”;
  24. //载荷信息,JSON编码
  25. $payload = json_encode($body); ⑥
  26. //构建发送的二进制信息
  27. $msg = chr(0) . pack(“n”,32) . pack(“H*”, str_replace(‘ ’, ”, $deviceToken))
  28. . ack(“n”,strlen($payload)) . $payload; ⑦
  29. echo ”发送消息:” . $payload .”\n”;
  30. fwrite($fp, $msg);
  31. fclose($fp);
  32. ?>

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

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

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

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

另外一种方法,简单的多,我们不需要安装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代码:

  1. package com._51work6;
  2. import javapns.Push;
  3. import javapns.notification.PushNotificationPayload;
  4. public class Pusher {
  5. public static void main(String[] args) {
  6. try {
  7. PushNotificationPayload payload = new PushNotificationPayload(); ①
  8. payload.addCustomAlertBody(“新年好!from Java”); ②
  9. payload.addBadge(11);  ③
  10. payload.addSound(“default”); ④
  11. Push.payload(payload, ”ssl/证书.p12″, ”51work6.com”, false,
  12. “1634899aef6c71ed5c0667d6658677a914c5ec3b545887e8173854970dee24db”); ⑤
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. }

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

推送通知iOS客户端编写实现及推送服务器端编写的更多相关文章

  1. iOS 远程推送通知

    1.什么是推送通知 在某些特殊情况下,应用程序被动收到的以不同种界面形式出现的提醒信息 推送通知的作用:可以让不在前台运行的app通知app发生了改变 iOS中得推送通知种类 远程推送通知(Remot ...

  2. ios如何实现推送通知

    推送通知的步骤:1.询问是否允许推送通知.2.如果用户允许在APPDELEGATE 中实现 - (void)application:(UIApplication *)application didRe ...

  3. IOS 远程推送通知(UIRemoteNotification)

    ●  什么是远程推送通知 ●  顾名思义,就是从远程服务器推送给客户端的通知(需要联网) ●  远程推送服务,又称为APNs(Apple Push Notification Services) ●   ...

  4. iOS 本地推送通知

    1.什么是本地推送通知 不需要联网的情况下,应用程序经由系统发出的通知 2.本地推送的使用场景 定时提醒,如玩游戏.记账.闹钟.备忘录等 3.实现本地推送通知的步骤 创建本地推送通知的对象UILoca ...

  5. 移动设备和SharePoint 2013 - 第3部分:推送通知

    博客地址:http://blog.csdn.net/foxdave 原文地址 在该系列文章中,作者展示了SharePoint 2013最显著的新功能概观--对移动设备的支持. 该系列文章: 移动设备和 ...

  6. 推送通知/传感器/UIDynamic仿真(推送通知已适配iOS10)

    推送通知/传感器/UIDynamic 一.推送通知 1.推送通知简介 什么是推送通知 此处的推送通知与NSNotification没有任何关系 可以理解为,向用户推送一条信息来通知用户某件事情 作用: ...

  7. (转)苹果推送通知服务教程 Apple Push Notification Services Tutorial

    本文译自http://www.raywenderlich.com/.原文由iOS教程团队 Matthijs Hollemans 撰写,经原网站管理员授权本博翻译. 在iOS系统,考虑到手机电池电量,应 ...

  8. iOS学习笔记22-推送通知

    一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. 推送通知的常用应用场景: 一些任务管理APP ...

  9. Swift 本地推送通知UILocalNotification

    Notification是智能手机应用开发中常用的信息传递机制,它不用消耗更多资源去不停的检查信息状态,可以非常好的节省资源. 在iOS中分为两种通知:本地.远程.本地的UILocalNotifica ...

随机推荐

  1. K-均值聚类——电影类型

    K-均值聚类 K-均值算法试图将一系列样本分割成K个不同的类簇(其中K是模型的输入参数),其形式化的目标函数称为类簇内的方差和(within cluster sum of squared errors ...

  2. Android 第三方库RxLifecycle使用

    1.简单介绍RxLifecycle 1.1.使用原因. 在使用rxjava的时候,如果没有及时解除订阅,在退出activity的时候,异步线程还在执行. 对activity还存在引用,此时就会产生内存 ...

  3. 7,MongoDB 之 Limit 选取 Skip 跳过 Sort 排序

    我们已经学过MongoDB的 find() 查询功能了,在关系型数据库中的选取(limit),排序(sort) MongoDB中同样有,而且使用起来更是简单 首先我们看下添加几条Document进来 ...

  4. 1,VMware与Centos系统安装

    选择性 pc可以选择 -纯系统 Linux/windows -双系统 Windows+Linux -虚拟化技术 Windows+vmware workstation 服务器 -物理机纯系统 -物理机+ ...

  5. 9.1 mysql+centos7+主从复制

    MYSQL(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可.开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的 ...

  6. 直接选择排序&堆排序

    1.什么是直接选择排序? 直接选择排序(Straight Select Sort)是一种简单的排序方法,它的基本思想是:通过n-i次关键字之间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i ...

  7. JavaSE总结--面向对象

    封装: 1)为什么要用private修饰 保护属性或方法不被别人随意调用. 继承: 继承模型: 多态: 接口: 抽象类: 内部类: 在编译时用$分隔. 访问局部变量,该变量必须用final修饰. 向下 ...

  8. 《Cracking the Coding Interview》——第9章:递归和动态规划——题目5

    2014-03-20 03:23 题目:给定一个字符串,输出其全排列. 解法:可以调用STL提供的next_permutation(),也可以自己写一个.对于这种看起来简单的题目,应该在能优化的地方, ...

  9. 《Cracking the Coding Interview》——第1章:数组和字符串——题目3

    2014-03-18 01:32 题目:对于两个字符串,判断它们是否是Anagrams. 解法:统计俩单词字母构成是否相同即可. 代码: // 1.3 Given two strings, write ...

  10. (原)Unreal 渲染模块 渲染流程

    @author:白袍小道 浏览分享随缘,评论不喷亦可.     扯淡部分: 在temp中,乱七八糟的说了下大致的UE过程.下面我们还是稍微别那么任性,一步步来吧.     UE渲染模块牵扯到场景遍历. ...