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

推送,服务,接入,指导,harmonyos · 浏览次数 : 249

小编点评

**生成内容时带排版** **1. 使用格式化输出** ```java System.out.printf("格式化输出:%s", "格式化内容"); ``` **2. 使用格式化输出与数据结合** ```java String key = "key_data"; Object obj = "value_data"; System.out.printf("格式化输出与数据结合:%s, %s", key, obj); ``` **3. 使用格式化输出与多个数据结合** ```java String key1 = "key_data1"; String key2 = "key_data2"; Object obj1 = "value_data1"; Object obj2 = "value_data2"; System.out.printf("格式化输出与多个数据结合:%s, %s, %s", key1, key2, obj1); ``` **4. 使用格式化输出与条件结合** ```java String key = "key_data"; Object obj = "value_data"; String condition = "condition"; System.out.printf("格式化输出与条件结合:%s, %s, %s", key, obj, condition); ``` **5. 使用格式化输出与循环结合** ```java String key = "key_data"; for (int i = 0; i < 10; i++) { System.out.printf("格式化输出与循环结合:%s", key); } ``` **6. 使用格式化输出与多个格式输出结合** ```java String key = "key_data"; Object obj1 = "value_data1"; Object obj2 = "value_data2"; String format1 = "格式1"; String format2 = "格式2"; System.out.printf("格式化输出与多个格式输出结合:%s, %s, %s", key, obj1, obj2); ```

正文

消息推送作为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.1
Host: oauth-login.cloud.huawei.com
Content-Type: application/x-www-form-urlencoded
 
grant_type=client_credentials&client_id=<客户端ID>&client_secret=<客户端密钥>

响应示例如下:

HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-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-8
Authorization: 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 最新技术资讯~

与推送服务接入指导(HarmonyOS篇)相似的内容:

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

消息推送作为App运营日常使用的用户促活和召回手段,是与用户建立持续互动和连接的良好方式。[推送服务](https://developer.huawei.com/consumer/cn/hms/huawei-pushkit?ha_source=hms1)(Push Kit)是华为提供的消息推送平台,

推送服务本地通知频次及分类管控通知

尊敬的华为开发者: 为了给用户提供更好的消息通知体验,营造清朗网络空间。从2023年9月15日开始,华为推送服务将基于《华为消息分类标准》对本地通知进行灰度管控,主要包括对应用发送的本地通知进行分类管理,以及对资讯营销消息统一进行频次管控。 (注:本地通知指应用客户端直接调用系统接口发送的通知 。)

【FAQ】推送服务常见问题及解决方案

一、推送成功收不到消息,推送返回:{"message":"success","requestID":"1523868*****2842718","resultcode":0} 排查步骤: 1、网络不稳定,切换稳定网络进行测试; 2、检查手机是否为EMUI8.0.0系统,如果是早期的EMUI8.0,则

无惧百万级并发,GaussDB(for Cassandra)让华为推送服务更快触达

摘要:推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。通过集成推送服务,您可以向客户端应用实时推送消息,让应用更精准触达用户,是开发者提升用户感知度和活跃度的一件利器。 本文分享自华为云社区《无惧百万级并发,GaussDB(for Cassandra)让华为P

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

一. 问题描述 使用华为推送服务下发IM消息时,下发消息请求成功且code码为80000000,但是手机总是收不到消息; 在华为推送自助分析(Beta)平台查看发现,消息发送触发了频控。 二. 问题原因及背景 2023年1月05日起,华为推送服务对咨询营销类消息做了单个设备每日推送数量上限管理,具体

HarmonyOS系统级推送服务,打造消息通知新体验

8月4日,第五届华为开发者大会 2023(HDC.Together)再次启航。在本次大会上,华为为广大用户带来了HarmonyOS 4全新升级的体验,同时,针对HarmonyOS应用的开发,此次也全面升级了HarmonyOS SDK开放能力。[账号服务](https://developer.huaw

【FAQ】HMS Core推送服务推送角标的开发及常见问题解答

### 目录 1、发送消息并显示桌面数字角标。 2、如何清除数字角标? 3、如何设置圆点角标? 4、应用桌面图标角标开关无法开启或未显示开关。 5、推送消息设置了角标字段但未显示角标? 6、未设置角标参数,但收到消息后显示了角标。 ### 解决方案 #### Q1:发送消息并显示桌面数字角标。 实现

预约直播|3月30日下周四,应用促活大揭秘,快速提升DAU

【导读】 日常运营过程中,消息推送是App触达用户的常用手段,无论是新功能的通知,还是活动的提醒,都可以通过推送告知用户。千人千面的个性化推送,对于提升用户粘性、用户转化等指标都具有明显正向效果。越来越多的应用选择华为Push用户增长服务作为拉新、促活的首选渠道,他们选择的理由是什么?他们又是如何持

Adobe 构建 IDP 之路的经验与教训

在过去的25年多时间里,我创建了软件组件和分布式框架,建立并领导了相关团队。近几年我致力于推动 Adobe 服务开发、部署和管理系统的开发人员生产力。 ## 抽象陷阱 在云时代早期,Adobe 的每个团队都有自己的云账户、部署系统,其对应的成熟度也截然不同。很快我们就意识到需要对此进行标准化,这样成

Serverless时代的微服务开发指南:华为云提出七大实践新标准

摘要:本文结合华为云在Serverless Microservice方面的实践,总结提炼出七大Serverless Microservice开发 “实践标准”,为加速全域Serverless产业升级、推动企业应用开发框架从微服务向Serverless演进提供一些思考。 作者信息—— 历川:华为云 S