推送原理解析 极光推送使用详解

本文转自这里 ,在此向大佬致敬

推送技术产生场景:

  • 服务器端主动发出:通常情况下,客户端与服务器交互都是客户端主动的,服务器一般不能主动与客户端进行数据交互,因为服务器端无法得知客户端的IP地址和状态。
  • 数据实时性:如果服务器端有紧急数据要传递给客户端,就必须主动向客户端发送数据。
  • 基本原理:使客户端实时获取服务器端消息,Pull方式,小周期轮询,费电费流量,另一个就是Push方式,服务器端向客户端主动推送数据,可以省电省流量。

推送原理

  • Android 推送原理简介      

            (1) SMS方式推送

                    SMS推送就是Short Message Service缩写,即短信服务。

                    实现方式:服务器端向手机端发送短信,手机监听短信广播,然后将拦截的短信信息进行显示。

                    优点:省电,省流量,在没有网络的偏远地区也能接收到推送消息。

                    缺点:费钱,一毛钱一条。

            (2)轮询方式推送

                      实现方式:周期性主动获取网络中的数据。

                      缺点:费电,费流量

            (3)长链接方式推送

                     长链接推送是现在主流的推送方法。

                     实现方式:手机端与服务器端建立一条长时间的数据流链接,手机客户端一直等待服务器端的数据。

                    优点:保持一条长链接,欧数据的时候才发送数据,没有时不消耗流量,比较省流量

                    缺点:由于要保持一条长链接,比较费电,在网络不稳定的情况下推送容易失败。

  • 极光推送概述

            1. 功能概述

                 极光推送基本功能:主动即时的向用户发起交互,可以发送聊天消息。

                 (1) 推送方式

                         通知:推送文本内容,展示在手机通知栏(状态栏)中,主要用于提醒用户的目的。

                        自定义消息:推送自定义消息,给用户自行处理。主要用于应用的内部业务逻辑。可能推送没有任何界面显示。

                        富媒体:推送HTML页面内容。

                        本地通知:本地通知API不依赖于网络,无网的条件下也可以触发,本地通知的定时时间是自发送时算起的,不受中间关机等操作的影响。本地通知与网络推送的通知是相互独立的,不受保留最近通知条数上限的限制。本地通知适用于在特定时间发出的通知。比如一些Todo和闹钟类的应用,在每周,每月固定时间提醒用户回到应用查看详情。

                (2) 推送目标

                         广播推送:向所有用户发送广播消息。

                        标签推送:根据用户设置的标签分组,向某一组推送消息。

                        别名推送:客户端绑定用户别名,向单个用户推送消息。

                 (3) 用户分群

                          用户分群指的就是可以根据JPush提供的多条件组合,对用户进行群组划分,实现实时筛选推送。

                (4) 推送历史

                           推送历史就是通过Web或者API发出的推送,都可以在推送历史记录中查询到,并可以实时显示推送结果。

          2  推送框架

                         推送数据源:我自己开发的服务器端或者使用极光推送官网的Web平台。

                        JPush API :部署在服务器端,开发者的服务器端发起推送时,将数据传到JPush API中。然后再向下传递。

                       建立长链接:集成JPush的SDK客户端启动后会建立一个到JPush Cloud的长链接。提供APP永远在线的能力。

               原理图

                            

          3  极光推送原理

                  (1) 客户端原理

                            IP 地址分配原理

                            IP地址有限:IPv4的IP地址数量有限,运营商要动态地为手机分配IP地址,这些IP地址都是运营商的内网IP。

                            网络地址转换(NAT):全称Network Address Transtation,网关维护一个外网IP地址与内网IP地址对应。

                            外网IP不固定:由于运营商持有的外网IP数量有限,需要动态的分配给介入运营商的用户,因此在手机一段时间内没有数据传输时会将该手机的外网IP地址收回,分配给其他用户。

                           Android手机端想要保持长链接,首先外网IP地址不能变,不能让运营商收回这个IP地址。

                          Android 手机端实现方案:

                              心跳:为了长时间保持外网IP,需要客户端定期发送心跳给运营商,以便刷新NAT列表。

                               Timer定时方法:该类计划循环执行定时任务,但是使用该类会使CPU保持唤醒状态,比较费电。

                         AlarmManager定时方法:该类封装了Android手机的RTC硬件时钟模块,可以在CPU休眠时保持正常运行,定时任务执行时再唤醒CPU,这样做到了电量节省。

              (2) 服务器原理

                      C10K 问题: 单台服务器解决 同时保持一万长链接的性能问题。

       4. Android SDK原理

            Android SDK本质:JPush SDK集成到Android APP中后,作为一个Service在Android端长期运行,始终与服务器端保持长链接,相当于永久在线。

  • JPush 相关API

       1. 初始化 停止 恢复  推送

      推送控制方法:

            初始化推送 JPushInterface.init(Context context),初始化之后才能接收推送消息。

           恢复推送:JPushInterface.resumePush(Context context),停止推送后,调用该方法,即可恢复推送。

          停止推送:JPushInterface.stopPush(Context context),调用该方法后,手机便收不到推送信息了。

   2. 根据别名和标签分组推送

       (1)概念介绍

                 别名(Alias):别名用于代表安装了应用的用户,每个用户对应着一个别名,用户与别名是多对一的关系,每个用户只能指定一个别名,一个别名可以同时指定给多个用户,给别名发送消息时,会同时给所有设置该别名的用户发消息。

                标签(Tags):方便开发者根据标签发送推送消息,用户与标签的对应关系是多对多,一个用户可以有多个标签,一个标签可以设置多个用户。

      (2) 设置别名标签接口方法

              方法接口:

                    public static void setAliasAndTags(Context context,String alias,Set tags,TagAliasCallback callback)

                        Context context:上下文对象

                       String alias: 别名 ,只能设置一个别名

                       Set tags:标签集合,可设置多个标签

                      TagAliasCallback callback 回调函数,其中有一个gotResult接口方法,系统回传入错误码给responseCode参数。

                别名设置说明:设置为null即不设置值,设置“  ”即清空之前的设置。设置会覆盖之前的设置,长度40字节UTF8编码。

               标签设置说明:设置为null即不设置值,设置空集合即清空之前的设置,设置会覆盖之前的设置,每个标签长度40字节UTF8编码,最多100个标签。

        设置别名的方法:

               方法接口:publc static void setAlias(Context context,String alias,TagAliasCallback callback)

                               参数说明同上

       设置标签方法:

              方法接口:public static void setTags(Context context,Set tags,TagAliasCallback callback)

                              参数说明同上

      过滤无效标签方法:

            方法接口:public static Set filterValidTags(Set tags)

            作用:设置标签时,如果标签Set集合中有一个是无效的,那么整个设置都无效,应该是设计缺陷,后期修补bug的权宜之计。

      回调接口方法:TagAliasCallback

              方法接口: public void gotResult(int responseCode//错误码,String alias//别名, Set tags//标签集合)

   3. 根据RegistrationID进行单机推送

          (1)概念介绍

               RegistrationID简介:应用第一次注册到JPush后台时,会生成一个唯一的设备标识,每一个设备的RegisrationID都不会重复。

         (2)获取RegistrationID

                 方法接口:SDK初次注册成功后,开发者通过自定义的Receiver里监听Action-cn.jpush.android.intent.REGISTRATION 来获取对应的RegistrationID。注册成功后,也可以通过此函数获取。

               public static String getRegistrationID(Context context)

              获取RegistrationID代码示例:

                   String registrationid = JPushInterface.getRegistrationID(getApplicationContext());

              后台推送设置:

         

    4. 清除通知

       方法接口: public static void clearAllNotifications(Context context)

    5. 推送时间限制

       (1)设置允许推送时间

                方法接口:public static void setPushTimer(Context context,Set weekDays,int startHour,int endHour)

               Set weekDays  允许接收推送的一周天数

             int startHour     开始时间

            int endHour     结束时间

       (2)设置禁止推送时间

              方法接口:public static void setSilenceTime(Context context,int startHour,int startMinute,int endHour,int endMinute)

 

 

 

                      

                    

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值