赞
踩
本文转自这里 ,在此向大佬致敬
推送技术产生场景:
(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端长期运行,始终与服务器端保持长链接,相当于永久在线。
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)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。