Android消息推送
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
服务器:
1、发送http请求到GCM服务器:
Content-Type:application/json Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA { "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",//接受者registration token "data" : { ... }, }
2、消息类型:
1、通知消息notification message { "notification": { "title": "Portugal vs. Denmark", "text": "5 to 1" }, "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P 1..." }
2、数据消息data message { "collapse_key": "score_update", "time_to_live": 108, "delay_while_idle": true, "data": { "score": "4x8", "time": "15:16.2342" }, "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..." }
接收消息 1、系统获得到来的消息,如果有原生键值对的话,从消息载荷中取出。 2、系统把键值对作为一组extras传送给在 com.google.android.c2dm.intent.RECEIVE Intent指定的Android程序 3、Android程序根据键从com.google.android.c2dm.intent.RECEIVE Intent中提 取原生数据,然后处理。 public class MyGcmListenerService extends GcmListenerService { public void onMessageReceived(String from, Bundle data) { String message = data.getString(“message”); //获取消息 if (from.startsWith("/topics/")) { // message received from some topic. } else { // normal downstream message. } sendNotification(message); //显示消息提示
2、开启服务,和RSMB服务器建立连接 //建立连接 IMqttClient mqttClient = MqttClient.createMqttClient(mqttConnSpec,
MQTT_PERSISTENCE);
MQTT_KEEP_ALIVE);
mqttClient.connect(clientID, MQTT_CLEAN_START,
MQTT 和 XMPP
MQTT相比XMPP 有几个优势: 二进制,非常精简,适合做大量节点弱网络差的场景,非常适合现在移动互联网 的基础设施;MQTT是天然的订阅发布系统,有权限的人都可以往里头发消息; 开源的协议和实现;扩展方便且轻量级。 XMPP不适合移动网络有几个原因: 协议虽然完整扩展性虽然好,它耗费网络流量很大,交互此说太多,跑起来比 MQTT慢很多;另外有高达70%的流量是耗费在XMPP本身的标签和编解码上面。
APP Server: send_mqtt(PHP版的应用服务器)
APP客户端: AndroidPushNotificationsDemo (Android应用) wmqtt.jar 是IBM提供的MQTT协议的 实现。
服务器: Really Small Message Broker (RSMB) 是一个简单的MQTT协议代理服务器 (由IBM提供)
Google 消息推送
GCM服务(Google Cloud Messaging)
条件:
1、运行系统为Android2.3或更高版本,其中包括谷歌Play商店、play服务, 服务框架。 2、或者是使用了GoogleAPIs,系统在2.2及以上的Android模拟器 3、手机需要能链接google服务器,app服务器能够发送对GCM服务器的 HTTPS请求。 简介:Google推出的云消息服务,即第二代的C2DM。 优点:Google提供的服务、原生、简单,无需实现和部署服务端
2、 应用服务器:(利用HTTP或XMPP协议与GCM连接服务器进行通信) 应用服务器发送下行消息到GCM连接服务器, GCM连接服务器,存储该消息并维护消息 队列,然后将其发送到客户端应用程序。 如果您实现XMPP,你的应用服务器可以接收来自客户端应用程序发送的消息。
3、 客户端应用程序:(需要安装GCM服务) 要接收和发送GCM的消息,这个程序必须注册GCM服务,并获得称为注册标记的唯一标识 符。
APP客户端: 1、获取设备ID,并存储 是一串64位的编码(十六进制的字符串),是随机生成的设备的 第一个引导,其记录着一个固定值,可视为作为唯一设备标识号 mDeviceID = Secure.getString(this.getContentResolver(),
Secure.ANDROID_ID);
Android 消息推送
使用MQTT协议 使用XMPP协议
使用HTTP轮循方式
使用GCM服务(Google Cloud Messaging) 第三方消息推送平台
使用MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的 一个即时通讯协议 简介:轻量级的、基于代理的“发布/订阅”模式的消息传输协议。 优点:协议简洁、小巧、可扩展性强、省流量、省电, 目前已经应用到企业领域,且已有C++版的服务端组件rsmb。 缺点:不够成熟、实现较复杂、服务端组件rsmb不开源,部署硬件成本较高
//发送设备id到RSMB服务器
mqttClient.subscribe(topics,
MQTT_QUALITIES_OF_SERVICE);
RSMB服务器: 获取到设备id,并保存
APP服务器: 连接RSMB服务器, 发送设备tokudu码和消息内容
使用XMPP协议
简介:基于XML协议的通讯协议,前身是Jabber,目前已由IETF国际标准化组织 完成了标准化工作。
注册服务GcmListenerService:接受消息并作进一步处理 <service android:name="gcm.play.android.samples.com.gcmquickstart.MyGcmListenerService" android:exported="false" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> </intent-filter> </service> 注册服务InstanceIDListenerService:处理registration tokens的创建,更新和轮转 <service android:name="gcm.play.android.samples.com.gcmquickstart.MyInstanceIDListenerSe rvice" android:exported="false"> <intent-filter> <action android:name="com.google.android.gms.iid.InstanceID"/> </intent-filter> </service> 设置最小sdk支持版本大于8 android:minSdkVersion="8"
2、GCM服务器响应: 消息发送成功:200 状态码 拒绝消息:非200状态码 //发给6个人的GCM响应response { "multicast_id": 216, "success": 3, "failure": 3, "canonical_ids": 1, "results": [ { “message_id”: “1:0408” }, //成功 { “error”: “Unavailable” }, //需要重新发送 { “error”: “InvalidRegistration” }, //无效的token { “message_id”: “1:1516” }, //成功 { “message_id”: “1:2342”, “registration_id”: “32” }, //成功,需要保存token { “error”: “NotRegistered”} //失败,可能app被卸载 ] }
Βιβλιοθήκη Baidu
缺点:Android版本限制(必须大于2.3版本),该服务在国内不够稳定、需要 用户绑定Google帐号,受限于Google。
1、 谷歌GCM连接服务器: 接收应用服务器的下行消息,并将它们发送到客户端应用程序。 若是XMPP连接服务器,也可以接受客户端应用程序发送的消息,并将其转发给你的应用服 务器。
4、应用配置: 权限 <uses-permission android:name="<application-package-name> + .permission.RECEIVE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> 注册服务GcmReceiver:接收从GCM发送到app的消息 <receiver android:name="com.google.android.gms.gcm.GcmReceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <category android:name="gcm.play.android.samples.com.gcmquickstart" /> </intent-filter> </receiver>
优点:协议成熟、强大、可扩展性强、目前主要应用于许多聊天系统中,且已有 开源的Java版的开发实例androidpn。 缺点:协议较复杂、冗余(基于XML)、费流量、费电,部署硬件成本高。 (Openfire + Spark + Smack)
使用HTTP轮循方式
简介:定时向HTTP服务端接口(Web Service API)获取最新消息。 优点:实现简单、可控性强,部署硬件成本低。 缺点:实时性差。
客户端:
1、获取配置文件 google-services.json 和 Server API Key
2、复制 google-services.json文件到 app/目录下 3、在项目的build.gradle文件添加dependency: classpath 'com.google.gms:googleservices:1.5.0-beta2' 在app的build.gradle 文件添加plugin: apply plugin: 'com.google.gms.google-services'
5、整体流程: 1、app将自己的Sender ID和Application ID发送给GCM服务器 2、GCM服务器发送registration token到app应用(允许Android程序接收消息的ID) 3、app应用将registration token发送给app应用服务器。 InstanceID instanceID = InstanceID.getInstance(this); String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId), "GCM", null); sendRegistrationToServer(token); R.string.gcm_defaultSenderId 就是the Sender ID,从 google-services.json文件获取