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

推送技术产生场景:

  • 服务器端主动发出:通常情况下,客户端与服务器交互都是客户端主动的,服务器一般不能主动与客户端进行数据交互,因为服务器端无法得知客户端的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)

推送原理解析 极光推送使用详解相关推荐

  1. Android端推送消息之极光推送

    推送方式 轮询 --实现方式: 周期性主动获取网络中的数据; --缺点: 费电, 费流量; SMS --实现方式: 服务器端向手机端发送短信, 手机监听短信广播, 将拦截的短信信息进行显示; --优点 ...

  2. 极光推送 android6.0,极光推送Unity-Android-API

    Android API 停止与恢复推送服务 清除通知 设置允许推送时间 设置通知静默时间 申请权限接口(用于 Android 6.0 及以上系统) 通知栏样式定制 设置保留最近通知条数 本地通知 获取 ...

  3. dicom多帧转换_Python解析多帧dicom数据详解

    概述 pydicom是一个常用python DICOM parser.但是,没有提供解析多帧图的示例.本文结合相关函数和DICOM知识做一个简单说明. DICOM多帧数据存储 DICOM标准中关于多帧 ...

  4. 阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解

    阿里聚安全Android应用漏洞扫描器解析:本地拒绝服务检测详解 阿里聚安全的Android应用漏洞扫描器有一个检测项是本地拒绝服务漏洞的检测,采用的是静态分析加动态模糊测试的方法来检测,检测结果准确 ...

  5. Clickhouse的数据存储原理、二进制文件内容分析与索引详解

    Clickhouse的数据存储原理.二进制文件内容分析与索引详解 Clickhouse以其强大的性能著称,已经被越来越多的使用在OLAP分析查询等场景中.Clickhouse是一个列式存储的数据库,而 ...

  6. python3 urlopen_扣丁学堂解析Python3中urlopen()使用详解

    扣丁学堂解析Python3中urlopen()使用详解 2018-07-23 13:31:14 1318浏览 在现如今,2018年Python一直属于IT行业中比较热门技术,那么今天扣丁学堂Pytho ...

  7. java voliate,voliate 的实现原理是什么【面试题详解】

    今天爱分享给大家带来voliate 的实现原理是什么[面试题详解],希望能够帮助到大家. volatile可以保证线程可见性且禁止指令重排序,但是无法保证原子性.在JVM底层volatile是采用&q ...

  8. iOS推送(利用极光推送)

    本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装(不喜勿喷) (1)首先说一下推送的一些原理: Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指 ...

  9. Android华为推送踩坑,极光推送集成华为遇到的坑?

    一.前言: 首先极光推送对各个厂商通道对接是没有在开发者平台提供文档的,需要申请VIP资格后,极光才会提供对应对接文档. 1.极光普通集成 1.步骤1 图片.png 2.步骤2 图片.png 3.步骤 ...

最新文章

  1. java word 读取excel数据_在Java中实现读写操作Word、Excel等文件
  2. 流利的验证组件:FluentValidation
  3. linux trap命令
  4. Deepin 20.2.3系统标题栏及其按钮美化
  5. UNIX 动态库和静态库
  6. mongo:(2)mongoDB简介
  7. easymodbus_easymodbus4j基于netty的modbus协议快速开发工具
  8. [delphi]窗口最大化时怎么才能不要把任务栏盖住
  9. java kettle jar包_Kettle中调用用户自定义的jar包
  10. 信息安全技术--一次一密钥密码
  11. 如何修改论文,能够避开查重?
  12. 求2020 CFA二级notes资源,谢谢!
  13. Hive SQL之表与建表
  14. Android Performance之工具篇(1)-systrace
  15. epub电子书格式转换(E-book Conversion翻译) -- calibre
  16. 基于单片机的学生视力保护仪
  17. 想学开服技术,先了解服务端的组成
  18. Azure DevOps Server(TFS) 客户端分析
  19. E: Unable to locate package python-distutils The command ‘/bin/sh -c apt-get update apt-get insta
  20. CSS3 transform变形属性、2D变形、3D变形

热门文章

  1. 谷歌中国追求中国式生存
  2. 笨功夫与巧心思,Milvus开源社区的成长
  3. graphpad画生存曲线怎么样去掉删失点_手把手教你用GraphPad Prism绘制生存曲线
  4. 一款适合程序员的流程图/思维导图利器
  5. H G W S哪一个不是状态函数_师大版成语词典发布!不学不是师大人!
  6. 万丈高楼平地起,开始给Java打地基
  7. android手机锁屏了打不开怎么办?
  8. PG中XLOG日志结构
  9. Chrome插件开发-右键菜单开启页面编辑
  10. “肆拾玖坊号”高铁冠名列车今日正式首发