写点什么

推送服务接入指导(HarmonyOS 篇)

作者:HMS Core
  • 2023-06-15
    广东
  • 本文字数:4795 字

    阅读完需:约 16 分钟

消息推送作为 App 运营日常使用的用户促活和召回手段,是与用户建立持续互动和连接的良好方式。推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道,本文旨在介绍 HarmonyOS(Java)版本的功能及接入指导。


HarmonyOS(Java)版本主要功能为根据 token 推送通知栏和透传消息。HarmonyOS Java SDK 为您的 HarmonyOS 应用开发提供推送消息相关的接口,适用于手机和平板。

根据 Push Token 推送消息

您可以输入目标用户的 Push Token 来推送消息,一次最多可填 1000 个 Push Token。

透传消息

透传消息是由客户端应用负责处理的消息。终端设备收到 Push 云端发送的数据或指令后不直接展示,而是将数据传递给应用,由应用解析内容,并触发相关动作(如跳转网页、应用内页面等等)。您可以自定义消息样式,从而更高效灵活地推送消息。


透传消息的到达率受 Android 系统和应用是否驻留在后台影响,推送服务不保证透传消息的高到达率。


透传消息的常用场景:VoIP 呼叫、语音播报、好友互动通知等。

开发准备

具体开发准备请参考官网

应用开发

获取 Push Token

Token 是推送令牌,每个设备上的每个应用的 Token 都是唯一存在的,客户端调用getToken方法向 Push 服务端请求应用的 Token,您可以根据 Push 服务端返回的 Token 向应用推送消息。当getToken方法返回为空时,可通过onNewToken方法获取 Token 值。


建议将 Push Token 上报到您自己的应用服务器,并定时更新 Token 列表。您可以调用下行消息API,根据这些 Token 批量推送消息。


  1. 创建一个新的线程,并调用 getToken 方法获取 Push Token(建议在应用启动后的首个 Ability 中调用 getToken 方法)。


public class TokenAbilitySlice extends AbilitySlice {    private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "TokenAbilitySlice");    private void getToken() {        // 创建新线程        new Thread("getToken") {            @Override            public void run() {                try {                    // 从agconnect-services.json文件中读取client/app_id                    String appId = "your APP_ID";                    // 输入token标识"HCM"                    String tokenScope = "HCM";                    // 获取Push Token                    String token = HmsInstanceId.getInstance(getAbility().getAbilityPackage(), TokenAbilitySlice.this).getToken(appId, tokenScope);                } catch (ApiException e) {                    // 获取Push Token失败时,打印错误码                    HiLog.error(LABEL_LOG, "get token failed, the error code is %{public}d", e.getStatusCode());                }            }        }.start();    }}
复制代码


  1. 在您的 service(已继承HmsMessageService)中,覆写 onNewToken 方法,当 Token 发生变化时以onNewToken方法返回。


public class DemoHmsMessageServiceAbility extends HmsMessageService {    private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "DemoHmsMessageServiceAbility");
@Override // 获取Token public void onNewToken(String token) { HiLog.info(LABEL_LOG, "onNewToken called, token:%{public}s", token); }
@Override // 获取Token失败,打印错误码 public void onTokenError(Exception exception) { HiLog.error(LABEL_LOG, "get onNewtoken error, error code is %{public}d", ((ZBaseException)exception).getErrorCode()); }}
复制代码

获取透传消息数据

在您的 service(已继承HmsMessageService)中,覆写onMessageReceived方法,只要您发送透传消息至终端设备,都会获得透传消息的内容。


public class DemoHmsMessageServiceAbility extends HmsMessageService {    private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "DemoHmsMessageServiceAbility");    @Override    public void onMessageReceived(ZRemoteMessage message) {        // 打印消息的内容字段        HiLog.info(LABEL_LOG, "get token, %{public}s", message.getToken());        HiLog.info(LABEL_LOG, "get data, %{public}s", message.getData());
ZRemoteMessage.Notification notification = message.getNotification(); if (notification != null) { HiLog.info(LABEL_LOG, "get title, %{public}s", notification.getTitle()); HiLog.info(LABEL_LOG, "get body, %{public}s", notification.getBody()); } }}
复制代码

发送消息

• 您可以登录AppGallery Connect网站发送消息,详情请参见HarmonyOS应用推送消息。


• 您可以使用服务端 API 向应用推送消息:


  1. 您的服务器调用华为帐号服务器的接口(https://oauth-login.cloud.huawei.com/oauth2/v3/token)请求凭证 Token。请求示例如下:


POST /oauth2/v3/token HTTP/1.1Host: oauth-login.cloud.huawei.comContent-Type: application/x-www-form-urlencoded grant_type=client_credentials&client_id=<客户端ID>&client_secret=<客户端密钥>
复制代码


响应示例如下:


HTTP/1.1 200 OKContent-Type: application/json;charset=UTF-8Cache-Control: no-store
{ "access_token": "<返回的Access Token>", "expires_in": 3600, "token_type": "Bearer"}
复制代码


  1. 您的服务端调用 API 推送消息,请求示例如下。


HTTPS POST URL:


POST https://push-api.cloud.huawei.com/v1/clientid/messages:send
复制代码


请求消息头示例:


Content-Type: application/json; charset=UTF-8Authorization: Bearer CF3Xl2XV6jMK************************DgAPuzvNm3WccUIaDg==
复制代码


请求消息体(通知栏消息)示例:


{    "validate_only": false,    "message": {        "android": {            "notification": {                "title": "test title",                "body": "test body",                "click_action": {                    "type": 3                }            }        },        "token": ["pushtoken1"]    }}
复制代码

自定义点击消息动作

您可以自定义点击通知栏消息的动作,例如:打开应用首页、打开网页 URL 和打开应用自定义页面。

打开 App 首页

• 您可以通过AppGallery Connect推送消息,设置点击通知动作为打开应用、App 页面为首页


• 您可以通过服务端 API 推送消息:


消息体中携带click_action字段,type取值为 3 表示点击消息后打开应用首页。


{    "validate_only": false,    "message": {        "android": {            "notification": {                "title": "test title",                "body": "test body",                "click_action": {                    "type": 3                }            }        },        "token": ["pushtoken1"]    }}
复制代码

打开网页

• 您可以通过AppGallery Connect推送消息,设置点击通知动作为打开网页


• 您可以通过服务端 API 推送消息:


消息体中携带click_action字段,type取值为 2 表示点击消息后打开网页。


{    "validate_only": false,    "message": {        "android": {            "notification": {                "title": "test title",                "body": "test body",                "click_action": {                    "type": 2,                    "url":"https://www.huawei.com"                }            }        },        "token": ["pushtoken1"]    }}
复制代码

打开应用自定义页面

  1. 客户端应用先创建自定义页面(以“MyActionAbility”为例),在您项目的“entry/src/main”目录下的“config.json”文件中添加该 Ability 的 skills 字段。其中 entities 的值为“entity.system.default”不可改变,actions 的值由您自定义(以“com.test.myaction”为例)。


{    "orientation": "unspecified",    "name": "com.test.java.MyActionAbility",    "icon": "$media:icon",    "description": "$string:myactionability_description",    "label": "$string:entry_MyActionAbility",    "type": "page",    "launchType": "standard",    "skills": [            {            "entities": ["entity.system.default"],            "actions": ["com.test.myaction"]            }     ]}
复制代码


  1. 您可以通过AppGallery Connect推送消息,设置点击通知动作为打开应用、App 页面为自定义action页面(action 请输入上一步中定义的 actions 的值)。


您也可以通过服务端 API 推送消息。消息体中携带click_actionaction字段,type取值为 1 表示点击消息后打开应用自定义页面,action取值为上一步中定义的 actions 的值。


{    "validate_only": false,    "message": {        "android": {            "notification": {                "title": "test title",                "body": "test body",                "click_action": {                    "type": 1,                    "action":"com.test.myaction"                }            }        },        "token": ["pushtoken1"]    }}
复制代码

传递数据

您推送消息时可携带 data 字段,当用户点击消息时通过下述方法将 data 中的数据传递至客户端应用。


  1. 推送消息时携带data字段:


• 通过 AppGallery Connect 推送消息且设置自定义键值对


• 通过服务端 API 推送消息,消息体中携带 data 字段。


{    "validate_only": false,    "message": {        "android": {            "notification": {                "title": "test title",                "body": "test body",                "click_action": {                    "type": 1,                    "action":"com.test.myaction"                }            },            "data": "{'key_data':'value_data'}"        },        "token": ["pushtoken1"]    }}
复制代码


  1. 在客户端应用开发点击消息跳转的页面获取 data 字段的功能,此处以点击消息跳转到应用首页(MainAbilitySlice)获取 data 字段为例。


public class MainAbilitySlice extends AbilitySlice {    private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "myDemo");    @Override        public void onStart(Intent intent) {                HiLog.info(LABEL_LOG, "MainAbilitySlice get started...");        super.onStart(intent);        super.setUIContent(ResourceTable.Layout_ability_main);        // 调用解析方法        parseIntent(intent);    }
private void parseIntent(Intent intent){ if (intent == null){return;} IntentParams intentParams = intent.getParams(); if (intentParams == null) {return;} // 获取data字段中的键值对 String key = "key_data"; Object obj = intentParams.getParam(key); try{ // 打印data字段中的键值对 HiLog.info(LABEL_LOG, "my key: %{public}s, my value: %{public}s", key, obj); }catch (Exception e){ HiLog.info(LABEL_LOG, "catch exception : " + e.getMessage()); } }}
复制代码


了解更多详情>>


访问华为推送服务联盟官网


获取华为推送服务开发指导文档


访问HMS Core 联盟官网


获取HMS Core 开发指导文档


关注我们,第一时间了解 HMS Core 最新技术资讯~

用户头像

HMS Core

关注

HMS Core技术团队。 2022-06-16 加入

分享最新的技术干货,带来最全的能力应用场景,更新热门开发者圈子活动。与开发者一起,同成长,共精彩。

评论

发布
暂无评论
推送服务接入指导(HarmonyOS篇)_HMS Core_HMS Core_InfoQ写作社区