本章节介绍了如何使用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 | 推送数据类型。 | 区分是通知还是消息。 | |
msgId | string | 消息ID。 | 推送数据的标识。 |
title | string | 通知标题。 | |
content | string | 通知内容。 | |
ext | Record<string, string | number | boolean> | 推送的扩展参数。 | |
notifyId | number | 服务指定的要创建的通知ID。 | |
open | 点击通知时应该进行的操作。 | ||
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 | 推送数据类型。 | 区分是通知还是消息。 | |
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 | 说明 |
阿里云通道推送通知 | Channel.Aliyun | 推送通知,应用在线,走阿里云通道,SDK创建发布的通知。 | |
厂商通道推送通知 | Channel.HarmonyOS | 推送通知,应用不在线,有厂商通道,走厂商通道,鸿蒙系统创建发布的通知。 | |
消息转通知 | Channel.HarmonyOS | 推送消息,应用不在线,有厂商通道,允许转为通知,走厂商通道,鸿蒙系统创建发布的通知。 |
from参数的定义说明
/**
* 推送通道
*/
export enum Channel {
/**
* 阿里云通道
*/
Aliyun,
/**
* 鸿蒙厂商通道
*/
HarmonyOS,
}
应用需要根据from参数判断推送数据来源,通过data的type字段判断是通知还是消息,根据业务需要处理推送数据。