android-推送

来源:互联网 发布:知乎日报手机网页版 编辑:程序博客网 时间:2024/05/16 01:03

推送技术产生场景

-- 服务器端主动性 : 客户端与服务器交互都是客户端主动的, 服务器一般不能主动与客户端进行数据交互, 因为服务器端无法得知客户端的 IP 地址 及 状态;

-- 数据实时性 : 如果服务器端有紧急数据要传递给客户端, 就必须主动向客户端发送数据;

-- 基本原理 : 使客户端实时获取服务器端消息, Pull 方式, 小周期轮询, 费电费流量; 另一个就是 Push 方式, 服务器端向客户端主动推送数据, 可以省电省流量;

一. 推送原理


1. Android 推送原理简介

(1) SMS 方式推送


SMS 推送

-- SMS : Short Message Service 缩写, 即短信服务;

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

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

-- 缺点 : 费钱, 一毛钱一条;

(2) 轮询 方式推送


轮询推送

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

-- 缺点 : 费电, 费流量;

(3) 长链接 方式推送


长链接推送 : 主流方法;

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

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

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

2. Android 推送解决方案简介

(1) C2DM 推送 (Google)


C2DM 推送简介 : 全称 Cloudto Device Messaging, Google 提供的 推送解决方案;

-- 运行方式 : 提供一个轻量级机制, 允许服务器通知应用程序, 主动与客户端进行数据交互, 处理 消息排队 , 并向运行于目标设备的应用程序 分发消息;

-- 优点 : Google 提供的原生框架, 无需在应用中添加第三方代码 和 部署服务器端;

-- 缺点 : 1.该推送依赖 Google 服务器, 需要绑定 Google 帐号, 目前在中国 Google 被屏蔽, 无法使用; 2. 许多手机厂商去掉了软件中的该模块;

-- 运行机制图

(2) MQTT 推送 (IBM)


MQTT 推送简介 : MQTT 是轻量级的消息发布|订阅协议, 

-- 优点 : 省电, 省流量, 轻量级, 有 C++ 版的服务器端组件 RSMB;

-- 缺点 : RSMB 不开源, 部署成本高, 比较复杂;

-- IBM相关MQTT官网 :  http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006 ;

RSMB 服务器端 : 全称 Really Small Message Broker, IBM 提供;

-- 工作方式 : 在服务器端, 接收消息, 并将 消息 传输给指定移动设备;

-- 地址 :  http://www.alphaworks.ibm.com/tech/rsmb ;

MQTT 推送示例

-- 客户端 :  https://github.com/tokudu/AndroidPushNotificationsDemo ;

-- 服务器端 PHP :  https://github.com/tokudu/PhpMQTTClient ;

(3) 基于 XMPP 的 AndroidPN 推送 (开源)


XMPP 推送简介

-- XMPP 简介 : 全称 Extensible Messaging and Presence Protocol (可扩展通讯和表示协议), 基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测, 该协议允许因特网用户向因特网上的其他任何人发送即时消息 ;

-- AndroidPN : 基于 XMPP 协议开发的 Java 开源 Android 推送通知实现, 包含了完整的客户端 和 服务器端;

-- 项目主页 :  http://sourceforge.net/projects/androidpn/ ;

-- 原理图

AndroidPN 缺陷 : 如果使用该框架进行推送, 需要在了解 XMPP 和 anroidPN 基础上进行大量的二次开发;

-- 连接中断 : 连接时间过长, 连接会中断, 收不到消息;

-- 稳定性差 : 该框架不是很稳定;

-- 纠错机制 : 消息推送出去后, 不检查是否推送到客户端, 推送出去就不管了;

3. 推送 4s 评价标准

4S 标准Safe(安全) , Stable(稳定) , Save(省电省流量省成本) , Slim(体积小) ;

(1) Safe (安全)


推送安全标准

-- 透明传输 : 只负责点对点的传输的质量, 不关心中间的传输介质 与 传输业务逻辑 协议等;

-- 加密方案 : 信息需要加密, 另外推送的 ID 系统需要独立与后台已有的 ID 系统;

(2) Stable (稳定)

服务器稳定 : 长链接方案对服务器开销要求很高, 服务器端开发难度很大;

-- 在线峰值 : 同时在线连接数到达100万的稳定性;

-- 并发时延 : 高并发时的消息平均延迟, 一分钟处理 100万 条数据;

-- 服务器稳定 : 稳定性时延占总时间的 99.9%, 有备份和负载均衡的机制;

客户端稳定 : 中国网络状况复杂, 手机长时间联网比较难, 稳定性比较难, 开发时要考虑每个省的每个运营商, 每款手机的机型;

-- 联网时间 : 每日联网时间 23.5 小时以上;

-- 消息到达率 : 消息收到后 9 小时内客户端的消息到达率;

(3) Save (节省)


节省评判

-- 电量节省 : 注意 CPU 休眠率, 服务短待机时间百分比评判;

-- 流量节省 : 处理协议 和 冗余数据包, 使用空载待机月流量评判;

-- 成本节省 : 单服务器同时承载连接数, 同时承载连接数越多, 成本越低, 个推单服务器连接 300 万(业内顶尖水平);

(4) Slim (体积小)


集成 SDK 大小 : 客户端推送的 SDK 的大小尽量小, 一般要小于 300K;

二. 极光推送概述


1. 功能概述

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

-- 作用 : 通过向 精准 的目标用户推送 有价值 的消息, 可以提供用户忠诚度, 提高留存率;

(1) 推送方式


推送方式简介

-- 通知 : 推送文本内容, 展示在通知栏中;

-- 自定义消息 : 推送自定义消息, 给用户自行处理;

-- 富媒体 : 推送 HTML 页面内容;

(2) 推送目标


推送目标简介

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

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

-- 别名推送 : 客户端绑定用户别名, 向单个用户推送信息;

(3) 用户分群


用户分群简介 : 可以根据 JPush 提供的 多条件组合 , 对用户进行群组划分, 实现 实时筛选推送 ;

(4) 推送历史


推送历史简介 : 通过 WEB 或者 API 发出的推送, 都可以在推送历史记录中查询到, 并可以实时显示推送结果;

2. 推送框架

推送框架

-- 推送数据源 : 自己开发的服务器端 或者 使用 极光推送官网的 WEB 后台;

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

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

-- 原理图

3. 极光推送原理


参考文章(极光推送官方博客) :  http://blog.jpush.cn/jpush_wireless_push_principle/ ;

(1) 客户端原理


IP地址 分配原理

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

--  网络地址转换 (NAT) : 全称 Network Address Translation, 网关维护一个外网 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) 多平台支持


多平台支持

-- 手机芯片类型 : 一般的手机是 ARM 芯片, 但是有些手机是 MIPS 芯片 或者 x86 芯片;

-- so 库支持 : 每个 CPU 芯片类型对应的 so 库, 都需要特殊编译, 无法跨平台调用, 如 ARM 平台的 so 库在 x86 平台就无法运行;

(2) 电量与流量说明


流量消耗 : JPush 的协议是自定义的, 协议的数据量经过了精简, 流量消耗非常少; 

电量消耗 : JPush 心跳保持连接时可以在 CPU 不唤醒的情况下执行, 减少了不必要的代码运行, 电量非常节省;

 

转自:http://blog.csdn.net/shulianghan/article/details/45046283
0 0
原创粉丝点击