iOS远程推送原理及实现过程

更多技术干货请戳:听云博客java

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

首先咱们要说说iOS推送通知的基本原理:服务器

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

设备注册APNs的流程图:app

1.2222.png

上图完成了以下步骤:iphone

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

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!");
                 }

}

 

 

 

原文连接:http://blog.tingyun.com/web/article/detail/571

相关文章
相关标签/搜索