HUAWEI Push Kit主题消息传递功能可让开发者将消息发送至已经选择加入特定主题的多台设备。开发者可以根据需要撰写主题消息,HUAWEI Push负责将消息可靠地传送至正确的设备。
例如,某个天气预报应用的用户可选择加入“天气”主题,并接收关于本地最佳除害虫天气的通知。喜欢旅游的用户可以订阅一些旅游线路,旅游指南等旅游信息。
关于主题,请注意以下事项:
主题消息传递最适合传递天气或其他可通过公开途径获得的信息。
主题消息传递不限制每个主题的订阅数。但是,HUAWEI Push在这些方面有如下约束限制:
1、一个应用实例不可订阅超过2000个主题。
2、在EMUI10.0以上的华为设备上支持本功能需要满足HMSCore(APK)的版本不低于3.0.0。低于10.0的设备需要升级HMSCore(APK)的版本不低于4.0.3。
开发者要实现按主题发送消息的功能需要完成如下开发步骤:
1、应用主题订阅,既支持客户端订阅,详细请参考客户端主题管理,同时也支持服务端主题订阅,详细请参考服务端主题管理。
2、当开发者订阅完主题后,就可以根据主题发送消息,详细请参考发送主题消息。
客户端应用可以订阅任何现有主题,也可创建新主题。当客户端应用订阅新的主题名称尚不存在时,系统会在HUAWEI Push中使用这个名称创建一个新主题,随后任何客户端都可订阅该主题。
若要订阅某个主题,客户端应用需使用 HMS Core Push SDK的 subscribe 方法。此方法会返回一个 Task,完成侦听器可以使用它来确定订阅是否成功。
- public void subscribe(String topic) {
- try {
- HmsMessaging.getInstance(context).subscribe(topic).addOnCompleteListener(new OnCompleteListener<Void>() {
- @Override
- public void onComplete(Task<Void> task) {
- if (task.isSuccessful()) {
- Log.i(TAG, "subscribe Complete");
- } else {
- Log.e(TAG, "subscribe failed: ret=" + task.getException().getMessage());
- }
- }
- });
- } catch (Exception e) {
- Log.e(TAG, "subscribe failed: exception=" + e.getMessage());
- }
- }
若要退订,客户端应用需使用HMS Core Push SDK的 unsubscribe 方法。
- public void unsubscribe(String topic) {
- try {
- HmsMessaging.getInstance(context).unsubscribe(topic).addOnCompleteListener(new OnCompleteListener<Void>() {
- @Override
- public void onComplete(Task<Void> task) {
- if (task.isSuccessful()) {
- Log.i(TAG, "unsubscribe Complete");
- } else {
- Log.e(TAG, "unsubscribe failed: ret=" + task.getException().getMessage());
- }
- }
- });
- } catch (Exception e) {
- Log.e(TAG, "unsubscribe failed: exception=" + e.getMessage());
- }
- }
Push服务端给开发者提供了基本的主题管理API,支持一次1000个以内的Token加入或者退出某个主题,同时每个开发者最多只能存在2000个不同的主题。主题与Token的订阅关系生效需等待一分钟,待订阅关系生效后,发送消息时就可以直接通过指向Topic或者组合Topic条件的方式实现消息批量发送。
开发者在服务器上实现主题管理功能,需要完成如下开发步骤:
1、开发者服务器获取接入令牌AccessToken,获取方法请参考:开放平台鉴权-客户端密码模式。
2、开发者服务器调用Push服务端主题订阅API或主题退订API进行应用主题订阅或退订,实现对应用主题的管理。
调用主题订阅API示例:
HTTPS POST方式调用API,https://push-api.cloud.huawei.com/v1/[appid]/topic:subscribe
请求消息头示例:
Authorization: Bearer CV0kkX7yVJZcTi1i+uk…Kp4HGfZXJ5wSH/MwIriqHa9h2q66KSl5
Content-Type: application/json
请求消息体示例:
- {
- "topic": "weather",
- "tokenArray": [
- "AOffIB70WGIqdFJWJvwG7SOB...xRVgtbqhESkoJLlW-TKeTjQvzeLm8Up1-3K7",
- "AKk3BMXyo80KlS9AgnpCkk8l...uEUQmD8s1lHQ0yx8We9C47yD58t2s8QkOgnQ"
- ]
- }
调用主题退订API示例:
HTTPS POST方式调用API,https://push-api.cloud.huawei.com/v1/[appid]/topic:unsubscribe
请求消息头示例:
Authorization: Bearer CV0kkX7yVJZcTi1i+uk…Kp4HGfZXJ5wSH/MwIriqHa9h2q66KSl5
Content-Type: application/json
请求消息体示例:
- {
- "topic": "weather",
- "tokenArray": [
- "AOffIB70WGIqdFJWJvwG7SOB...xRVgtbqhESkoJLlW-TKeTjQvzeLm8Up1-3K7",
- "AKk3BMXyo80KlS9AgnpCkk8l...uEUQmD8s1lHQ0yx8We9C47yD58t2s8QkOgnQ"
- ]
- }
当创建完主题后,开发者就可以根据主题发送Push消息。可以参考服务端开发指导进行功能开发。需要注意的是,基于HTTP协议开发时,消息发送Message结构体中需要指定发送的主题参数topic。
按主题进行消息推送,服务端发送Push消息的请求示例报文:
- {
- "validate_only": false,
- "message": {
- "notification": {
- "title": "message title",
- "body": " message body"
- },
- "android": {
- "notification": {
- "click_action": {
- "type": 1,
- "action": "com.huawei.codelabpush.intent.action.test"
- }
- }
- },
- "topic": "weather"
- }
- }
同时华为推送也支持向主题组合发送消息,即指定目标主题的condition条件表达式,示例请参考基于Condition的消息推送。此时需要注意的是,基于HTTP协议开发时,消息发送Message结构体中需要指定发送的主题参数condition。具体conditon条件表达式规范请参考服务端发送Push消息中关于Condition API的描述。