1.名词解释
API Key - 应用标识,终端上的绑定和服务端推送消息时都要用到。
Secret Key - 应用私钥,服务端推送消息时用到。
app id - 应用ID,就是百度开发者中心的应用基本信息中的应用ID。客户端绑定调用返回值中可获得。
channel id - 推送通道ID,通常指一个终端,如一台android系统手机。客户端绑定调用返回值中可获得。
user id - 应用的用户ID,一个应用在多个端可以都属于同一用户。user id和channel id配合可以唯一指定一个应用的特定终端。如果应用不是基于百度账户的账户体系,单独用user就通常指定了一个应用的特定终端。客户端绑定调用返回值中可获得。
2.单播消息推送
描述
开发者向应用的特定终端或特定用户推送消息。 特定终端对于应用来说,就是安装了应用的一台具体的设备。 而一个用户可能有多个端,在某些应用场景下,我们希望消息是针对用户的——应用的同一个用户在他的所有终端上都能收到消息,这时候我们就需要向特定用户推送消息。
解决思路
(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。
应用场景举例
在线问答应用。用户A用手机发表一个问题,问题的解答并不是实时的。假设在第二天用户B发表了第一个解答,这时需要将答案单独推送给A。
解决方案
用户A发表问题时,记录问题id及其对应的A的user id(或channel id)。用户B发表解答时,通过服务端API向问题id对应的user id(或channel id)推送解答。
3.用户分组的消息推送
描述
开发者向应用的符合特定分类条件的若干用户的集合推送消息。广播是分组推送的特例,它向应用的所有用户(同时也是所有端)推送消息。
解决思路
云推送通过Tag(标签)这种技术方式来实现用户分组的功能。例如,对于分类信息的应用,一个用户观看了体育栏目,就给该用户打一个Tag——sport。6月的某一天NBA总决赛热火夺冠了,则向sport这个Tag推送一条及时的夺冠新闻。
Tag的设置有两种方法:
(1)客户端设置
这是最常见的设置方式,因为和用户直接交互的客户端最真实的收集了用户的喜好、习惯等信息。这些信息往往是用户分组的依据。在客户端程序中,一旦用户触发了开发者预先设定的分组条件(如:观看了体育栏目,设置了年龄,团购了电影票等),则调用客户端API进行Tag设置(对应的Tag:sport,80s,movie),如Android端的setTags接口。
(2)服务端设置
如果开发者自己维护了用户的分组信息,或者存在已发布的还不具备某分组设置功能的终端版本,也可以通过服务端API给特定用户设置Tag,如PHP接口setTag。
广播功能和Tag无关,不需要开发者进行分组的任何操作就已经具备。
推送Tag消息的方法:
(3)通过管理控制台推送
若要推送广播消息,选中上图中的所有人即可。
(4)通过服务端API推送
如PHP接口
- public function pushMessage (
- $push_type,
- $messages,
- $message_keys,
- $optional = NULL )
push_type为2,且正确设置tag_name 参数。详情参考PHP-SDK使用手册。
应用场景举例
阅读应用。对不同阅读喜好的人群推送不同类别的新图书广告。
解决方案
应用提供喜好设置页面,用户勾选不同的类别,触发对应Tag的设置。或者用户阅读了某个类别的图书,触发对应Tag的设置。在服务端,给特定类别图书的Tag推送新书广告。
4.使用自己的账户系统或百度账户
描述
开发者可以使用自己的账户体系开发应用,或者应用就是无账户的。开发者也可选择使用百度账户作为应用账户系统的接入。
解决思路
(1)使用自己的账户系统或者无账户系统
这两种情况,云推送都是无法理解账户信息的,所以对于云推送来说都属于无账户体系。
云推送通过终端标识(channel id)和应用标识(APIKey)来唯一确定一个应用的一个特定端。应用的每个端都是不同的用户,拥有不同的user id。 客户端的绑定方式,用Android API举例:
PushManager.startWork(Context, LOGIN_TYPE_API_KEY, apiKey)
(2)使用百度账户系统
云推送和百度账户系统是连通的,应用的所有用户将使用百度的user id作为唯一标识。不同的端使用同一个用户百度账户登录,获得的user id是一样的。这种方式可以实现对用户的多个端做消息推送。
百度账户的客户端绑定使用用户AccessToken作为验证凭证,用户AccessToken的获得需要百度账户登录界面的辅助,具体使用可以参看客户端SDK demo或者百度账号连接官方文档。
同样的,客户端的绑定方式,用Android API举例:
PushManager.startWork(Context, LOGIN_TYPE_ACCESS_TOKEN, UserAccessToken)
(2) 百度账号连接官方文档
5.单服务单通道的端上实现
云推送的Android SDK,是通过后台service和socket长连接机制来实现的。从消息时效性、耗电量、网络流量等因素考虑,这是目前最好的实现方式。
在同一台设备安装了多个使用推送的应用的情况下,如果每个应用都执行独立的后台service,且各自建立独立的长连接,这无疑是系统资源的巨大浪费。内存使用、耗电量、网络流量等关键因素都将以接近与应用数正比的倍数增长。
在这个背景下,云推送实现了单服务单通道的机制。同一台设备上,云推送服务的资源消耗不受集成该服务的应用数量影响。任何时刻,只会运行一个后台service和维持一个socket长连接。
应用的初始化、tag等接口调用,将通过intent方式发送到后台运行的service处理。service接收到推送消息时,将根据消息中指定的发送对象,通过intent,以指定目标应用包名的方式,发送私有消息给应用。应用无法接收到不属于自己的消息,也无法通过冒充截获。
示意图: