华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 7 推送卡片刷新消息

news2024/9/27 14:25:34

场景介绍

如今衣食住行娱乐影音应用占据了大多数人的手机,一部手机可以满足日常大多需求,但对需要经常查看或进行简单操作的应用来说,总需要用户点开应用体验较繁琐。针对此种场景,HarmonyOS提供了Form Kit(卡片开发服务),您可以将应用的重要信息或操作前置到卡片,以达到服务直达、减少体验层级的目的。

面对需要实时更新信息的应用卡片,Push Kit向开发者提供了卡片刷新服务。应用通过集成Push Kit后获取Push Token,基于Push Kit的系统级通道,便可以在合适场景向用户即时推送卡片内容,从而提升用户的感知度和活跃度。

cke_4665.png

频控规则

调测阶段,每个项目每日全网最多可推送1000条测试消息。发送测试消息需设置testMessage为true。

正式发布阶段,单设备单应用下每日推送消息总条数受设备消息频控限制,所有场景化消息发送条数不超过3000条。

单张服务卡片刷新消息受应用是否上架影响:

  • 已上架:单设备单应用下单张卡片每日限制发送2条消息。
  • 未上架:单设备单应用下单张卡片每日限制发送5条消息。

说明

不论是测试消息还是正式消息,卡片刷新消息单次发送仅能携带一个Token。

开发步骤

开发卡片

推送卡片刷新消息前,您需先完成本地卡片的开发。

  1. 参见创建一个ArkTS卡片,完成本地服务卡片的创建。
  2. 在项目模块级别下的src/main/resources/base/profile/form_config.json中配置dataProxyEnabled字段为true,开启卡片代理刷新功能。
    {
    "forms": [
    {
    "name": "WidgetCard",
    "src": "./ets/widget/pages/WidgetCard.ets",
    "uiSyntax": "arkts",
    "window": {
    "designWidth": 720,
    "autoDesignWidth": true
    },
    "colorMode": "auto",
    "isDefault": true,
    "updateEnabled": true,
    "updateDuration": 1,
    "scheduledUpdateTime": "10:30",
    "defaultDimension": "2*2",
    "supportDimensions": ["2*2"],
    "dataProxyEnabled": true
    }
    ]
    }

  3. 在卡片生命周期管理文件(下以EntryFormAbility为例)的onAddForm()回调中获取formId,定义需要在卡片页面文件(下以WidgetCard为例)中和通过Push Kit要刷新的字段,如下以text_keyimage_key为例。

    import { formBindingData, formInfo, FormExtensionAbility } from '@kit.FormKit';
    import { Want } from '@kit.AbilityKit';
    export default class EntryFormAbility extends FormExtensionAbility {
    onAddForm(want: Want): formBindingData.FormBindingData {
    // 获取formId
    const formId = want.parameters![formInfo.FormParam.IDENTITY_KEY] as string;
    // 定义需要在WidgetCard中刷新的字段
    class CreateFormData {
    formId: string = '';
    text_key: string = '';
    image_key: string = '';
    }
    const obj: CreateFormData = {
    formId: formId,
    text_key: '默认文本',
    image_key: ''
    }
    const bindingData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj);
    // 定义需要通过Push Kit代理刷新的字段,每个key均需要在上面bindingData中定义
    const text_key: formBindingData.ProxyData = {
    key: 'text_key',
    subscriberId: formId
    };
    const image_key: formBindingData.ProxyData = {
    key: 'image_key',
    subscriberId: formId
    };
    bindingData.proxies = [text_key, image_key];
    return bindingData;
    }
    }

  4. 卡片页面文件( src/main/ets/widget/pages/WidgetCard.ets为例)中,创建LocalStorage变量并与@Entry装饰器绑定,使用@LocalStorageProp装饰器创建key-value的变量。

    本文创建了formId、text和image三个变量,对应的key为formIdtext_keyimage_key,需要注意的是卡片页面布局中image对应的组件是Image图片组件,图片组件传递的变量必须以 memory:// 开头。

    // 定义页面级的UI状态存储LocalStorage
    const storage = new LocalStorage();
    // 绑定
    @Entry(storage)
    @Component
    struct WidgetCard {
    @LocalStorageProp('formId') formId: string = '';
    @LocalStorageProp('text_key') text: string = '';
    @LocalStorageProp('image_key') image: string = '';
    build() {
    Flex({ direction: FlexDirection.Column }) {
    Row() {
    Text() {
    // Span是Text组件的子组件,用于显示行内文本
    Span('formID:')
    Span(this.formId)
    }
    .fontSize(10)
    }
    Row() {
    Text() {
    Span('文本:')
    Span(this.text)
    }
    .fontSize(10)
    }
    Row() {
    if (this.image) {
    Image('memory://' + this.image).height(80)
    }
    }
    }
    .padding(10)
    }
    }

推送卡片刷新消息

  1. 参见指导获取Push Token。
  2. (可选)建议您将formIdpushToken等信息上报到应用服务端,用于向应用发送卡片刷新消息。

    // 以下为伪代码
    import { Want } from '@kit.AbilityKit';
    import { pushService } from '@kit.PushKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    import { formInfo } from '@kit.FormKit';
    async function saveFormInfo(want: Want): Promise<void> {
    try {
    const formId = want.parameters![formInfo.FormParam.IDENTITY_KEY] as string;
    const moduleName = want.moduleName;
    const abilityName = want.abilityName;
    const formName = want.parameters![formInfo.FormParam.NAME_KEY] as string;
    const pushToken: string = await pushService.getToken();
    // 将formId, moduleName, abilityName, formName, pushToken 上报到应用服务端
    } catch (err) {
    let e: BusinessError = err as BusinessError;
    hilog.error(0x0000, 'testTag', 'Failed to save form info: %{public}d %{public}s', e.code, e.message);
    }
    }

  3. 应用服务端调用REST API推送卡片刷新消息,消息详情可参见场景化消息API接口功能介绍,请求示例如下:
    ​
    // Request URL
    POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
    // Request Header
    Content-Type: application/json
    Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    push-type: 1
    // Request Body
    {
    "payload": {
    "moduleName": "entry",
    "abilityName": "EntryFormAbility",
    "formName": "widget",
    "formId": 423434262,
    "version": 123456,
    "formData": {
    "text_key": "刷新文本内容"
    },
    "images": [
    {
    "keyName": "image_key",
    "url": "***",
    "require": 1
    }
    ]
    },
    "target": {
    "token": [
    "IQAAAAC*************************dRH7_bPbfMrVfsYw"
    ]
    },
    "pushOptions": {
    "testMessage": true
    }
    }
    ​
    • [projectId]:项目ID,登录AppGallery Connect网站,选择“我的项目”,在项目列表中选择对应的项目,左侧导航栏选择“项目设置”,在该页面获取。
    • Authorization:JWT格式字符串,可参见Authorization获取。
    • push-type:1表示服务卡片刷新场景。
    • moduleName:项目模块级别下的 src/main/module.json5 中的 module 标签下的name值。

      cke_10864.png

    • abilityName:项目模块级别下的src/main/module.json5中的extensionAbilities标签下的服务卡片的ability名称。

      cke_16651.png

    • formName:项目模块级别下的src/main/resources/base/profile/form_config.json中的forms标签下的服务卡片的名称。下图以卡片配置文件form_config为例:

      cke_22225.png

    • version:当前卡片刷新消息的版本号,新的卡片刷新消息的版本号需大于当前卡片刷新消息版本号,否则会刷新失败。详情参见version。
    • formId:服务卡片的实例ID,当卡片的onAddForm()方法被调用时(卡片使用方添加卡片至桌面)进行获取。最大值为2^31-1
    • formData:填写待刷新服务卡片的业务数据,该数据来源于项目模块级别下的src/main/ets/widget/pages/WidgetCard.ets文件下的声明式范式组件名称。下图以卡片页面文件WidgetCard为例:

      cke_27907.png

    • images:待刷新服务卡片业务数据中的图片数据,其中keyName为您服务卡片中图片控件的key值,url为图片的地址(需替换为图片风控验证后的downloadUrl),下图以卡片页面文件WidgetCard为例:

      cke_33688.png

    • require:图片刷新策略控制,“0”表示如果图片下载失败,仅刷新文字;“1”表示如果图片下载失败,则不进行刷新操作。
    • token:Push Token,可参见获取Push Token获取。
    • testMessage:测试消息标识,true表示测试消息。每个项目每天限制发送1000条测试消息,单次推送仅能发送一个Token。详情请参见testMessage。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2170226.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Harbor安装笔记

下载离线安装包 wget https://github.com/goharbor/harbor/releases/download/v2.11.1/harbor-offline-installer-v2.11.1.tgz 解压 tar -zxvf harbor-offline-installer-v2.11.1.tgz 复制一份配置文件出来&#xff0c;修改配置 cp harbor.yml.tmpl harbor.yml vim harbor…

You are not allowed to push code to this project

原因1 用户权限不够。 具体查看用户权限路径&#xff1a; 原因2 vscode之前都能提交代码&#xff0c;但是突然就提交不上了。 表现为:前端代码能拉取&#xff0c;但是不能提交。使用idea进行前端代码的提交&#xff0c;完全没问题。 解决方案&#xff1a;修改TortoiseG…

【MySQL】常见的SQL优化方式

目录 1、插入数据 &#xff08;1&#xff09;批量插入 &#xff08;2&#xff09;手动提交事务 &#xff08;3&#xff09;主键顺序插入 2、主键优化 &#xff08;1&#xff09;页分裂 &#xff08;2&#xff09;页合并 3、order by 优化 &#xff08;1&#xff09;排…

探索有向图深度优先搜索的路径与时间的猜想:反例研究

探索有向图深度优先搜索的路径与时间的猜想:反例研究 引言深度优先搜索(DFS)猜想描述反例构造图结构提供一个DFS遍历顺序伪代码具体的DFS遍历时间戳记录分析C语言实现代码解释运行结果结论引言 在图论中,深度优先搜索(DFS)是一种重要的图遍历算法,被广泛应用于寻找路径…

VMware ESXi 8.0U3b macOS Unlocker OEM BIOS 2.7 标准版和厂商定制版

VMware ESXi 8.0U3b macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版&#xff0c;Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)、Hitachi (日立)、Fujitsu (富士通)、NEC (日电) 定制版、Huawei (华为) OEM 定制版 请访问…

【讲解+样例】使用opencv对aruco Markers识别

aruco标记与传统棋盘格功能相似&#xff0c;但是更快更便捷。棋盘格使用移步&#xff1a;【鱼眼&#xff0b;普通相机】相机标定 一、 aruco简介 aruco又称为aruco标记、aruco标签、aruco二维码。ArUco 标记通常是正方形的黑白图案。由黑色边框和内部的二进制矩阵组成。内部矩…

63.HDMI显示器驱动设计与验证-彩条实验

&#xff08;1&#xff09;常见的视频传输接口有三种&#xff1a; VGA 接口、 DVI 接口和 HDMI 接口&#xff0c;目前的显示设备都配有这三种视频传输接口。三类视频接口的发展历程为 VGA→DVI→HDMI。其中 VGA 接口出现最早&#xff0c;只能传输模拟图像信号&#xff1b; 随后…

CSS 背景属性概览:颜色、图像、位置、组合及透明

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 background - color background - image background - repeat background - position background - attachment background组合 背景透明 非 VIP 用户可前往公众号回复“css”进行免费阅读 background - color …

Stable Diffusion绘画 | SDXL模型的优缺点及模型推荐

现在 SD 已经开始全面进入 SDXL 的高分辨率时代。 SDXL 模型的优点 学习参数最多的模型&#xff1a;参数总量超过100亿&#xff0c;可对标 Midjourney 分辨率提升4倍&#xff1a;底模分辨率直接为 1024 x 1024 多出 Refiner 采样重构器&#xff1a;能增加更多的细节 更强的提示…

2024上海工博会,正运动展位新品与应用方案(二)

上海&#xff0c;9月26日&#xff0c;上海工博会已成功开展三天。正运动展位&#xff08;6.1H-E261&#xff09;依然人气高涨&#xff0c;吸引了众多专业观众和行业同仁的关注。精彩仍在继续&#xff5e; 展会现场 01 多元工业应用场景方案展示 DEMO应用演示在本次展会上&…

云打包p12苹果证书和profile文件在线制作流程

使用hbuilderx的uniapp框架&#xff0c;除了开发小程序外&#xff0c;还可以打包出原生的安卓或苹果应用。 假如是打包安卓应用个&#xff0c;则需要安卓证书。 而假如打包ios应用&#xff0c;则需要p12格式的苹果证书和苹果证书的profile文件。其中苹果证书可以理解为基于非…

c++----继承(初阶)

大家好呀&#xff0c;今天我们也是多久没有更新博客了&#xff0c;今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢&#xff0c;大家从字面意思看&#xff0c;是不是像我们平常日常生活中很容易出现的&#xff0c;比如说电视剧里面什么富豪啊&#xff0c;去了…

CDF 累积分布函数图 怎么看

以上图为例&#xff0c;图中有五个数据集&#xff0c;每条曲线代表每个数据集中流的数量&#xff0c;然后我以蓝色的线条为例去解释怎么看这个图。 红色的方框的点说明&#xff0c;dataset-1中流数量少于500的app占全部app的20%&#xff1b;紫色的方框的点说明&#xff0c;da…

win10下NAT 端口转发及ssh VMware ubuntu24虚拟机

问题&#xff1a;win10无法访问VMware ubuntu24虚拟机。ping不通&#xff0c;ssh不通。 现象&#xff1a; 无法设置网桥模式。原因不明。win10 网络连接 中没有vmnet0 网桥模式。win10 网络连接 中&#xff0c;有vmnet8的NAT模式&#xff0c;有vmnet1的仅主机模式。VMware ub…

【Redis】Linux下安装配置及通过C++访问Redis

文章目录 一、Linux Centos 7.0版本下的安装及配置二、通过C访问Redis 一、Linux Centos 7.0版本下的安装及配置 通过源来安装&#xff0c;此次安装的版本为 redis 5.0 的&#xff0c;要通过其他源进行安装&#xff0c;首先安装 scl 源 yum install centos-release-scl-rh再安…

【LeetCode】每日一题 2024_9_26 数组元素和与数字和的绝对差(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 题目&#xff1a;数组元素和与数字和的绝对差 代码与解题思路 func differenceOfSum(nums []int) int {sum1, sum2 : 0, 0for _, v : range nums {sum1 vfor v > 0 {sum2 v%10v / 10}}return sum1-s…

教师工作量在线管理服务

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

dockerfile部署springboot项目(构建镜像:ebuy-docker:v1.0)

文章目录 1、docker部署Mysql2、dockerfile构建镜像1.1、在idea中导入课件中的项目资料\day01\ebuy-docker1.2、修改项目application.yml数据库连接参数1.3、启动项目访问测试&#xff1a;http://localhost:8081/1.4、执行mvn package命令进行项目打包1.5、虚拟机中新建目录/op…

高性能计算秘密武器:NVIDIA B100与B200如何让你的HPC性能飙升?

嘿&#xff0c;各位科技界的狂热粉丝、AI领域的探索先锋&#xff0c;你们是否正站在高性能计算&#xff08;HPC&#xff09;的十字路口&#xff0c;寻找那把能开启全新纪元的钥匙&#xff1f;今天&#xff0c;就让我带你深入剖析NVIDIA的最新力作——B100与B200&#xff0c;一同…

C++结尾

面试题 1.什么是虚函数&#xff1f;什么是纯虚函数 在定义函数时前面加virtual。虚函数是为了&#xff0c;父子类中只有一个该函数。如果在子类重写虚函数&#xff0c;那么用的就是子类重写的虚函数&#xff1b;如果子类没有重写虚函数&#xff0c;那么调用的是父类继承的虚函…