接收推送

本章节介绍了如何使用HarmonyOS SDK接收和处理推送的通知和消息。

功能描述

当设备在线时,推送会通过阿里云的通道将数据下发到SDK,SDK提供IPushListener接口,用于接收推送的数据。

当下发通知时,SDK会回调相关方法,传递通知数据给应用,并创建通知,将通知展示在手机通知栏。当用户点击通知打开Ability时,SDK提供方法获取通知中携带的通知数据。

当下发消息时,SDK会回调相关方法,传递消息数据给应用。

在SDK接入时,应用需要注册IPushListener接口。

接收推送通知/消息

SDK接入时,应用需要注册IPushListener接口,接收推送数据。示例代码如下:

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { window } from '@kit.ArkUI';
import { aliyunPush, IPushListener, PushMessage, PushNotification } from '@aliyun/push';

// ************* IPushListener接口实现 begin *************
/**
 * 推送回调接口实现,用于接收推送数据
 */
class MyPushListener implements IPushListener {

  onReceiveNotification(data: PushNotification): boolean {
    // 处理推送通知
    // 返回false 表示不定制通知。返回true,表示定制通知。
    return false;
  }

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

  onReceiveMessage(data: PushMessage): void {
    // 处理推送消息
  }
}
// ************* IPushListener接口实现 end *************

export default class EntryAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {

    aliyunPush.init({
      appKey: '请填入在SDK接入准备工作中查询的应用AppKey',
      appSecret: '请填入在SDK接入准备工作中查询的应用AppSecret',
      context: this.context,
    })

    // ************* 注册IPushListener接口 begin *************
    aliyunPush.setPushListener(new MyPushListener());
    // ************* 注册IPushListener接口 end *************
  }

  // 省略其它代码
}

注册IPushListener接口是SDK接入流程的一部分,完成流程示例请参考SDK接入完整代码示例

接收推送通知

当SDK接收到推送通知时,会回调onReceiveNotification方法,参数PushNotification是推送通知携带的参数。

PushNotification

PushNotification包含的字段如下:

字段

类型

含义

备注

type

PushDataType

推送数据类型。

区分是通知还是消息。

msgId

string

消息ID。

推送数据的标识。

title

string

通知标题。

content

string

通知内容。

ext

Record<string, string | number | boolean>

推送的扩展参数。

notifyId

number

服务指定的要创建的通知ID。

open

OpenType

点击通知时应该进行的操作。

uri

string

通过uri指定要打开的Abiliity。

open为Ability时,使用。

open为Ability时,uri与act字段至少有一个。

act

string

通过action指定要打开的Ability。

open为Ability时,使用。

open为Ability时,uri与act字段至少有一个。

notificationSlotType

notificationManager.SlotType

服务指定要创建通知的通道类型。

鸿蒙系统定义。

style

number

通知的样式。

0: 标准样式;

3: 多行文本样式。

inboxContent

Array<string>

多行文本样式里的文本列表。

style为3时使用。

image

string

通知右侧的icon地址。

PushDataType

PushDataType 表示推送的数据是通知,还是消息,定义如下:

export enum PushDataType {
  Notification = 1,
  Message = 2,
}
OpenType

OpenType 表示点击通知时的执行操作,分为打开应用、打开指定Ability。定义如下:

export enum OpenType {
  App = 1,
  Ability = 2,
}

onReceiveNotification方法需要一个boolean类型的返回值,false表示交给SDK创建通知,true表示应用自己根据PushNotification参数创建通知。

onReceiveNotification方法返回false之后,SDK会继续创建、发布通知,发布成功之后,会回调onShowNotification方法,告知应用通知发布成功,此时通知应该会正常展示到通知栏。

onReceiveNotification方法返回true之后,SDK不会执行通知的创建、发布逻辑,也不会调用onShowNotification方法。返回true用于应用需要定制通知的场景。

定制通知

应用需要定制通知时,可以在onReceiveNotification方法中返回true,此时应用负责此通知的创建和发布。应用可以根据业务需要和PushNotification参数,参考鸿蒙文档发布通知创建和发布通知。

如果定制内容较少,也可以调用SDK内IPushHelper的createNotificationRequest方法快速创建notificationManager.NotificationRequest对象。

定制通知的示例代码如下:

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

/**
 * 推送回调接口实现,用于接收推送数据
 */
class MyPushListener implements IPushListener {
  onReceiveNotification(data: PushNotification): boolean {
    // ************* 定制通知 begin *************
    aliyunPush.getPushHelper().createNotificationRequest(data).then((request) => {
      // 这里以定制title,在title前增加“紧急:”示意
      if (data.style === 3 && request.content.multiLine !== undefined) {
        request.content.multiLine.title = "紧急:" + request.content.multiLine.title;
        request.content.multiLine.longTitle = "紧急:" + request.content.multiLine.longTitle;
      } else if (request.content.normal !== undefined) {
        request.content.normal.title = "紧急:" + request.content.normal.title;
      }
      // 发布通知
      notificationManager.publish(request).then(() => {
        console.debug(`发布定制的通知成功`)
        // 如果要统一逻辑,这里也可以主动调用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): void {
    // 处理通知展示事件
  }

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

// 省略其它代码

接收推送消息

当SDK接收到推送消息时,会回调onReceiveMessage方法,参数PushMessage是推送消息携带的参数。

PushMessage

PushMessage包含的字段如下:

字段

类型

含义

备注

type

PushDataType

推送数据类型。

区分是通知还是消息。

msgId

string

消息ID。

推送数据的标识。

title

string

消息标题。

content

string

消息内容。

从通知中获取推送数据

推送通知时,可以指定点击通知的后续操作,包括:打开应用首页、打开应用自定义页面。

页面对应Ability启动时,可以调用handleClickNotification方法从Want参数获取推送的数据。

示例代码如下:

import { aliyunPush, Channel, PushMessage, PushNotification, PushNotificationHandler } from '@aliyun/push';
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';

// ************* 自定义推送数据的处理类 begin *************
class MyPushNotificationHandler implements PushNotificationHandler {
  onClickNotification(data: PushNotification | PushMessage, from: Channel): void {
    // 根据业务处理推送的数据
  }

  noPushData(): void {
    // 没有推送数据,不是用户点击推送通知拉起的界面
  }
}
// ************* 自定义推送数据的处理类 end *************

// 点击通知要打开的Ability
export class TargetAbility extends UIAbility {
  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {

    // ************* 初始化Push begin *************
    aliyunPush.init({
      appKey: '请填入在准备工作中查询的应用AppKey',
      appSecret: '请填入在准备工作中查询的应用AppSecret',
      context: this.context,
    })
    // ************* 初始化Push end *************

    // ************* 处理推送数据 begin *************
    aliyunPush.handleClickNotification(want, new MyPushNotificationHandler())
    // ************* 处理推送数据 end *************

  }

  onNewWant(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    // 页面已经启动的场景
    // ************* 处理推送数据 begin *************
    aliyunPush.handleClickNotification(want, new MyPushNotificationHandler())
    // ************* 处理推送数据 end *************
  }

  // 省略其它代码
}
重要

handleClickNotification获取推送数据需要先初始化推送,所以Ability的onCreate方法中,需要先调用init方法,再调用handleClickNotification方法

说明

如果Ability已经创建,此时打开Ability系统不会执行onCreate方法,而是调用onNewWant方法传递新的Want参数,所以onNewWant方法内也需要调用handleClickNotification方法来获取推送数据。

调用handleClickNotification方法是SDK接入流程的一部分,完整流程示例请参考SDK接入完整代码示例

场景说明

推送数据主要是在PushNotificationHandler接口的onClickNotification方法的参数获取。在不同场景下,参数的值不同,具体场景如下表:

场景

data

from

说明

阿里云通道推送通知

PushNotification

Channel.Aliyun

推送通知,应用在线,走阿里云通道,SDK创建发布的通知。

厂商通道推送通知

PushNotification

Channel.HarmonyOS

推送通知,应用不在线,有厂商通道,走厂商通道,鸿蒙系统创建发布的通知。

消息转通知

PushMessage

Channel.HarmonyOS

推送消息,应用不在线,有厂商通道,允许转为通知,走厂商通道,鸿蒙系统创建发布的通知。

from参数的定义说明

/**
 * 推送通道
 */
export enum Channel {
  /**
   * 阿里云通道
   */
  Aliyun,
  /**
   * 鸿蒙厂商通道
   */
  HarmonyOS,
}

应用需要根据from参数判断推送数据来源,通过data的type字段判断是通知还是消息,根据业务需要处理推送数据。