推送通知iOS客户端编写实现及推送服务器端编写_weixin_30555753的博客-程序员宅基地

1、iOS客户端编程

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

 

配置Xcode工程

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

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

20

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

代码实现

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

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

- (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

//注册接收通知类型

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:

(UIRemoteNotificationTypeBadge

| UIRemoteNotificationTypeSound

| UIRemoteNotificationTypeAlert)];

//设置图标标记

application.applicationIconBadgeNumber = 1;

return YES;

}

 

 

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

- (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格式,例如:

{“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文件。

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

转载于:https://www.cnblogs.com/iOS-Blog/archive/2013/05/23/3094152.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_30555753/article/details/99722553

智能推荐

将Nacos注册到springboot使用以及Feign实现服务调用_nacos通过服务名调用接口_程序猿追的博客-程序员宅基地

服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现。服务注册:在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成一张服务的清单,服务注册中心需要以心跳的方式去监测清单中的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实例的访问。_nacos通过服务名调用接口

npm 新淘宝镜像域名地址_npm淘宝最新镜像地址_p@ssword的博客-程序员宅基地

配置npm config set registry https://registry.npmmirror.com/npm config set disturl https://npmmirror.com/distyarn config set registry https://registry.npmmirror.com/yarn config set disturl https://npmmirror.com/dist删除npm config delete registrynpm conf_npm淘宝最新镜像地址

开启csdn整理之路_csdn 博客整理_zymize的博客-程序员宅基地

‘’‘ 以前学过的东西总是看了又忘,忘了又看,所以今天开始计划把学到的东西用csdn博客整理出来,如果有整理的不恰当的地方或者忘记引用出处链接等欢迎大家指正,如果对你们的学习有帮助我深感荣幸’‘’..._csdn 博客整理

如何用手机修改证件照尺寸大小_怎么把图片调整为3m大小-程序员宅基地

在生活中,我们经常接触到的证件照其实大多都是一寸或两寸的规格,如果临时需要更换其他的规格,我们该如何快速应对呢?别着急,下面我就来给大家说说,手机上如何快速更换证件照尺寸。第一步,打开手机的应用商店或者手机应用宝,来找到智能证件照相机,并将它安装到手机上。第二步,打开智能证件照相机选择所要拍摄证件照的尺寸,借助手机后置摄像头来进行拍摄,就可以拍下证件照片。第三步,当手机拍好之后即可预览证件照..._怎么把图片调整为3m大小

iphone html5 浏览器缓存文件,html5中localStorage 在苹果设备上总结_乐舟川的博客-程序员宅基地

前端时间做开发的时候,用到localStorage,但是在苹果设备上出现了问题,就是在苹果设备上的浏览器中无法存储,最后花了点精力,找到了问题所在——浏览器的无痕模式,因为一般默认的是无痕模式,在无痕模式下,localStorage属于禁用的状态,所以出现了问题。if (typeof localStorage === 'object') {try{localStorage.setItem('lo..._苹果 localstorage

十种机制保护三大网络基础协议(BGP、NTP和FTP)—Vecloud微云_Vecloud的博客-程序员宅基地

除了DNS,还有其他网络基础协议也会变成攻击者的武器,该如何保护呢?涉及基础互联网协议的攻击见诸报端时,人们的视线往往集中在Web上,HTTP或DNS是绝对的主角。但历史告诉我们,其他协议也会被当做攻击脆弱公司企业的武器和入口。比如BGP(边界网关协议)、NTP(网络时间协议)和FTP(文件传输协议),就是攻击者用以破坏运营或盗取数据资产的利器。最近频发的加密货币钱包劫持事件,充分展现出了BGP劫持作为攻击链一部分的有效性。从大多数用户的角度来看,BGP的神秘源于其复杂性,而大多数公司企业仅在其网络变得

随便推点

Winform实时刷新界面的正确姿势_winform刷新界面_大鱼>的博客-程序员宅基地

1.前言最近在审核工程师代码的时候,一个简单的工厂自动化软件,结果看到了居然用Timer来刷新界面通过串口过来的数据...难怪工厂测试人员一直给我反馈说我们这个系统有时候会很卡!这样的方式来处理界面的呈现不卡死才出怪事了!2.如何界面上正确的体现实时交互数据需要了解一个接口:INotifyPropertyChanged意思是说,如果我这边的实体类数据发生了变化,会向客户端发送通知,告诉客户端来更新实体类的值,前提是实体类与界面上的客户端已经进行了绑定在实体类里面增加以下代码:_winform刷新界面

js 将复制面板的粘贴内容,样式标签去除(类似web微信输入框div)_z__a的博客-程序员宅基地

因为最近在做一个输入框支持表情文字所以输入框只能使用div了但是复制回来的内容会带样式html标签这显然很不合理,详细如下:以复制Bootstrap内容为实例,复制内容如下:粘贴处理后如下图所示:完全的将复制来的css样式,Html标签去除并且会把内容处理成有规律的格式如下图:如果感觉上面的叙述完全符合您的标准那么就废话不多说直接上代码吧!page3-e

Windows的hosts文件所在位置_hosts 文件在哪_FLy_鹏程万里的博客-程序员宅基地

有时候我们在测试一些网站时往往会发现目标网站使用了CDN,而在我们通过各种方法获取到目标的真实IP地址之后需要通过在hosts文件当中绑定ip地址与域名,进行验证,此时如何去找寻Windows系统的hosts文件呢?直接访问一下路径即可:C:\Windows\System32\drivers\etc之后使用notepad++打开,你就可以去进行绑定验证了哦!方式为:左边IP地址..._hosts 文件在哪

Hbase TimeStamp的妙用_南风知我意丿的博客-程序员宅基地

基本架构:实时写入时,需要考虑数据更新的顺序,要做到spark消费kafka里的数据是按照时间顺序消费的,不然可能5s的数据会被4s(迟到/不同分区)来的数据覆盖;实时写入的顺序,大都由CDC(canal、debezium等)控制。针对每一条数据的更新,CDC都会对“表名+主键”进行Hash,路由到Kafka对应的分区。其实针对某个表某条记录的更新,消费时是有严格的顺序的。但如果后期更改kafka分区个数,就会稍微麻烦点。如果不停服更新,就意味着同一条记录的不同更新,分布在不同的分区,也就不能保证严格的顺序_hbase timestamp

Linux内核移植与启动_L_x_b的博客-程序员宅基地

Linux内核移植与启动交叉编译器:buildroot-2012.08 Bootloader:U-boot-2010.09Target borad:FL24401. Linux内核基础知识在动手进行linux内核移植之前,我们有必要对linux内核进行一定的了解。 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如2.

2020 ArXiv之跨模态ReID:Parameters Sharing Exploration and Hetero-Center based Triplet Loss for Visible-T_reid模态差异_用GAN得有GPU的博客-程序员宅基地

Parameters Sharing Exploration and Hetero-Center based Triplet Loss for Visible-Thermal Person Re-Identification简述:采用双流网络来解决多模态识别中最具挑战性的跨模态差异问题。在本文中,我们探讨了两流网络应该共享多少个参数,这在现有文献中仍未得到很好的研究。同时,提出了提出了hetero-center based triplet loss,通过将anchor与其他所有样本的比较改为anchor_reid模态差异

推荐文章

热门文章

相关标签