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

简介:

1、iOS客户端编程

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


配置Xcode工程

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

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

20

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

代码实现

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

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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- ( void )application:(UIApplication*)application
didRegisterForRemoteNotificationsWithDeviceToken:(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*)application
didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
NSLog(@”获得令牌失败: %@”, error);
}

2、推送服务端编程

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

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

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

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

使用PHP实现推送服务

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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文件。

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代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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程序,这样就可以在浏览器中发送通知了。



本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1207436,如需转载请自行联系原作者

相关文章
|
1月前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
|
1月前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
|
19天前
|
网络协议 网络架构
【网络编程入门】TCP与UDP通信实战:从零构建服务器与客户端对话(附简易源码,新手友好!)
在了解他们之前我们首先要知道网络模型,它分为两种,一种是OSI,一种是TCP/IP,当然他们的模型图是不同的,如下
|
1月前
|
Java Android开发
Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。
【6月更文挑战第23天】 Java Socket编程示例:服务器开启在8080端口监听,接收客户端连接并打印消息。客户端连接服务器,发送&quot;Hello, Server!&quot;后关闭。注意Android中需避免主线程进行网络操作。
48 4
|
10天前
|
安全 网络协议 网络安全
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
SSL(Secure Sockets Layer)是一种安全协议,用于在客户端和服务器之间建立加密的通信通道。
|
13天前
|
Java 数据格式
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
Java面试题:简述Java Socket编程的基本流程,包括客户端和服务器的创建与通信。
16 0
|
21天前
|
网络协议 网络安全
使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端
使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端
48 0
|
24天前
|
消息中间件 Serverless 网络性能优化
消息队列 MQ产品使用合集之客户端和服务器之间的保活心跳检测间隔是怎么设置的
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
27天前
|
前端开发 API 开发工具
视觉智能开放平台产品使用合集之人脸识别客户端如何直接访问服务器进行人脸识别并传递视频流
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
1月前
|
网络协议 Java Linux
探索Java Socket编程:实现跨平台客户端-服务器通信的奥秘
【6月更文挑战第21天】Java Socket编程示例展示了如何构建跨平台聊天应用。服务器端使用`ServerSocket`监听客户端连接,每个连接启动新线程处理。客户端连接服务器,发送并接收消息。Java的跨平台能力确保代码在不同操作系统上无需修改即可运行,简化开发与维护。

热门文章

最新文章