IOS 基于APNS消息推送原理与实现(JAVA后台)

Push的原理:
Push 的工作机制可以简单的概括为下图
图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用.net作为Provider。
APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。
上图可以分为三个阶段。
第一阶段:Push服务器应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。
第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。
第三阶段:iPhone把发来的消息传递给相应的应用程序, 并且按照设定弹出Push通知。
从上图我们可以看到。
1、首先是应用程序注册消息推送。
2、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。
3、应用程序将deviceToken发送给PUSH服务端程序。
4、 服务端程序向APNS服务发送消息。
5、APNS服务将消息发送给iPhone应用程序。
无论是iPhone客户端跟APNS,还是Provider和APNS都需要通过证书进行连接的。下面介绍一下所用到证书的制作。
一、CSR文件

1、生成Certificate Signing Request(CSR)
2、填写你的邮箱和常用名称,并选择保存到硬盘。
点击继续:
这样就在本地生成了一个PushTest.certSigningRequest文件。


二、SSL certificate文件

1、用你付过费的帐号登录到iOS Provisioning Portal,并创建Certificates(已创建可省略),如下图:
点击Submit
创建Certificate完毕。
2、新建一个App ID
点击New App ID
输入Description,Bundle Identifier,点击Submit,新建App ID完毕。
找到新建的App ID 点击右侧的Configure:
Development Push SSL Certificate ,与Production Push SSL Certificate 区别在于一个是用于开发的推送证书,一个是用于发布产品的推送证书。两个证书获取到的终端deviceToken是不一样的,用两个证书生成的P12证书用于JAVA后台连接APNS的服务器地址也是不同的,Development Push SSL Certificate 对应连接的服务器地址是:gateway.sandbox.push.apple.com。Production Push SSL Certificate  对应连接的服务器地址是:gateway.push.apple.com。
点击Development Push SSL Certificate一行后的Configure:
点击Continue:
选择前面生成好的PushTest.certSigningRequest文件,点击Generate,出现如下所示的页面:
点击Continue:
点击Download,下载生成的支持推送服务的证书(命名为:aps_development-6.cer)。

点击Done,你会发现状态变成了Enabled:
到现在为止,我们已经生成了两个文件:
1、PushTest.certSigningRequest
2、aps_development-6.cer(下载生成的支持推送服务的证书。)
双击aps_development-6.cer注册到你的钥匙串中,这样你的钥匙串中就会有
三、准备profile证书,因为推送消息只能在真机上测试,所以要建一个profile证书
点击"new profile"为上面新建的APP ID建个profile ,成功之后下载pushtestdescDevprofile.mobileprovision
双击将其加入到xcode 的Provisioning Profiles 中。
四、生成JAVA后台用于连接APNS的证书:
打开钥匙串
选中Apple Development IOS Push Services:com.easecom.zhwgpushtestdesc,右键将其导出。
导出用于JAVA后台连接APNS的P12证书。
输入p12 证书的密码,本文中我用的是123456。记住这个密码,JAVA后台使用p12证书的时候要用到。
输入访问钥匙串的密码:系统登陆密码。
导出PushTest.p12证书完毕。
到现在为止,我们已经生成了四个文件:
1、PushTest.certSigningRequest
2、aps_development-6.cer(下载生成的支持推送服务的证书。)
3、pushtestdescDevprofile.mobileprovision
4、PushTest.p12
至此IOS消息推送(JAVA后台)证书全部制作完毕。
下面开始上代码:
五、IOS端代码:
1、首先在项目的AppDelegate.m中加入以下两个代理方法
复制代码
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [NSString stringWithFormat:@"%@", deviceToken];//获取终端设备标识,这个标识需要通过接口发送到服务器端,服务器端推送消息到APNS时需要知道终端的标识,APNS通过注册的终端标识找到终端设备。NSLog(@"My token is:%@", token);   
}  
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {   NSString *error_str = [NSString stringWithFormat: @"%@", error];   NSLog(@"Failed to get token, error:%@", error_str);   
}
复制代码

2、在AppDelegate.m的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入注册消息通知推送能力;加入当应用程序处于未启动状态时,判断是否由远程消息通知触发;加入清除消息推送通知标记。

 

复制代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{//判断是否由远程消息通知触发应用程序启动if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {//获取应用程序消息通知标记数(即小红圈中的数字)int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;if (badge>0) {//如果应用程序消息通知标记数(即小红圈中的数字)大于0,清除标记。badge--;//清除标记。清除小红圈中数字,小红圈中数字为0,小红圈才会消除。[UIApplication sharedApplication].applicationIconBadgeNumber = badge;}}//消息推送注册[[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
}
3、在项目AppDelegate.m中加入消息接收处理代理方法。
//处理收到的消息推送
- (void)application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo
{//在此处理接收到的消息。NSLog(@"Receive remote notification : %@",userInfo);
}
复制代码

六、JAVA后台代码:

复制代码
public static void main(String[] args) throws Exception 
{try{//从客户端获取的deviceToken,在此为了测试简单,写固定的一个测试设备标识。String deviceToken = "df779eda 73258894 5882ec78 3ac7b254 6ebc66fe fa295924 440d34ad 6505f8c4"System.out.println("Push Start deviceToken:" + deviceToken);//定义消息模式PayLoad payLoad = new PayLoad();payLoad.addAlert("this is test!");payLoad.addBadge(1);//消息推送标记数,小红圈中显示的数字。payLoad.addSound("default");//注册deviceTokenPushNotificationManager pushManager = PushNotificationManager.getInstance();pushManager.addDevice("iPhone", deviceToken);//连接APNSString host = "gateway.sandbox.push.apple.com";//String host = "gateway.push.apple.com";int port = 2195;String certificatePath = "c:/PushTest.p12";//前面生成的用于JAVA后台连接APNS服务的*.p12文件位置String certificatePassword = "123456";//p12文件密码。pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);//发送推送Device client = pushManager.getDevice("iPhone");System.out.println("推送消息: " + client.getToken()+"\n"+payLoad.toString() +" ");pushManager.sendNotification(client, payLoad);//停止连接APNSpushManager.stopConnection();//删除deviceTokenpushManager.removeDevice("iPhone");System.out.println("Push End");}catch (Exception ex){ex.printStackTrace();}
}
}
复制代码

转载于:https://www.cnblogs.com/wangjuneng/p/4519457.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/375954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

suse linux 查看cpu,Suse Linux zmd 耗用100% CPU

最近的SUSE Linux 10(SP3)的top命令总是显示zmd进程耗用了100%的CPU资源,而整个系统中system级别占用CPU则占用了40%以上且根本不曾释放。尝试重启服务器之后,故障依旧。下面是这个问题的描述与处理。1、top命令显示zmd cpu占用100%,system u…

linux系统调用open、write、close、read以及stat函数详解

学习笔记 参考链接1 、参考链接2以及百度百科 在进行C语言学习的时候我们了解到了C语言相关的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相关函数,他们都是由C库函数提供的一些函数,是…

关于objective-c的一点随笔

多日混迹cocoachina,这篇随笔算是积累点前人经验吧。 首先,要多逛两个很好的网站,Stack Overflow和github. 对于新人,一定要注意良好的格式和命名,不然对于日后回头看代码会非常难,oc不限制变量名称和函数名…

【转载】Ubuntu环境下配置Android Studio

之前学习Android开发的时候,一直跟各种教程一样,使用的是EclipseADT,主要是比较方便,容易上手,特别是对于习惯用Eclipse开发java的朋友来说,上手更是好无压力。但毕竟EclipseADT最多只能算Google的干儿子&a…

linux怎么进去vi编辑器,red hat enterprise linux开机怎么进入vi编辑器界面?

2015-05-21 回答后面输入直接打回车就会显示出来如下xx文件#■sa■jsadjk#■sa■jsklfjdl kl■sa:----现在是低行模式 现在按esc 进入第一个模式(命令模式)就变成下面xx文件#dsadjsadjk#dsadjsklfjdl kldsa现在我们按个v 就进入可是模式 现在我们一个移动光标选择要…

数据结构--链式线性表

环境&#xff1a;dev c #include<stdio.h> #include<stdlib.h>typedef struct LNode *List; typedef int ElementType;struct LNode{ElementType Data;List next; };int Length(List Ptrl); List FindKth(int k,List Ptrl); List Find(ElementType x,List Ptrl); …

linux査 到漠河 装apache,如何在Ubuntu上搭建一台安全的Apache Web服务器

满意答案1.安装Apache2使用下面这个命令&#xff0c;安装Apache2及其他库。1$ sudo apt-get -y install apt-get install apache2 apache2.2-common apache2-doc apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-php5 php5 php5-common php5-gd php5-cli…

vs2010 中添加 ActiveX Control Test Container工具

vs2010中的TSTCON( ActiveX Control Test Container )工具非自动安装&#xff0c;而是作为一个例程提供。所以应找到该例程&#xff0c;并编译&#xff1a; 如vs2010安装在默认路径则 1, 进入&#xff1a;C:\Program Files\Microsoft Visual Studio 10.0\Samples\1033&#xff…

linux c实现mypwd

这个其实很简单&#xff0c;只需要调用getcwd()这个函数就行了。 char *getcwd(char *buffer,int maxlen); 功能&#xff1a;获取当前工作目录 参数&#xff1a;buffer指向用来存储绝对路径的数组&#xff0c;maxlen绝对路径的字符大小 返回&#xff1a;成功则返回当前的工作目…

安装Discuz

1.下载Discuz 版本文件http://download.comsenz.com/DiscuzX/3.2/Discuz_X3.2_SC_GBK.zip2.下载PHPhttp://windows.php.net/downloads/releases/php-5.6.9-Win32-VC11-x64.zip把里面文件的php.ini-development 更名为php.ini Uncomment下列语句 extension_dir "ext"…

linux跑caffe模型的步骤,Caffe初步实践——使用训练好的模型完成语义分割任务

Caffe刚刚安装配置结束&#xff0c;乘热打铁&#xff01;(一)环境准备前面我有两篇文章写到caffe的搭建&#xff0c;第一篇cpu only &#xff0c;第二篇是在服务器上搭建的&#xff0c;其中第二篇因为硬件环境更佳我们的步骤稍显复杂。其实&#xff0c;第二篇也仅仅是caffe的初…

关于 Code First

第一感觉还是很新鲜的&#xff0c;你可以自由的控制数据结构。 比如&#xff0c;你想象oracle那样&#xff0c;给每个表增加4个字段&#xff0c;创建人&#xff0c;创建时间&#xff0c;更新人&#xff0c;更新时间。完全可以创建一个父类包含着四个属性&#xff08;甚至可以把…

灵悟礼品网上专卖店——新建数据库

一、小组成员&#xff1a; 洪雪意&#xff08;产品负责人&#xff09; 陈淑筠&#xff08;Master&#xff09; 二、组内人员任务情况 计划完成的任务的第三个模块&#xff1a;分析并建立数据库 已完成的任务&#xff1a; 任务的第三个模块&#xff1a; 陈淑筠&#xff08;负责…

操作系统上机题目(多进程1)

1、创建1个子进程2、程通过管道与子进程连接 子进程的标准输出连接到管道的写端主进程的标准输入连接到管道的读端3、进程中调用exec(“echo”, “echo”, “hello world”, NULL)4、进程中调用read(0, buf, sizeof(buf))&#xff0c;从标准输入中获取子进程发送的字符串&…

Oracle数据库dmp文件Dos命令下导入导出

Oracle数据库dmp文件Dos命令下导入导出 2013-03-09 18:22:52| 分类&#xff1a; Oracle |举报|字号 订阅 数据导出: 一. 导出工具exp 他是操作系统下一个可执行的文件,存放目录/Oracle_Home/bin. exp导出工具将数据库中数据备份压缩成一个二进制系统文件,可以在不同的OS间迁…

c语言报错找不到标识符,error C3861: “_T”: 找不到标识符

头天好好的程序&#xff0c;第二天一早就报错&#xff0c;还是莫名其妙的错误&#xff1a;atlconv.h等头文件中的“_T” 报错&#xff0c;百思不得其解&#xff0c;各种搜索而不得&#xff0c;整个人都崩溃了。出问题一定是有原因的&#xff0c;后来冷静下来&#xff0c;缕缕思…

js 面向对象插件写法,还是很好理解的

/** * Created by jiangtao on 2015/5/12. * name jihe */(function () { function gather(msg) { //适应参数 if (msg) { if (msg.imgFile ! undefined) { this.imgFile msg.imgFile; }; if (msg.wechatAppid ! undefined) { this.wechatAppid msg.wechatAppid; }; }; this.…

操作系统上机题目(多进程2)

1、主进程创建2个子进程&#xff0c;主进程通过两个管道分别与两个子进程连接2、第一个子进程计算从1加到50的和&#xff0c;并将结果通过管道送给父进程3、第一个子进程计算从50加到100的和&#xff0c;并将结果通过管道送给父进程4、父进程读取两个子进程的结果&#xff0c;将…

JavaScript 的简介

JavaScript 是一种基于对象和事件驱动的脚本语言。JavaScript和HTML一起实现网页与客户端的交互&#xff0c;从而可以开发客户端的应用程序。JavaScript是通过潜入在标准的HTML文件中实现的&#xff0c;可以直接控制浏览器窗口个元素以及页面内容。JavaScript一个重要的功能就是…

c语言大乐透编译,Excel大乐透摇号vba代码分享,说不定就中百万了呢

大家好我是Excel从零到一&#xff0c;今天闲来无聊做了一套大乐透摇号程序的vba代码分享给大家来看下效果Excel大乐透摇号vba代码分享&#xff0c;说不定就中百万了呢Sub 摇号()Dim i, a, test, s(1 To 35) As IntegerFor i 1 To 5line1: test Application.WorksheetFunction…