消息推送作为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方法)。
  1. public class TokenAbilitySlice extends AbilitySlice {
  2. private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234,
  3. "TokenAbilitySlice");
  4. private void getToken() {
  5. // 创建新线程
  6. new Thread("getToken") {
  7. @Override
  8. public void run() {
  9. try {
  10. // 从agconnect-services.json文件中读取client/app_id
  11. String appId = "your APP_ID";
  12. // 输入token标识"HCM"
  13. String tokenScope = "HCM";
  14. // 获取Push Token
  15. String token = HmsInstanceId.getInstance(getAbility().getAbilityPackage(), TokenAbilitySlice.this).getToken(appId, tokenScope);
  16. } catch (ApiException e) {
  17. // 获取Push Token失败时,打印错误码
  18. HiLog.error(LABEL_LOG, "get token failed, the error code is %{public}d", e.getStatusCode());
  19. }
  20. }
  21. }.start();
  22. }
  23. }
  1. 在您的service(已继承HmsMessageService)中,覆写onNewToken方法,当Token发生变化时以onNewToken方法返回。
  1. public class DemoHmsMessageServiceAbility extends HmsMessageService {
  2. private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "DemoHmsMessageServiceAbility");
  3. @Override
  4. // 获取Token
  5. public void onNewToken(String token) {
  6. HiLog.info(LABEL_LOG, "onNewToken called, token:%{public}s", token);
  7. }
  8. @Override
  9. // 获取Token失败,打印错误码
  10. public void onTokenError(Exception exception) {
  11. HiLog.error(LABEL_LOG, "get onNewtoken error, error code is %{public}d", ((ZBaseException)exception).getErrorCode());
  12. }
  13. }

获取透传消息数据

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

  1. public class DemoHmsMessageServiceAbility extends HmsMessageService {
  2. private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234,
  3. "DemoHmsMessageServiceAbility");
  4. @Override
  5. public void onMessageReceived(ZRemoteMessage message) {
  6. // 打印消息的内容字段
  7. HiLog.info(LABEL_LOG, "get token, %{public}s", message.getToken());
  8. HiLog.info(LABEL_LOG, "get data, %{public}s", message.getData());
  9. ZRemoteMessage.Notification notification = message.getNotification();
  10. if (notification != null) {
  11. HiLog.info(LABEL_LOG, "get title, %{public}s", notification.getTitle());
  12. HiLog.info(LABEL_LOG, "get body, %{public}s", notification.getBody());
  13. }
  14. }
  15. }

发送消息

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

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

  1. 您的服务器调用华为帐号服务器的接口(https://oauth-login.cloud.huawei.com/oauth2/v3/token)请求凭证Token。请求示例如下:
  1. POST /oauth2/v3/token HTTP/1.1
  2. Host: oauth-login.cloud.huawei.com
  3. Content-Type: application/x-www-form-urlencoded
  4. grant_type=client_credentials&client_id=<客户端ID>&client_secret=<客户端密钥>

响应示例如下:

  1. HTTP/1.1 200 OK
  2. Content-Type: application/json;charset=UTF-8
  3. Cache-Control: no-store
  4. {
  5. "access_token": "<返回的Access Token>",
  6. "expires_in": 3600,
  7. "token_type": "Bearer"
  8. }
  1. 您的服务端调用API推送消息,请求示例如下。

HTTPS POST URL:

  1. POST https://push-api.cloud.huawei.com/v1/clientid/messages:send

请求消息头示例:

  1. Content-Type: application/json; charset=UTF-8
  2. Authorization: Bearer CF3Xl2XV6jMK************************DgAPuzvNm3WccUIaDg==

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

  1. {
  2. "validate_only": false,
  3. "message": {
  4. "android": {
  5. "notification": {
  6. "title": "test title",
  7. "body": "test body",
  8. "click_action": {
  9. "type": 3
  10. }
  11. }
  12. },
  13. "token": ["pushtoken1"]
  14. }
  15. }

自定义点击消息动作

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

打开App首页

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

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

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

  1. {
  2. "validate_only": false,
  3. "message": {
  4. "android": {
  5. "notification": {
  6. "title": "test title",
  7. "body": "test body",
  8. "click_action": {
  9. "type": 3
  10. }
  11. }
  12. },
  13. "token": ["pushtoken1"]
  14. }
  15. }

打开网页

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

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

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

  1. {
  2. "validate_only": false,
  3. "message": {
  4. "android": {
  5. "notification": {
  6. "title": "test title",
  7. "body": "test body",
  8. "click_action": {
  9. "type": 2,
  10. "url":"https://www.huawei.com"
  11. }
  12. }
  13. },
  14. "token": ["pushtoken1"]
  15. }
  16. }

打开应用自定义页面

  1. 客户端应用先创建自定义页面(以“MyActionAbility”为例),在您项目的“entry/src/main”目录下的“config.json”文件中添加该Ability的skills字段。其中entities的值为“entity.system.default”不可改变,actions的值由您自定义(以“com.test.myaction”为例)。
  1. {
  2. "orientation": "unspecified",
  3. "name": "com.test.java.MyActionAbility",
  4. "icon": "$media:icon",
  5. "description": "$string:myactionability_description",
  6. "label": "$string:entry_MyActionAbility",
  7. "type": "page",
  8. "launchType": "standard",
  9. "skills": [
  10. {
  11. "entities": ["entity.system.default"],
  12. "actions": ["com.test.myaction"]
  13. }
  14. ]
  15. }
  1. 您可以通过AppGallery Connect推送消息,设置点击通知动作为打开应用、App页面为自定义action页面(action请输入上一步中定义的actions的值)。

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

  1. {
  2. "validate_only": false,
  3. "message": {
  4. "android": {
  5. "notification": {
  6. "title": "test title",
  7. "body": "test body",
  8. "click_action": {
  9. "type": 1,
  10. "action":"com.test.myaction"
  11. }
  12. }
  13. },
  14. "token": ["pushtoken1"]
  15. }
  16. }

传递数据

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

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

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

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

  1. {
  2. "validate_only": false,
  3. "message": {
  4. "android": {
  5. "notification": {
  6. "title": "test title",
  7. "body": "test body",
  8. "click_action": {
  9. "type": 1,
  10. "action":"com.test.myaction"
  11. }
  12. },
  13. "data": "{'key_data':'value_data'}"
  14. },
  15. "token": ["pushtoken1"]
  16. }
  17. }
  1. 在客户端应用开发点击消息跳转的页面获取data字段的功能,此处以点击消息跳转到应用首页(MainAbilitySlice)获取data字段为例。
  1. public class MainAbilitySlice extends AbilitySlice {
  2. private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xD001234, "myDemo");
  3. @Override
  4. public void onStart(Intent intent) {
  5. HiLog.info(LABEL_LOG, "MainAbilitySlice get started...");
  6. super.onStart(intent);
  7. super.setUIContent(ResourceTable.Layout_ability_main);
  8. // 调用解析方法
  9. parseIntent(intent);
  10. }
  11. private void parseIntent(Intent intent){
  12. if (intent == null){return;}
  13. IntentParams intentParams = intent.getParams();
  14. if (intentParams == null) {return;}
  15. // 获取data字段中的键值对
  16. String key = "key_data";
  17. Object obj = intentParams.getParam(key);
  18. try{
  19. // 打印data字段中的键值对
  20. HiLog.info(LABEL_LOG, "my key: %{public}s, my value: %{public}s", key, obj);
  21. }catch (Exception e){
  22. HiLog.info(LABEL_LOG, "catch exception : " + e.getMessage());
  23. }
  24. }
  25. }

了解更多详情>>

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

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

访问HMS Core 联盟官网

获取HMS Core 开发指导文档

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

推送服务接入指导(HarmonyOS篇)的更多相关文章

  1. 【FAQ】接入HMS Core推送服务,服务端下发消息常见错误码原因分析及解决方法

    HMS Core推送服务支持开发者使用HTTPS协议接入Push服务端,可以从服务器发送下行消息给终端设备.这篇文章汇总了服务端下发消息最常见的6个错误码,并提供了原因分析和解决方法,有遇到类似问题的 ...

  2. 基于APNs最新HTTP/2接口实现iOS的高性能消息推送(服务端篇)

    1.前言 本文要分享的消息推送指的是当iOS端APP被关闭或者处于后台时,还能收到消息/信息/指令的能力. 这种在APP处于后台或关闭情况下的消息推送能力,通常在以下场景下非常有用: 1)IM即时通讯 ...

  3. 【FAQ】接入HMS Core推送服务过程中一些常见问题总结

    HMS Core 推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道.开发者通过集成推送服务,可以向客户端应用实时推送消息,构筑良好的用户关系,提升用户的感知度和活 ...

  4. 接入WxPusher微信推送服务出现错误:Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported

    背景 使用WxPusher微信推送服务 ,可以及时的将服务的一些运行异常信息,发送到自己的微信上,方便了解服务的运行状态(PS:这个服务是免费的). 你可以在这里看到WxPusher微信推送服务的接入 ...

  5. 【FAQ】HMS Core推送服务与本地创建通知消息如何相互覆盖?

    我们知道,单独使用HMS Core推送服务或本地创建通知消息,都可以实现通知消息的覆盖,方式分别为: 1.本地创建通知消息(简称本地通知消息) 通过notificationManager.notify ...

  6. 【FAQ】关于华为推送服务因营销消息频次管控导致服务通讯类消息下发失败的解决方案

    一. 问题描述 使用华为推送服务下发IM消息时,下发消息请求成功且code码为80000000,但是手机总是收不到消息: 在华为推送自助分析(Beta)平台查看发现,消息发送触发了频控. 二. 问题原 ...

  7. Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

  8. Ejabberd作为推送服务的优化手段

    AVOS Cloud目前还在用Ejabberd做Android的消息推送服务.当时选择Ejabberd,是因为Ejabberd是一个发展很长时间的XMPP实现,并且基于Erlang,设想能在我们自主研 ...

  9. 百度云推送-服务端 C# SDK

    思路: 1.公司有项目需要做android和ios手机端推送消息的功能: 2.没有接触过这方面的知识,一头雾水,开始在网上一顿搜,网上倒是有不少解决方案,首先搜的是android的解决方案,因为ios ...

  10. Netty_Netty系列之Netty百万级推送服务设计要点

    1. 背景 1.1. 话题来源 最近很多从事移动互联网和物联网开发的同学给我发邮件或者微博私信我,咨询推送服务相关的问题.问题五花八门,在帮助大家答疑解惑的过程中,我也对问题进行了总结,大概可以归纳为 ...

随机推荐

  1. linux服务器qps查询,查看当前linux服务器的QPS

    https://blog.csdn.net/weixin_42119281/article/details/116595205 QPS:每秒查询率(QPS,Queries-per-second)是对一 ...

  2. ArcMap安装OSM路网数据编辑插件ArcGIS Editor for OSM的方法

      本文介绍在ArcGIS下属的ArcMap软件中,ArcGIS Editor for OpenStreetMap这一工具集插件的下载与安装的具体方法.   ArcGIS Editor for Ope ...

  3. day128:MySQL进阶:MySQL安装&用户/权限/连接/配置管理&MySQL的体系结构&SQL&MySQL索引和执行计划

    目录 1.介绍和安装 2.基础管理 2.1 用户管理 2.2 权限管理 2.3 连接管理 2.4 配置管理 3.MySQL的体系结构 4.SQL 5.索引和执行计划 1.介绍和安装 1.1 数据库分类 ...

  4. day84:luffy:优惠活动策略&用户认证&购物车商品的勾选/结算

    目录 1.课程列表页活动和真实价格计算 1.优惠活动策略的model表结构 2.课程列表页显示优惠类型名称 3.课程列表页显示真实价格 4.将优惠类型名称和真实价格显示到前端页面上 5.课程列表页显示 ...

  5. layUI之树状表格异步加载组件treetableAsync.js(基于treetable.js)

    目录 概述 1. 使用说明 2. 使用需知 2.1 本组件依赖于treetable.js[重中之重] 2.2 本组件基于layUIAdmin进行使用 2.3 本组件的方法支持treetable.js的 ...

  6. [Asp.Net Core] 网站中的XSS跨站脚本攻击和防范

    漏洞说明: 跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS.恶意攻击者往 ...

  7. 基于Python的爬虫案例

    案例1:使用爬虫爬取京东华为手机用户评论 本案例借鉴哔哩哔哩博客主视频教程,感谢其教程为我开启了爬虫之旅:https://www.bilibili.com/video/BV1Yt4y1Y7nt?t=3 ...

  8. 基于Switching的 恒虚警率检测算法

    转发和使用请注明来源,以下为本人精心整理,还请尊重本人劳动成果与产权!由于本人现有知识和能力有限,如存在错误之处请指正!下面为正文内容: 1.S-CFAR检测算法(Switching,开关CFAR) ...

  9. Linux操作系统网络模块

    Linux操作系统的网络模块是负责网络通信的核心部分.它通过实现各种协议和算法,使得计算机能够在网络中进行数据交换和通信.网络模块主要包括以下几个方面的功能: (1)IP协议栈:负责处理网络层的数据包 ...

  10. 程序猿要chatpgpt干掉了?

    如何拥抱被chatpgpt拉开的人工智能大时代 昨天 chatgpt-4 发布了.我看到好多技术圈的人都惶恐着,以后咱们都要失业了/(ㄒoㄒ)/~~ 和之前差不多的是毫无意外地又引动了一大波舆论.虽然 ...