一:优势分析
百度云推送,极光推送和个推各自的优势是什么?
极光推送功能优势:
1、高效稳定的推送通知
为合作伙伴提供长连接SDK,开发者的服务消息可以推送到其客户端。使你的应用程序保持高注意力,即使用户没有打开应用程序,也能够推送通知到达用户手机。您可以即时向用户推送活动提示、动态更新、积分信息等通知。100万并发量不超过40秒,水平服务器架构,任何单点失效都并不会影响推送。
2、自由度高,推送自定义消息。
强大的自定义消息推送通道。开发者可以推送自定义的消息内容。JPush SDK 把内容完全转给开发者应用程序,由开发者应用程序去处理自定义消息。
3、灵活推送工具
灵活地根据需要进行推送。管理Portal上的推送助手,方便快速推送,普通用户都可操作。另外也提示API调用方式,灵活强大。
4.推送平台技术架构先进,经过考验的大规模用户 Push 平台
由于之前开发过IM应用,极光在消息推送业务上有丰富的技术沉淀期,并且不断地优化系统,满足快速的业务增长。
免费推送服务
推送的用户数量没有限制,推送的消息条数也没有限制。
方便集成的SDK及良好的文档和技术支持体系
android 3分钟demo
ios 简单配置
客户端SDK以非常低的代价保持连接,电量、流量消耗少。
推送内容的多少是由开发者决定的,网络状况不稳定也会对电量造成影响。在不考虑推送的内容和网络影响前提下。理论数据平均值为:流量消耗 20K/天,电量消耗 30mAh/天
5、专业图表、推送精准化
推送效果直观呈现。推送到达了多少?到达后,用户有没有点击打开应用?打开应用后,用户逗留的时间有没有延长 ? 直观的对比图表,让你轻松地评估推送效果。
这是极光推送应用后的数据趋势图:
单播消息推送
通过绑定channel id、user id,可以向特定的Android客户端发送消息或通知
高安全性
平台在服务端与SDK进行通讯时进行了数据加密,保证客户数据的隐私安全。同时,个推平台还支持客户对传输数据自主加密,满足高安全性客户的需求。
高可靠性
平台服务器部署在IDC核心机房,三线接入,保证不同运营商移动设备接入的稳定性。个推平台采用分布式架构部署,不仅系统容量可灵活扩容,还可以提供99.9% SLA。个信专业的运维团队维护,消息到达率超过96%。
低成本
平台专注推送服务领域的研究,单台设备支持100-300万用户在线(根据单台设备配置会有波动),平均成本控制业界领先。
出乎意料的快速,瞬间送达
平台的消息投递延时小于0.2s,无论何时何地,用户移动设备有网络即可送达。
专为手机优化,省电省流量
平台采用自主研发的独有协议,比XMPP更适合移动设备使用,符合4S标准(小巧、省电、省流量、稳定)。实测移动设备空载耗电每日15-50mAh,空载流量0.8-1.2M/月。
高安全性
个推平台在服务端与SDK进行通讯时进行了数据加密,保证客户数据的隐私安全。同时,个推平台还支持客户对传输数据自主加密,满足高安全性客户的需求。
高可靠性
个推平台服务器部署在IDC核心机房,三线接入,保证不同运营商移动设备接入的稳定性。个推平台采用分布式架构部署,不仅系统容量可灵活扩容,还可以提供99.9% SLA。个信专业的运维团队维护,消息到达率超过96%。
低成本
个推平台专注推送服务领域的研究,单台设备支持100-300万用户在线(根据单台设备配置会有波动),平均成本控制业界领先。
出乎意料的快速,瞬间送达
个推平台的消息投递延时小于0.2s,无论何时何地,用户移动设备有网络即可送达。
专为手机优化,省电省流量
个推平台采用自主研发的独有协议,比XMPP更适合移动设备使用,符合4S标准(小巧、省电、省流量、稳定)。实测移动设备空载耗电每日15-50mAh,空载流量0.8-1.2M/月。
易于实施
个推平台移动设备SDK集成半天即可完成,使用推送管理后台,当天即可零开发群发消息。同时,个推平台也提供完善成熟的服务API可以与客户已有业务系统紧密结合。
强大的分析报表
个推平台可以提供应用的留存用户,在线用户等核心数据,并会不定期提供行业数据分析报告及客户的行业排名指数。对于消息投递到用户后的访问行为,个推平台也会提供精准的效果评估报告。
二: 实现步骤
开发前准备
4.1 运行环境
可运行于Android 2.1(API Level 7)及以上版本。
4.2 参数申请及权限开通
4.2.1 获取应用ID及API Key
开发者需要使用百度账号登录百度开发者中心注册成为百度开发者并创建应用,方可获取应用ID、对应的API Key及Secret Key等信息。具体信息,请参考百度开发者中心上的“创建应用”的相关介绍。
其中,应用ID(即:APP ID)用于标识开发者创建的应用程序;API Key(即:Client_id)是开发者创建的应用程序的唯一标识,开发者在调用百度API时必须传入此参数。
4.3 账户支持
4.3.1 百度账户
开发者可选择使用oauth2.0协议接入百度开放平台,所有用户标识使用百度的userid作为唯一标识,使用AccessToken作为验证凭证。
Android端用PushManager.startWork(context, PushConstants.LOGIN_TYPE_ACCESS_TOKEN, UserAccessToken)启动基于百度账户的Push服务,当然要获得AccessToken需要登陆界面的辅助,在Android demo里有相关示例代码。
4.3.2 无账户登录体系
开发者无需接入百度账户体系,每个终端直接通过API Key向Server请求用户标识userid,此id是根据端上的属性生成,具备唯一性,开发者可通过此id对应到自己的账户系统,此方式方便灵活,但需要开发者自己设计账户体系和登录界面。无账户登录体系启动Android端Push服务的方法:
PushManager.startWork(context, PushConstants.LOGIN_TYPE_API_KEY, apiKey);
(有账户无账户登录区别:唯一标示问题.
百度账户登录,所有用户标示使用百度用户的userid作为唯一标示,使用AccessToken作为验证凭证.
无账户登录,直接通过API Key向Server请求用户标识userid,此id是根据端上的属性生成,具备唯一性.)
基本操作步骤
2 创建w应用,获取 API Key 及 Secret Key;
3 Android项目导入相应jar包和.so文件,
4 加入推送所需权限,
5 创建广播接收者,用来接受推送消息的到来
6 在清单文件中将之前获取的API Key写入
7 把示例(Android 项目)导入 Eclipse 工程;
8 运行Android应用;
9 登录管理控制台发送通知;
10 手机端接收通知。
单播消息推送
(1)向应用的特定终端推送消息
一个channel id指定一个终端,因此在这种需求下,开发者需要通过服务端API,向一个特定channel id推送消息。在推送之前,客户端应用通过绑定接口的返回值获取到channel id,并通过网络等手段发送给开发者,开发者需自行维护channel id。
例如,Android客户端,在调用了startWork之后,自定义消息 receiver将会收到返回值,其中包含了channel id、user id等信息。
(2)向应用的特定用户推送消息
云推送用user id来表示用户,因此在这种需求下,开发者需要通过服务端API,向一个特定user id推送消息。和channel id获取方式类似,客户端应用通过绑定接口的返回值获取到user id。开发者需要自行维护user id。
Android设备与user id绑定,服务器交互
如何让user id和APP端用户名做绑定 ?
startWork(getApplicationContext(),PushConstants.LOGIN_TYPE_API_KEY, PushApplication.API_KEY);// 无baidu帐号登录,以apiKey随机获取一个user id
User id是自动生成的还是客户端设置的?
User id是通过startWork自动生成的.与之同时生成的还有channel id.
与服务器访问url?需要带参数?
无账号绑定后,app会在receive代码中获取一系列参数(user id ,channel id等).
将这些数据与用户名通过接口发送到后台(自己的接口).后台再从百度云那里的服务端获取所有用户的userid遍历,判断推送.
接受推送通知的具体参数内容
Push调用url:
http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/api/list#push_msg
需要考虑问题
1.user id用户的唯一标示的可更改性?
User id 必须与用户名绑定才能准确的进行消息推送.
登录之后,把用户名跟设备IMEI还是什么了,或者百度返回的那个userid发给后台,然后后台再从百度云那里的服务端获取所有用户的userid遍历,判断推送.
实现细节
1.注册百度应用账户,创建项目app,获取API key
2.下载SDK 获取jar包和.so文件.导入自己的项目
3.在清单文件中注明API Key,方便后续调用.(也可在类中定义为常量)
Name=”api_key” value为在百度应用创建app时获取的API key.
一共三个receiver一个service ,其中一个receiver为我们接受到数据需要处理的类:
4.定义广播接受者继承FrontiaPushMessageReceiver,接受Push消息处理receiver。在此receiver中定义回调函数.同时在清单文件注册.
5.Push必须的receviver和service声明
<receiver android:name="com.baidu.android.pushservice.PushServiceReceiver"
android:process=":bdservice_v1">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
<action android:name="com.baidu.android.pushservice.action.notification.SHOW" />
<action android:name="com.baidu.android.pushservice.action.media.CLICK" />
</intent-filter>
</receiver>
<receiver android:name="com.baidu.android.pushservice.RegistrationReceiver"
android:process=":bdservice_v1">
<intent-filter>
<action android:name="com.baidu.android.pushservice.action.METHOD" />
<action android:name="com.baidu.android.pushservice.action.BIND_SYNC" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package" />
</intent-filter>
</receiver>
<service
android:name="com.baidu.android.pushservice.PushService"
android:exported="true"
android:process=":bdservice_v1" />
6.第一次登录app后开启推送服务:这里使用无账号登录,以”api_key”申请获取唯一的
startWork(Context context, int loginType, String loginValue)三个参数:
1.上下文
2.登录方式
(一种有账号登录,通过百度账号登录.PushConstants.LOGIN_TYPE_ACCESS_TOKEN
另一种无账号登录,通过api_key. PushConstants.LOGIN_TYPE_API_KEY,)
3.登录值,这里是之前获取的API_Key.
PushManager.startWork(getApplicationContext(),
PushConstants.LOGIN_TYPE_API_KEY,
Utils.getMetaValue(PushDemoActivity.this, "api_key"));
7. 如果您的工程中实现了Application的继承类,那么,您需要将父类改为com.baidu.frontia.FrontiaApplication。
如果您没有实现Application的继承类,那么,请在AndroidManifest.xml的Application标签中增加属性:
<application android:name="com.baidu.frontia.FrontiaApplication"
(如果不设置以上属性会导致能收到消息却不能收到通知的情况)
8.设置通知的图标样式(可以不设置,不设置则使用系统默认的通知样式);
后台服务器端调用百度云接口:
1.查询:
query_bindlist
功能
查询设备、应用、用户与百度Channel的绑定关系。
HTTP请求方式
GET | POST
URL
http[s]://channel.api.duapp.com/rest/2.0/channel/{channel_id}
注意:
如果查询的绑定关系与channel_id无关,则{channel_id}部分直接填写channel即可。
2.push发送推送
push_msg
功能
推送消息,该接口可用于推送单个人、一群人、所有人以及固定设备的使用场景。
HTTP请求方式
POST
URL
http[s]://channel.api.duapp.com/rest/2.0/channel/channel
关键参数:apikey ,user_id ,push_type(单个人,一群人,所有人) ,message_type(消息,通知),messages(消息内容).
签到,任务数,之前的消息机制不改变.在原来基础上加上云推送:
App进程不被杀死的情况下之前消息机制的ok.
如果App进程被杀,则需要考虑两种情况:
1.App已经登录
2.App已经注销登录
登录账户成功:执行startWork方法 onbind服务
注销登录 : 执行stopWork方法 unonbind服务
(之前的推送轮询的只有经纬度获取)
签到:已经签到则不再有消息提醒;(只要App进程还在,则会一直轮询检查是否已经签到,服务器端也需要5[自定义]分钟一轮询).
新消息任务: 以透传消息的方式发送,消息数,任务数.app获取数量后和之前存储的数量相对比.有新的则通知栏提醒,跳转到app消息任务主界面.( 如果app未登录则无法获取用户信息?无法知道用户用什么账号登录?)
传送方式:android自定义字段
"custom_content": {
"key1":"value1",
"key2":"value2"
},