角标设置

本章节介绍了如何在推送鸿蒙通知时设置角标。

功能描述

阿里云移动推送平台提供针对鸿蒙应用的角标参数,用于在推送通知时设置角标数或者角标累加数,推送后会在鸿蒙手机桌面应用icon上显示角标数。阿里云自有通道和鸿蒙厂商通道均支持。

角标设置

OpenAPI提供两个参数,用于设置角标:

  • HarmonyBadgeSetNum:角标数,即角标展示的数值。

  • HarmonyBadgeAddNum:角标累加数,最终角标数会在原有角标数基础上加上此数值展示。当同时设置HarmonyBadgeSetNumHarmonyBadgeAddNum时,HarmonyBadgeSetNum生效。

推送时按需设置这两个参数,即可实现展示角标的功能。

定制通知时的角标处理

当通知通过阿里云自有通道下发时,可以定制通知。 定制通知是客户端应用自己处理通知的展示,而角标的展示依赖通知的展示设置,所以当定制通知时,客户端需要自己处理角标的展示。

角标数据获取

我们在PushNotification数据中新增了角标字段,定义如下:

/**
 * 推送数据
 */
export interface PushNotification extends BasePushData {

  // 省略其它字段

  /**
   * 设置的角标数
   */
  badgeSetNum?: number;

  /**
   * 新增的角标数
   */
  badgeAddNum?: number;
}
  • badgeSetNum:角标数,对应推送的HarmonyBadgeSetNum字段。

  • badgeAddNum:角标累加数,对应推送的HarmonyBadgeAddNum字段。当推送时同时设置HarmonyBadgeSetNumHarmonyBadgeAddNum字段时,仅会下发badgeSetNum字段,badgeAddNum字段会忽略。

角标累加数设置

SDK侧,角标累加效果是通过NotificationRequestbadgeNumber字段实现的。所以需要在创建NotificationRequest时,根据badgeAddNum设置badgeNumber字段。

SDK提供辅助方法createNotificationRequest创建NotificationRequest,内部已经处理了badgeNumber字段的设置。示例代码如下:

import {
  aliyunPush,
  ExtensionNotification,
  IPushListener,
  PushError,
  PushMessage,
  PushNotification
} from '@aliyun/push';
import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';

/**
 * 推送回调接口实现,用于接收推送数据
 */
class MyPushListener implements IPushListener {
  onReceiveNotification(data: PushNotification | ExtensionNotification): boolean {
    // ************* 定制通知 begin *************
    aliyunPush.getPushHelper().createNotificationRequest(data).then((request) => {
      // createNotificationRequest 方法已经根据data.badgeAddNum设置了badgeNumber字段,不需要单独处理

      // 应用根据需要可以调整 request的字段以实现定制效果。

      // 发布通知
      notificationManager.publish(request).then(() => {
        console.debug(`发布定制的通知成功`)
        if (data.badgeSetNum !== undefined && data.badgeSetNum >= 0) {
          // 定制通知需要自己处理角标。 对于data.badgeSetNum,需要在此处设置
          notificationManager.setBadgeNumber(data.badgeSetNum);
        }
        // 如果要统一逻辑,这里也可以主动调用onShowNotification方法
        this.onShowNotification(data);
      }).catch((e: BusinessError) => {
        console.error(`发布定制的通知失败 ${e.code} ${e.message}`)
      })
    }).catch((e: PushError) => {
      console.error(`创建通知request失败 ${e.code} ${e.message}`)
    })
    // ************* 定制通知 end *************
    // 返回true,应用自己处理通知
    return true;
  }

  onShowNotification(data: PushNotification | ExtensionNotification): void {
    // 处理通知展示事件
  }

  onReceiveMessage(data: PushMessage): void {
    // 处理推送消息
  }
}

// 省略其它代码

角标数设置

SDK侧,角标数设置是通过notificationManager.setBadgeNumber方法实现的。需要在定制通知时,主动调用设置,示例代码如下:

import {
  aliyunPush,
  ExtensionNotification,
  IPushListener,
  PushError,
  PushMessage,
  PushNotification
} from '@aliyun/push';
import { notificationManager } from '@kit.NotificationKit';
import { BusinessError } from '@kit.BasicServicesKit';

/**
 * 推送回调接口实现,用于接收推送数据
 */
class MyPushListener implements IPushListener {
  onReceiveNotification(data: PushNotification | ExtensionNotification): boolean {
    // ************* 定制通知 begin *************
    aliyunPush.getPushHelper().createNotificationRequest(data).then((request) => {
      // createNotificationRequest 方法已经根据data.badgeAddNum设置了badgeNumber字段,不需要单独处理

      // 应用根据需要可以调整 request的字段以实现定制效果。

      // 发布通知
      notificationManager.publish(request).then(() => {
        console.debug(`发布定制的通知成功`)
        if (data.badgeSetNum !== undefined && data.badgeSetNum >= 0) {
          // 定制通知需要自己处理角标。 对于data.badgeSetNum,需要在此处设置
          notificationManager.setBadgeNumber(data.badgeSetNum);
        }
        // 如果要统一逻辑,这里也可以主动调用onShowNotification方法
        this.onShowNotification(data);
      }).catch((e: BusinessError) => {
        console.error(`发布定制的通知失败 ${e.code} ${e.message}`)
      })
    }).catch((e: PushError) => {
      console.error(`创建通知request失败 ${e.code} ${e.message}`)
    })
    // ************* 定制通知 end *************
    // 返回true,应用自己处理通知
    return true;
  }

  onShowNotification(data: PushNotification | ExtensionNotification): void {
    // 处理通知展示事件
  }

  onReceiveMessage(data: PushMessage): void {
    // 处理推送消息
  }
}

// 省略其它代码