1、iOS客户端编程

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

配置Xcode工程

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

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

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

代码实现

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

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

- (BOOL)application:(UIApplication *)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions{//注册接收通知类型[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge| UIRemoteNotificationTypeSound| UIRemoteNotificationTypeAlert)];//设置图标标记application.applicationIconBadgeNumber = 1;return YES;}

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

- (void)application:(UIApplication*)applicationdidRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken{NSLog(@”设备令牌: %@”, deviceToken); ①NSString *tokeStr = [NSString stringWithFormat:@"%@",deviceToken];  ②if ([tokeStr length] == 0) {return;}NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"\<\>"];tokeStr = [tokeStr stringByTrimmingCharactersInSet:set];  ③tokeStr = [tokeStr stringByReplacingOccurrencesOfString:@" " withString:@""];  ④NSString *strURL = @”http://192.168.1.103/push_chat_service.php”; ⑤NSURL *url = [NSURL URLWithString:strURL];ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];[request setPostValue:tokeStr forKey:@"token"];[request setPostValue:@"98Z3R5XU29.com.51work6.PushChat" forKey:@"appid" ];[request setDelegate:self];NSLog(@”发送给服务器”);[request startAsynchronous];  ⑥}- (void)application:(UIApplication*)applicationdidFailToRegisterForRemoteNotificationsWithError:(NSError*)error{NSLog(@”获得令牌失败: %@”, error);}

2、推送服务端编程

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

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

{“aps” : {“alert” : ”You got your emails.”,“badge” : 9,“sound” : ”bingbong.aiff”}}

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

使用PHP实现推送服务

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

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

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

$ openssl pkcs12 -in 证书.p12 -out apns-dev.pem -nodes Enter Import Password: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代码:

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程序,这样就可以在浏览器中发送通知了。

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

  1. ios客户端学习笔记(八):iOS客户端的推送通知

    iOS客户端的推送通知是指通过苹果的推送通知服务(APNs)向已安装应用程序的设备发送通知消息.这些通知可以在设备的锁屏屏幕.通知中心和应用程序内展示,以提醒用户有新的消息或事件需要处理. 推送通知通 ...

  2. iOS学习笔记22 推送通知

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

  3. iOS开发 - ANPs推送通知 标签: 推送通知ANPs远程推送、本地推送

    iOS开发 - ANPs推送通知 标签: 推送通知ANPs远程推送本地推送 2015-05-03 14:12 3510人阅读 评论(0) 收藏 举报 本文章已收录于:  iOS知识库  分类: [IO ...

  4. ios推送通知之ios推送证书的申请和使用配置

    很多人初次接触推送通知,不知道怎么去申请ios推送证书和配置推送. 很多人犯的错误就是用推送证书p12去打包ipa,推送不是用来打包的,下面详细介绍ios推证书的申请和配置使用. ios推送证书分为测 ...

  5. iOS开发 - ANPs推送通知

    推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification是抽象的,不可见的 推送通知是可见的(能用肉眼看到) iOS中提供了2种推送通知 本地推送通知(Lo ...

  6. iOS 推送通知的样式总结

    推送通知 推送通知的作用 推送通知的呈现效果 推送通知的呈现效果总结 推送通知的呈现效果设置 1. 推送通知 注意:这里说的推送通知跟NSNotification有所区别 NSNotification ...

  7. swift通知栏推送_如何使用Swift使用推送通知构建食品交付应用

    swift通知栏推送 by Neo Ighodaro 由新Ighodaro 如何使用Swift使用推送通知构建食品交付应用 (How to build a food delivery app with ...

  8. 苹果推送通知办事教程 Apple Pushnb

    原文地址:(转)苹果推送通知办事教程 Apple Push Notification Services Tutorial 作者:浪友dans 苹果推送通知办事教程 Apple Push Notific ...

  9. 本地推送通知和远程推送通知

    推送通知 推送通知跟NSNotification有所区别: 1> NSNotification是抽象的,不可见的 2> 推送通知是可见的(能用肉眼看到) iOS中提供了2种推送通知: 本地 ...

最新文章

  1. java类加载的表现形式
  2. Shell脚本十三问
  3. 科大讯飞语音转文字以及中文分词的Java测试代码
  4. 英特尔k跟kf区别_i5-9600K和i5-9600KF有什么区别
  5. 用tcc自己编译自己
  6. 小猿学python_小猿圈python入门之转行零基础该如何学Python?
  7. mergesort_Mergesort算法的功能方法
  8. 记一次Vue框架升级
  9. mybatis字符串转成数字_计算机储存数字和字符的方法你了解多少?
  10. mysql判断是否包含某个字符的方法
  11. innodb下的mvcc_InnoDB的MVCC实现原理
  12. 益智小游戏(app)
  13. HDU 2243 考研路茫茫——单词情结(AC自动机 + 矩阵快速幂)题解
  14. 密集芯片的焊接技巧:从LQFP64说起
  15. surface4 笔盖失灵的解决方案
  16. 海水淡化除硼工艺及方法
  17. win7无法连接打印机拒绝访问_win7共享打印机无法连接怎么办?win7连不上共享打印机解决方法...
  18. 腾讯编程比赛的试题,喜欢企鹅和编程的要进!
  19. android 仿蘑菇街首页,高仿蘑菇街欢迎页
  20. C语言“我的家谱”程序

热门文章

  1. HTML5期末大作业 用HTML+CSS+JS制作婚庆网页【大学生网页作业代码】
  2. PS李涛老师的课程笔记 【PS初级】绘画与修饰工具
  3. 日常办公小技巧,简单实用,早点学会早受益
  4. zzuli--1055: 兔子繁殖问题
  5. 关于2021年联合培养考试材料审核结果的解读
  6. 安装 VS2012/2013 完成时报错“无法建立到信任根颁发机构的证书链”
  7. OEA 中的多国语言实现
  8. Furl It !!
  9. CentOS搭建LNMP
  10. Java-ssm交通违法行为举报系统app毕业设计(附源码、运行环境)