美文网首页
推送的过程原理

推送的过程原理

作者: adalillian | 来源:发表于2020-06-01 13:07 被阅读0次

    参考网址:

    https://www.jianshu.com/p/fa85dc7f1322


    iOS远程推送原理及详细实现过程(前端后台)

    导语

    推送通知,是现在的应用必不可少的功能。那么在 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的流程图:

    上图完成了如下步骤:

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

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

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

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

    推送过程图:

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

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

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

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

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

    比较直观的流程图:

    流程图

    信息包结构图:

    信息包结构图

    上图显示的这个消息体就是我们的应用服务器(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)的请求文件

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

    forumImage20160511110452523.png

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

    forumImage20160511110546038.png

    保存位置在 tingyun(指定自己的文件夹,这里我选择的是我的文件夹),点击存储 然后点击完成后我们会在 tingyun 里看到一个CertificateSigningRequest.certSigningRequest的请求文件,也就是我们说的CSR文件。在我们生成CSR文件的同时,会在钥匙串访问中生成一对秘钥,名称为刚才我们填写的常用名

    2.配置AppID

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

    forumImage20160511110641214.png

    选择 Certificates,identifiers&Profiles

    forumImage20160511110703158.png

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

    forumImage20160511110723649.png

    Name: 填写 App 的名字就行 App ID Suffix 选择不用通配符的及 Explicit App ID Bundle ID:填写自己应用的 Bundle ID 一定要和自己应用的一致.

    forumImage20160511110753676.png

    在下面的 App Services 中选择自己需要的服务 我们需要推送服务,所以在Push Notifications上打勾 然后点击continue

    forumImage20160511110813852.png

    3.创建证书

    证书需要创建两种,一种是开发的、一种是发布的,开发的是做测试用的。 选择Development 点击右上角的+号,创建证书,我们首先创建开发证书

    forumImage20160511110833611.png

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

    forumImage20160511110852080.png

    这儿的 App ID 选择我们刚才创建的 App ID然后点击下一步,下一步

    forumImage20160511110906544.png

    这儿点击 Choose File,选择我们刚才创建的 CSR 文件. 然后点击生成(Generate)最后点击下载,下载证书。将下载的证书,放到指定位置。

    forumImage20160511110929879.png

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

    forumImage20160511111121989.png

    4.添加 Devices:

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

    forumImage20160511111201022.png

    Name 填写一个设备名字。 UDID 填写自己需要加入测试的设备的 UDID。 然后点击下一步

    forumImage20160511111230260.png

    然后点击 Register 即可

    forumImage20160511111303570.png

    点击Done。

    forumImage20160511111404730.png

    5.查找设备的 UDID:

    用自己的 iOS 设备连接到电脑上,打开 iTunes。 在设备摘要处可以看见一个序列号,点击序列号就会变成 UDID。

    forumImage20160511111435241.png

    6.生成配置文件

    配置文件也有两种,一种是开发的,一种是发布的,开发的使我们做测试需要的,发布的是我们在 Appstore 上发布时需要的,我们都需要生成。 我们先生成开发配置文件,选择Provisioning Profiles->Development点击右上角的+号。

    forumImage20160511111458753.png

    选择iOS App Development 点击下一步

    forumImage20160511111527684.png

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

    forumImage20160511111551686.png

    forumImage20160511111611829.png

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

    forumImage20160511111637112.png

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

    forumImage20160511111709881.png

    forumImage20160511111732656.png

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

    forumImage20160511111817402.png

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

    forumImage20160511111914255.png

    forumImage20160511111956889.png

    forumImage20160511112034232.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([UIDevicecurrentDevice].systemVersion.floatValue >=8.0) {UIUserNotificationSettings*settings = [UIUserNotificationSettingssettingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeSound|UIUserNotificationTypeAlertcategories:nil];        [application registerUserNotificationSettings:settings];        [application registerForRemoteNotifications];    }else{        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert)];    }returnYES;}下面方法是返回 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 包 服务器端的证书生成方式: 打开我们前面下载的证书,在钥匙串中找到它

    forumImage20160511112206166.png

    点击鼠标右键选择导出

    forumImage20160511112222101.png

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

    forumImage20160511112257281.png

    Java服务器端需要的 Jar 包

    forumImage20160511112326820.png

    Java 服务器端代码:

    importjavapns.back.PushNotificationManager;importjavapns.back.SSLConnectionHelper;importjavapns.data.Device;importjavapns.data.PayLoad;publicclasspushService{    publicstaticvoidmain(String[] args) {try{StringdeviceToken ="eab6df47eb4f81e0aaa93bb208cffd7dc3884fd346ea0743fcf93288018cfcb6";//被推送的iphone应用程序标示符      PayLoad payLoad =newPayLoad();                  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 Stringhost="gateway.sandbox.push.apple.com";//测试用的苹果推送服务器int port =2195;StringcertificatePath ="/Users/hsw/Desktop/PushTest/PushTest.p12";//刚才在mac系统下导出的证书StringcertificatePassword="123456";                                    pushManager.initializeConnection(host, port, certificatePath,certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);//Send PushDevice 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!");                }}


    一、iOS端推送原理(以QQ为例) :

    1.  App的用户 把UDID和Bundle Id 给APNs苹果服务器,APNs服务器把这个加密之后生成一个deviceToken 发送给我们自己的服务器;  

    2.我们自己的服务器, 存到数据库里面, 例如, id 1, name 张三, qq 12345, deviceToken 888;

    3.当我们需要推送消息时:

        当用户在线,APNs直接发送: 服务器将推送消息按照指定格式 和 devicetoken打包 发给APNs,  A和APNs是长连接,是可以直接发送的; 

        当用户不在线,服务器发送:  服务器去自己的数据库 查找用户的QQ号对应的deviceToken,然后将deviceToken发送给APNs,APNs会解析出UDID和Bundle Id,那么就可以找到对应的设备, 对应的QQ号,直接发送消息了。

    二、以服务器的角度,记录需要的东西:

    1. 证书(苹果开发人员提供);

    2. deviceToken(苹果开发人员提供)———通过这个找到 设备和app ;

    3. 服务器发送通知的指定格式

        {

    “aps”:

    {

    “alert”: “This is some fancy message”,

    “badge”:1,

    “content-available”:”every word”

    }

    }


    相关文章

      网友评论

          本文标题:推送的过程原理

          本文链接:https://www.haomeiwen.com/subject/rndlyqtx.html