百度-雲推送1. 百度 – 云推送
Pou Mason
poumason@live.com
http://www.dotblogs.com.tw/pou
3. GCM (Google Cloud Messaging)
在大陆地区有可能无法正常使用
原因
Android大量被客制化
小米、Samsung
均有自己的管理账号、市集
登入Google Account
有些网段有限制
非必要的登入账号
….等
7. 名词解释
名称 说明
API Key 应用标识,终端上的绑定和服务端推送消息时都要用到。
Secret Key 应用私钥,服务端推送消息时用到。
app id 应用ID,就是百度开发者中心的应用基本信息中的应用ID。
客户端绑定调用返回值中可获得。
channel id 推送通道ID,通常指一个终端,如一台android系统手机。
客户端绑定调用返回值中可获得。
user id 应用的用户ID,一个应用在多个端可以都属于同一用户。
user id和channel id配合可以唯一指定一个应用的特定终端。
如果应用不是基于百度账户的账户体系,单独用user就通常指
定了一个应用的特定终端。客户端绑定调用返回值中可获得。
9. 单服务单通道的端上实现 – 1/2
云推送 - Android SDK
Background service + socket
长连接机制来实现
单服务单通道的机制
应用的初始化、tag等接口调用
通过intent方式发送到后台运行的service
service接收到推送消息时
根据消息中指定的发送对象,通过intent,以指定目标应
用包名的方式,发送私有消息给应用
应用无法收到不属于自己/冒充截获的消息
26. 推送设置 – 1/2
开放云服务 > 云推送 > 推送设置
设定
应用名称
Android
package name
iOS
开发/生产凭证、指定目前App的状态为何
脱机消息
不保存、保存指定时间
33. 通知 – 4/4
后续行为 (Android专用)
打开应用
直接打开应用
启动app的launcher activity
自定义动作
按照自定义行为打开应用
打开网页
需要指定网址
设置成经过用户允许才打开网页
默认情况是不经过用户允许直接打开
38. Server SDK & REST API
服务端SDK
C# SDK
PHP SDK
Java SDK
Node.js SDK
40. REST API - 通用参数
参数名称 类型 是否必需 描述
method string 是 API的资源操作方法名
apikey string 是 API的资源操作方法名,访问令牌,明文AK,
可从此值获得App的信息,配合sign中的sk做
合法性身份认证
timestamp uint 是 用户发起请求时的unix时间戳。本次请求签名
的有效时间为该时间戳+10分钟。
sign string 是 调用参数签名值,与apikey成对出现。
expires uint 否 用户指定本次请求签名的失效时间。格式为
unix时间戳形式。
v uint 否 API版本号,默认使用最高版本。
调用时timestamp必须设置,而expires可选设置,用于防止 replay 型攻击。
为保证防止 replay 攻击算法的正确有效,请保证客户端系统时间正确。
41. REST API - 错误码定义
HTTP状态码 Error_code Error_msg 备注
500 30600 Internal Server Error 服务器内部错误。
405 30601 Method Not Allowed 不允许的操作(指定了
错误的HTTP方法或
API)。
400 30602 Request Params Not Valid 请求参数非法。
403 30603 Authentication Failed 权限校验错误 。
402 30604 Quota Use Up Payment
Required
无quota
404 30605 Data Required Not Found 请求数据不存在。
408 30606 Request Time Expires Timeout 请求已超时。
408 30607 Channel Token Timeout channel_token已经过期。
404 30608 Bind Relation Not Found 绑定关系不存在。
404 30609 Bind Number Too Many 绑定数过多。
409 30610 Duplicate Operation 重复操作。
42. REST API -签名算法 – 1/2
签名算法元素,如下
请求的http method、url
包括host和sheme,不包括query_string
所有参数(包括GET或POST的参数)
格式化为“key=value”格式,不包含签名字段
以字典序升序排列后,拼接在一起
将http method和url按顺序拼接在这个字符串前面
在拼接好的字符串末尾追加上应用的secret_key,
进行urlencode形成base_string
MD5值即为签名的值:
43. REST API -签名算法 – 2/2
MD5
举例
发送Token
sign=MD5(urlencode($http_method$url$k1=$v1$k2=$v2$k3=$v3$secret_key));
$secret_key:通过“开发者中心 -> 管理中心 -> 点击某应用 -> 应用信息详情页” 获得。
url [POST]:
http://{domain}/rest/2.0/channel/channel?method=token×tamp=1313293563&
expires=1313293565&v=1
POSThttp://{domain}/rest/2.0/channel/channelapikey=Ljc710pzAa99GULCo8y48NvB
expires=1313293565method=tokentimestamp=1313293563v=18777F555E8C16715EBA
5C85341684C58
44. REST API – 方法清单 – 1/4
方法 URL 描述
query_bindlist http[s]://channel.api.duapp.com/re
st/2.0/channel/{channel_id}
查询设备、应用、用
户与百度Channel的绑
定关系。
verify_bind https://channel.api.duapp.com/rest
/2.0/channel/{channel_id}
判断设备、应用、用
户与Channel的绑定关
系是否存在。
push_msg http[s]://channel.api.duapp.com/re
st/2.0/channel/channel
推送消息,该接口可
用于推送单个人、一
群人、所有人以及固
定设备的使用场景。
query_device_type https://channel.api.duapp.com/rest
/2.0/channel/{channel_id}
根据channel_id查询设
备类型。
基本方法
45. REST API – 方法清单 – 2/4
脱机消息
方法 URL 描述
fetch_msg https://channel.api.duapp.com/rest
/2.0/channel/{channel_id}
查询离线消息。
fetch_msgcount https://channel.api.duapp.com/rest
/2.0/channel/{channel_id}
查询离线消息的个数。
delete_msg https://channel.api.duapp.com/rest
/2.0/channel/{channel_id}
删除离线消息。
46. REST API – 方法清单 – 3/4
方法 URL 描述
init_app_ioscert https://channel.api.duapp.com/rest
/2.0/channel/{channel_id}
上传iOS apns证书,使
channel系统支持apns
服务。
update_app_ioscert https://channel.api.duapp.com/rest
/2.0/channel/{channel_id}
更新iOS设备的推送证
书相关内容。
delete_app_ioscert https://channel.api.duapp.com/rest
/2.0/channel/{channel_id}
删除iOS设备的推送证
书,使得App server不
再支持apns服务。
query_app_ioscert https://channel.api.duapp.com/rest
/2.0/channel/{channel_id}
查询该App server对应
的iOS证书。
iOS相关方法
47. REST API – 方法清单 – 4/4
标签
方法 URL 描述
set_tag https://channel.api.duapp.com
/rest/2.0/channel/channel
服务器端设置用户标签。当该标签
不存在时,服务端将会创建该标签。
特别地,当user_id被提交时,服务
端将会完成用户和tag的绑定操作。
fetch_tag https://channel.api.duapp.com
/rest/2.0/channel/channel
App Server查询应用标签。
delete_tag https://channel.api.duapp.com
/rest/2.0/channel/channel
服务端删除用户标签。特别地,当
user_id被提交时,服务端将只会完
成解除该用户与tag绑定关系的操
作。
该操作不可恢复,请谨慎使用。
query_user_tags https://channel.api.duapp.com
/rest/2.0/channel/channel
App Server查询用户所属的标签列
表。
51. 步骤1 – 加入SDK
建立一个新的Android Project
pushservice-VERSION.jar
加入libs中
libbdpush_V1_0.so
加入libs/armeabi
jar 包添加到工程的 Java Build Path
52. 步骤2 – 宣告Permission
AndroidManifest.xml 宣告必要的
Permissions
<!-- Push service 运行需要的权限 --/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
53. 步骤3 – 注册Receiver – 1/4
新增加一个PushMessageReceiver
"your.package.PushMessageReceiver"
实作的范例程序
可直接复制范例程序中的PushMessageReceiver
的代码
54. 步骤3 – 注册Receiver – 2/4
AndroidManifest.xml中<application />
<!-- push service client -->
<receiver android:name="your.package.PushMessageReceiver">
<intent-filter>
<!-- 接收 push 消息 -->
<action android:name="com.baidu.android.pushservice.action.MESSAGE" />
<!-- 接收 bind、setTags 等 method 的返回结果 -->
<action android:name="com.baidu.android.pushservice.action.RECEIVE" />
<!-- 可选。接受通知点击事件,和通知自定义内容 -->
<action android:name="com.baidu.android.pushservice.action.notification.CLICK" />
</intent-filter>
</receiver>
55. 步骤3 – 注册Receiver – 3/4
AndroidManifest.xml中<application />
<!-- push service start -->
<!-- 用于接收系统消息以保证 PushService 正常运行 -->
<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>
56. 步骤3 – 注册Receiver – 4/4
AndroidManifest.xml中<application />
<!-- Push 服务接收客户端发送的各种请求-->
<!-- 注意:RegistrationReceiver 在 2.1.1 及之前版本有拼写失误,为
RegistratonReceiver ,用新
版本 SDK 时请更改为如下代码-->
<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>