文档管理中心

推送卡片刷新消息

场景介绍

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

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

约束与限制

推送卡片刷新消息支持Phone、Tablet、PC/2in1设备。并且从6.1.0(23)版本开始,新增支持Wearable、TV设备。

频控规则

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

正式发布阶段,单设备单应用下每日推送消息总条数受设备消息频控限制,系统会根据使用场景和流量进行管控,不合理的使用场景系统会进行频控。

应用每张卡片独占刷新上限限制,单张服务卡片刷新消息数量按华为应用市场应用分类示例划分,具体频控规则请参考ArkTS卡片Push刷新

说明

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

开发步骤

开发卡片

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

  1. 参见创建一个ArkTS卡片,完成本地服务卡片的创建。

  2. 在项目模块级别下的src/main/resources/base/profile/form_config.json中配置dataProxyEnabled字段为true,开启卡片代理刷新功能。

    收起
    自动换行
    深色代码主题
    复制
    1. {
    2. "forms": [
    3. {
    4. "name": "widget",
    5. "src": "./ets/widget/pages/WidgetCard.ets",
    6. "uiSyntax": "arkts",
    7. "window": {
    8. "designWidth": 720,
    9. "autoDesignWidth": true
    10. },
    11. "colorMode": "auto",
    12. "isDefault": true,
    13. "updateEnabled": true,
    14. "updateDuration": 1,
    15. "scheduledUpdateTime": "10:30",
    16. "defaultDimension": "2*2",
    17. "supportDimensions": ["2*2"],
    18. "dataProxyEnabled": true
    19. }
    20. ]
    21. }
  3. 在卡片生命周期管理文件(下以EntryFormAbility为例)的onAddForm()回调中获取formId,定义需要在卡片页面文件(下以WidgetCard为例)中和通过Push Kit要刷新的字段,如下以textKeyimageKey为例。

    收起
    自动换行
    深色代码主题
    复制
    1. import { formBindingData, FormExtensionAbility, formInfo } from '@kit.FormKit';
    2. import { Want } from '@kit.AbilityKit';
    3. // ...
    4. export default class EntryFormAbility extends FormExtensionAbility {
    5. onAddForm(want: Want): formBindingData.FormBindingData {
    6. // 获取formId
    7. const formId = want.parameters![formInfo.FormParam.IDENTITY_KEY] as string;
    8. // ...
    9. // 定义需要在WidgetCard中刷新的字段
    10. class CreateFormData {
    11. public formId: string = '';
    12. public textKey: string = '';
    13. public imageKey: string = '';
    14. }
    15. const obj: CreateFormData = {
    16. formId: formId,
    17. textKey: '默认文本',
    18. imageKey: ''
    19. }
    20. const bindingData: formBindingData.FormBindingData = formBindingData.createFormBindingData(obj);
    21. // 定义需要通过Push Kit代理刷新的字段,每个key均需要在上面bindingData中定义
    22. const textKey: formBindingData.ProxyData = {
    23. key: 'textKey',
    24. subscriberId: formId
    25. };
    26. const imageKey: formBindingData.ProxyData = {
    27. key: 'imageKey',
    28. subscriberId: formId
    29. };
    30. bindingData.proxies = [textKey, imageKey];
    31. return bindingData;
    32. }
    33. // ...
    34. }
  4. 卡片页面文件(下以src/main/ets/widget/pages/WidgetCard.ets为例)中,创建LocalStorage变量并与@Entry装饰器绑定,使用@LocalStorageProp装饰器创建key-value的变量。

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

    收起
    自动换行
    深色代码主题
    复制
    1. // 定义页面级的UI状态存储LocalStorage
    2. const storage = new LocalStorage();
    3. // 绑定
    4. @Entry(storage)
    5. @Component
    6. struct WidgetCard {
    7. @LocalStorageProp('formId') formId: string = '';
    8. @LocalStorageProp('textKey') text: string = '';
    9. @LocalStorageProp('imageKey') image: string = '';
    10. build() {
    11. Flex({ direction: FlexDirection.Column }) {
    12. Row() {
    13. Text() {
    14. // Span是Text组件的子组件,用于显示行内文本
    15. Span('formID:')
    16. Span(this.formId)
    17. }
    18. .fontSize(10)
    19. }
    20. Row() {
    21. Text() {
    22. Span('文本:')
    23. Span(this.text)
    24. }
    25. .fontSize(10)
    26. }
    27. Row() {
    28. if (this.image) {
    29. Image('memory://' + this.image).height(80)
    30. }
    31. }
    32. }
    33. .padding(10)
    34. .onClick(() => {
    35. postCardAction(this, {
    36. action: 'router',
    37. abilityName: 'MainAbility', // 请配置为应用实际的abilityName
    38. });
    39. })
    40. }
    41. }

推送卡片刷新消息

  1. 参见指导获取Push Token

  2. (可选)建议您将formIdpushToken等信息上报到应用服务端,用于向应用发送卡片刷新消息。

    收起
    自动换行
    深色代码主题
    复制
    1. // 以下为伪代码
    2. import { Want } from '@kit.AbilityKit';
    3. import { pushService } from '@kit.PushKit';
    4. import { hilog } from '@kit.PerformanceAnalysisKit';
    5. import { BusinessError } from '@kit.BasicServicesKit';
    6. import { formInfo } from '@kit.FormKit';
    7. const DOMAIN = 0x0000;
    8. async function saveFormInfo(want: Want): Promise<void> {
    9. try {
    10. const formId = want.parameters![formInfo.FormParam.IDENTITY_KEY] as string;
    11. const moduleName = want.moduleName;
    12. const abilityName = want.abilityName;
    13. const formName = want.parameters![formInfo.FormParam.NAME_KEY] as string;
    14. const pushToken: string = await pushService.getToken();
    15. // 将formId, moduleName, abilityName, formName, pushToken 上报到应用服务端
    16. } catch (err) {
    17. let e: BusinessError = err as BusinessError;
    18. hilog.error(DOMAIN, 'testTag', 'Failed to save form info: %{public}d %{public}s', e.code, e.message);
    19. }
    20. }
  3. 应用服务端调用REST API推送卡片刷新消息,消息详情可参见场景化消息API接口功能介绍,请求示例如下:

    收起
    自动换行
    深色代码主题
    复制
    1. // Request URL
    2. POST "https://push-api.cloud.huawei.com/v3/[projectId]/messages:send"
    3. // Request Header
    4. Content-Type: application/json
    5. Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    6. push-type: 1
    7. // Request Body
    8. {
    9. "payload": {
    10. "moduleName": "entry",
    11. "abilityName": "EntryFormAbility",
    12. "formName": "widget",
    13. "formId": 423434262,
    14. "version": 123456,
    15. "formData": {
    16. "textKey": "刷新文本内容"
    17. },
    18. "images": [
    19. {
    20. "keyName": "imageKey",
    21. "url": "https://***.png",
    22. "require": 1
    23. }
    24. ]
    25. },
    26. "target": {
    27. "token": [
    28. "MAMzLg**********lPW"
    29. ]
    30. },
    31. "pushOptions": {
    32. "testMessage": true
    33. }
    34. }
    • [projectId]:项目ID,登录AppGallery Connect网站,选择“开发与服务”,在项目列表中选择对应的项目,左侧导航栏选择“项目设置”,在该页面获取。

    • Authorization:JWT格式字符串,可参见Authorization获取。

    • push-type:1表示服务卡片刷新场景。

    • moduleName:项目模块级别下的 src/main/module.json5 中的 module 标签下的name值。

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

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

    • version:当前卡片刷新消息的版本号,新的卡片刷新消息的版本号需大于当前卡片刷新消息版本号,否则会刷新失败。详情参见version

    • formId:服务卡片的实例ID,当卡片的onAddForm()方法被调用时(卡片使用方添加卡片至桌面)进行获取。最大值为231-1

    • formData:填写待刷新服务卡片的业务数据,该数据来源于项目模块级别下的src/main/ets/widget/pages/WidgetCard.ets文件下的声明式范式组件名称。下图以卡片页面文件WidgetCard为例:

    • images:待刷新服务卡片业务数据中的图片数据,其中keyName为您服务卡片中图片控件的key值,url为图片的地址,下图以卡片页面文件WidgetCard为例:

      说明

      Push Kit禁止推送包含敏感信息的图片。

      支持图片的格式为PNG、JPG、JPEG、WEBP,图片文件最大为512KB,若超过则图片不展示。

    • require:图片刷新策略控制,0表示如果图片下载失败,仅刷新文字;1表示如果图片下载失败,则不进行刷新操作。

    • token:Push Token,可参见获取Push Token获取。

    • testMessage:(选填)测试消息标识,true表示测试消息。每个项目每天限制发送1000条测试消息,单次推送仅能发送一个Token。详情请参见testMessage

在 指南 中进行搜索
请输入您想要搜索的关键词