[绍棠] iOS远程推送原理及实现过程

标签: ios 推送 原理 | 发表时间:2016-05-12 09:05 | 作者:happyshaotang2
出处:http://blog.csdn.net

推送通知,是现在的应用必不可少的功能。那么在 iOS 中,我们是如何实现远程推送的呢?iOS 的远程推送原理又是什么呢?在做 iOS 远程推送时,我们会遇到各种各样的问题。那么首先让我们准备一些做推送需要的东西。我们需要一个付费的苹果开发者账号(免费的不可以做远程推送),有了开发者账号,我们可以去苹果开发者网站,配置自己所需要的推送的相关证书。然后下载证书,供我们后面使用,详细的证书配置过程,我们下面再说。

首先我们要说说iOS推送通知的基本原理:

苹果的推送服务通知是由自己专门的推送服务器APNs (Apple Push Notification service)来完成的,其过程是 APNs 接收到我们自己的应用服务器发出的被推送的消息,将这条消息推送到指定的 iOS 的设备上,然后再由 iOS设备通知到我们的应用程序,我们将会以通知或者声音的形式收到推送回来的消息。 iOS 远程推送的前提是,装有我们应用程序的 iOS 设备,需要向 APNs 服务器注册,注册成功后,APNs 服务器将会给我们返回一个 devicetoken,我们获取到这个 token 后会将这个 token 发送给我们自己的应用服务器。当我们需要推送消息时,我们的应用服务器将消息按照指定的格式进行打包,然后结合 iOS 设备的 devicetoken 一起发给 APNs 服务器。我们的应用会和 APNs 服务器维持一个基于 TCP 的长连接,APNs 服务器将新消息推送到iOS 设备上,然后在设备屏幕上显示出推送的消息。

设备注册APNs的流程图:

1.2222.png

上图完成了如下步骤:

1.Device(设备)连接APNs服务器并携带设备序列号(UUID)

2.连接成功,APNs经过打包和处理产生devicetoken并返回给注册的Device(设备)

3.Device(设备)携带获取的devicetoken发送到我们自己的应用服务器

4.完成需要被推送的Device(设备)在APNs服务器和我们自己的应用服务器的注册

推送过程图:

1.333.png

推送的过程经过如下步骤:

1.首先,我们的设备安装了具有推送功能的应用(应用程序要用代码注册消息推动),我们的 iOS设备在有网络的情况下会连接APNs推送服务器,连接过程中,APNS 服务器会验证devicetoken,连接成功后维持一个基于TCP 的长连接;

2.Provider(我们自己的应用服务器)收到需要被推送的消息并结合被推送的 iOS设备的devicetoken一起打包发送给APNS服务器;

3.APNS服务器将推送信息推送给指定devicetoken的iOS设备;

4.iOS设备收到推送消息后通知我们的应用程序并显示和提示用户(声音、弹出框)

比较直观的流程图:

1.33.png

信息包结构图:

1.2323.png

上图显示的这个消息体就是我们的应用服务器(Provider)发送给APNs服务器的消息结构,APNs验证这个结构正确并提取其中的信息后,再将消息推送到指定的iOS设备。这个结构体包括五个部分,第一个部分是命令标示符,第二个部分是我们的devicetoken的长度,第三部分是我们的devicetoken字符串,第四部分是推送消 息体(Payload)的长度,最后一部分也就是真正的消息内容了,里面包含了推送消息的基本信息,比如消息内容,应用Icon右上角显示多少数字以及推送消息到达时所播放的声音等

Payload(消息体)的结构:

{
     “aps”:{
     “alert”:“听云给您发送了新消息”,
     “badge”:1,
     “sound”:“default”
     },
}

这其实就是个JSON结构体,alert标签的内容就是会显示在用户手机上的推送信息,badge显示的数量(注意是整型)是会在应用Icon右上角显示的数量,提示有多少条未读消息等,sound就是当推送信息送达是手机播放的声音,传defalut就标明使用系统默认声音。

下面就是我们推送通知所需要的证书的推送过程:

1.首先我们要新建一个Certificate Signing Request(也就是CSR)的请求文件

在应用程序里的使用工具中找到钥匙串访问,选择从证书颁发机构请求证书

1.45.png

1.44.png

注意:邮箱地址,填自己的开发者账号,常用名,随便填一个记住就行。然后选择存储到磁盘。继续就行。

1.55.png

保存位置在 tingyun(指定自己的文件夹,这里我选择的是我的文件夹),点击存储

然后点击完成后我们会在 tingyun 里看到一个CertificateSigningRequest.certSigningRequest的请求文件,也就是我们说的CSR文件。在我们生成CSR文件的同时,会在钥匙串访问中生成一对秘钥,名称为刚才我们填写的常用名

2.配置AppID

到苹果开发者网站https://developer.apple.com

点击Account 

1.56.png

选择 Certificates,identifiers&Profiles 

1.78.png

选择 Identifiers ->App IDs 点击上方的+号创建一个 App ID.

1.888.png

Name: 填写 App 的名字就行

App ID Suffix 选择不用通配符的及 Explicit App ID

Bundle ID:填写自己应用的 Bundle ID 一定要和自己应用的一致.

1.555.png

在下面的 App Services 中选择自己需要的服务

我们需要推送服务,所以在Push Notifications上打勾

然后点击continue

1.666.png

3.创建证书

证书需要创建两种,一种是开发的、一种是发布的,开发的是做测试用的。

选择Development 点击右上角的+号,创建证书,我们首先创建开发证书

1.99.png

选择Apple Push Notification service SSL (Sandbox),创建推送服务证书点击下一步

1.00.png

这儿的 App ID 选择我们刚才创建的 App ID

然后点击下一步,下一步

0.09.png

这儿点击 Choose File,选择我们刚才创建的 CSR 文件.

然后点击生成(Generate)

最后点击下载,下载证书。将下载的证书,放到指定位置。

0.08.png 

发布证书的创建和开发证书一样,选择Production->Apple Push Notification service SSL (Production)后面和开发证书一样

0.07.png

0.9888.png

4.添加 Devices:

首先选中你要添加哪种设备,然后在左上角点击“+”号。

0.006.png 

Name 填写一个设备名字。

UDID 填写自己需要加入测试的设备的 UDID。

然后点击下一步

0.005.png

然后点击 Register 即可

0.001.png 

点击Done。

0.002.png 

000.png

5.查找设备的 UDID:

用自己的 iOS 设备连接到电脑上,打开 iTunes。

在设备摘要处可以看见一个序列号,点击序列号就会变成 UDID。

0091.png 

6.生成配置文件

配置文件也有两种,一种是开发的,一种是发布的,开发的使我们做测试需要的,发布的是我们在 Appstore 上发布时需要的,我们都需要生成。

我们先生成开发配置文件,选择Provisioning Profiles->Development点击右上角的+号。

0092.png 

选择iOS App Development 点击下一步

0093.png

这儿的 App ID 仍然选择我们刚才创建的 App ID

0094.png

0095.png 

这儿选择我们开发者的证书,如果不知道是哪个选择全部即可

0096.png 

这儿选择我们的测试设备,如果没有则在前面的Devices里面添加即可

0097.png 

0098.png

随便取个名字即可,然后下载下来

1123.png 

发布配置文件和开发配置文件一样创建,选择Distribution->Ad Hoc即可,后面与发布配置文件一样。

1125.png 

1126.png 

11250.png

证书配置完成,打开我们创建的应用项目

打开AppDelegate.m 文件,在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中添加下面代码,注册消息推送

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
        /** 消息推送注册 */
    if ([UIDevice currentDevice].systemVersion.floatValue >= 8.0) {
        
        UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert categories:nil];
        [application registerUserNotificationSettings:settings];
        [application registerForRemoteNotifications];
    }else {
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
    }
    
    return YES;
}
下面方法是返回 ANPs 苹果推送服务器生成的唯一标识
/** 接收服务器传回的设备唯一标识 token */
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{
    
    // 第一次运行获取到DeviceToken时间会比较长!
    // 将deviceToken转换成字符串,以便后续使用
    NSString *token = [deviceToken description];
    NSLog(@"description %@", token);
}

下面方法是当有消息推送回来时,接收推送消息	
/** 设备接收到来自苹果推送服务器的消息时触发的,用来显示推送消息 */

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo{

    NSLog(@"userInfo == %@",userInfo);
}

上面方法是当注册推送服务失败时,接收错误信息
/** 注册推送服务失败 */
-(void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error{
    NSLog(@"注册失败 %@",error);
}

服务器端(Java服务器)

服务器端我们需要,一个后缀为. p12的证书,以及需要的 jar 包

服务器端的证书生成方式:

打开我们前面下载的证书,在钥匙串中找到它

0.98888.png 

点击鼠标右键选择导出

0.998.png 

导出后缀为.p12的文件保存到自己的电脑上,需要输入一个密码,在 Java 服务器端要用到

0.9889.png 

Java服务器端需要的 Jar 包

0.87.png

Java 服务器端代码:

import javapns.back.PushNotificationManager;
import javapns.back.SSLConnectionHelper;
import javapns.data.Device;
import javapns.data.PayLoad;
public class pushService {
	public static void main(String[] args) {
		   
		   
		  try {
		           String deviceToken = "eab6df47eb4f81e0aaa93bb208cffd7dc3884fd346ea0743fcf93288018cfcb6";
		           //被推送的iphone应用程序标示符      
		           PayLoad payLoad = new PayLoad();
		           payLoad.addAlert("测试我的push消息");
		           payLoad.addBadge(1);
		           payLoad.addSound("default");
		                    
		           PushNotificationManager pushManager = PushNotificationManager.getInstance();
		           pushManager.addDevice("iphone", deviceToken);
		           
		           		           //测试推送服务器地址:gateway.sandbox.push.apple.com /2195 
		      	   //产品推送服务器地址:gateway.push.apple.com / 2195 
		           String host="gateway.sandbox.push.apple.com";  //测试用的苹果推送服务器
		           int port = 2195;
		           String certificatePath = "/Users/hsw/Desktop/PushTest/PushTest.p12"; //刚才在mac系统下导出的证书
		           
		           String certificatePassword= "123456";
		          
		           pushManager.initializeConnection(host, port, certificatePath,certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
		                     
		           //Send Push
		           Device client = pushManager.getDevice("iphone");
		           pushManager.sendNotification(client, payLoad); //推送消息
		           pushManager.stopConnection();
		           pushManager.removeDevice("iphone");
		          }
		          catch (Exception e) {
		           e.printStackTrace();
		           System.out.println("push faild!");
		            return;
		          }
		          System.out.println("push succeed!");
		         }

}
作者:happyshaotang2 发表于2016/5/12 9:05:15 原文链接
阅读:593 评论:0 查看评论

相关 [ios 推送 原理] 推荐:

[绍棠] iOS远程推送原理及实现过程

- - CSDN博客推荐文章
推送通知,是现在的应用必不可少的功能. 那么在 iOS 中,我们是如何实现远程推送的呢. iOS 的远程推送原理又是什么呢. 在做 iOS 远程推送时,我们会遇到各种各样的问题. 那么首先让我们准备一些做推送需要的东西. 我们需要一个付费的苹果开发者账号(免费的不可以做远程推送),有了开发者账号,我们可以去苹果开发者网站,配置自己所需要的推送的相关证书.

ios消息推送 - Gen_0

- - 博客园_首页
      iOS的消息推送(推送通知)有两种,一种是本地推送通知,另一种是远程推送通知. 所谓本地推送通知就是使用代码推送消到用户设备中提醒用户一些信息,推送形式请查看手机设置. 远程推送通知是通过服务器发送消息到用户设备中,iOS到消息推送要经过苹果的服务器来推送消息,过程比较麻烦. 下面是个人学习笔记,只提供新手学习(当然我也是个新手),不能用于商业用途.

iOS 和 Android 的后台推送工作原理各是如何?有什么区别?

- - 知乎每日精选
iOS 在系统级别有一个推送服务程序使用 5223 端口. 使用这个端口的协议源于 Jabber 后来发展为 XMPP ,被用于 Gtalk 等 IM 软件中. 所以, iOS 的推送,可以不严谨的理解为:. 苹果服务器朝手机后台挂的一个 IM 服务程序发送的消息. 然后,系统根据该 IM 消息识别告诉哪个 Apps 具体发生了什么事.

cordova与ios native code交互的原理

- - CSDN博客推荐文章
很早以前写了一篇博客,总结cordova插件怎么调用到原生代码: cordova调用过程,不过写得太水,基本没有提到原理. 最近加深了一点理解,重新补充说明一下. 下面是我们产品中的代码片段:. cordova插件最终表现出来的都是js接口,并且调用者完全不需要知道自己在调用一个cordova插件.

苹果开始推送 iOS 6.0.1 固件更新

- - 果迷网
苹果已经向 iOS 用户推送了最新的 iOS 6.0.1 更新,主要修正了此前用户反馈较多的键盘横线和闪关灯无法关闭问题,同时修复了 iPhone 5 无法通过无线方式进行软件更新的问题. 有意思的是,对于存在“无法以无线方式安装软件更新的问题”的 iPhone 5 用户来说,会发现软件更新的“下载并安装”按钮是灰色的……因此在进行软件更新之前需要按提示(设置-通用-软件更新-了解更多)下载并安装一个名为“iOS Updater”的安装器应用;安装完成并打开它就会自动跳转回软件更新界面按正常步骤进行软件更新.

iOS及Android消息推送方案安装使用入门

- - 乐无线-无线互联网观察
iOS消息推送直接使用苹果消息推送协议,服务器端采用easy apns: http://www.easyapns.com/. Android消息推送采用MQTT协议,服务器端采用mosquito+PhpMQTTClient  . 1 、      iOS 消息推送. 1.0 、消息推送证书生成.

苹果iOS系统下的推送机制及实现

- - IT技术博客大学习
标签:   push   推送. 原文由iOS教程团队 Matthijs Hollemans 撰写,经原网站管理员授权本博翻译. 在iOS系统,考虑到手机电池电量,应用不允许在后台进行过多的操作,当用户未开启应用时,要怎么样才能通知用户呢. 好比用户收到一个新的微博、喜欢的球队取得一场胜利或者是晚餐准备好了,如果应用都不在运行当中,当然也就无法去获得这些事件.

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

- - CSDN博客移动开发推荐文章
推送通知技术在Mac OS X和iOS系统上都可以运行,我们本章主要介绍iOS客户端编程,推送通知的编程比较简单,编程的关键是获得令牌,这是从APNS返回的,然后还有把提交给内容提供商. 下面我们看看开发之前的一些准备工作. 编写iOS推送应用需要在Xcode工程中进行一些配置,这些配置是主要是设置代码签名标识,代码签名标识的前提要有配置概要文件(Provisioning Profiles).

如何系统学习 iOS 开发,理解一些规则和深层次的机制原理?

- - 博客 - 伯乐在线
有网友在知乎提问:“本人大四学生,用iOS设备两年多了,真正的接触开发有半年时间吧,之前Java基础还行. 现在感觉有点小瓶颈,很多东西仅仅限于会用或者按照规范依葫芦 画瓢,但不知道深层次的原理以及为什么这样做,感觉知识学习不够系统,经常遇到一些NS类不知所以,翻查Apple的docs有时也看不太懂(可能有外语 水平问题,但应该不是主要原因),比如NSApplication、NSOperation、NSRunLoop等.

互联网推送服务原理:长连接+心跳机制(MQTT协议)

- - 移动开发 - ITeye博客
互联网推送消息的方式很常见,特别是移动互联网上,手机每天都能收到好多推送消息,经过研究发现,这些推送服务的原理都是维护一个长连接(要不不可能达到实时效果),但普通的socket连接对服务器的消耗太大了,所以才会出现像MQTT这种轻量级低消耗的协议来维护长连接,那么要如何维护长连接呢:.        在写之前,我们首先了解一下为什么android维护长连接需要心跳机制,首先我们知道,维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的连接是没有断开,客户端是在线的.