notification-guidelines.md 8.6 KB
Newer Older
Z
zengyawen 已提交
1 2


Z
zengyawen 已提交
3
# 通知开发指导
Z
zengyawen 已提交
4

5
## 场景简介
Z
zengyawen 已提交
6 7 8 9 10 11 12 13 14 15 16

OpenHarmony通过ANS(Advanced Notification Service,通知系统服务)对通知类型的消息进行管理,支持多种通知类型,包括文本,长文本,多文本,图片,社交,媒体等。所有系统服务以及应用都可以通过通知接口发送通知消息,用户可以通过SystemUI查看所有通知消息。

通知常见的使用场景:

- 显示接收到短消息、即时消息等。
- 显示应用的推送消息,如广告、版本更新等。
- 显示当前正在进行的事件,如导航、下载等。



17
## 通知流程
Z
zengyawen 已提交
18

19
通知业务流程由ANS通知子系统、通知发送端、通知订阅端组成。
Z
zengyawen 已提交
20

21
一条通知从通知发送端产生,通过IPC通信发送到ANS,ANS再分发给通知订阅端。
Z
zengyawen 已提交
22

23
系统应用还支持通知相关配置,如使能开关、配置参数由系统配置发起请求,发送到ANS存储到内存和数据库。
Z
zengyawen 已提交
24

F
fangjinliang 已提交
25
![1648113187545](figures/notification.png)
Z
zengyawen 已提交
26 27 28



29
## 接口说明
Z
zengyawen 已提交
30

R
RayShih 已提交
31
部分接口仅系统应用才可以调用,且需要具备权限:SystemCapability.Notification.Notification ,接口返回值有两种返回形式:callback和promise,下表中为callback形式接口,promise和callback只是返回值方式不一样,功能相同,具体API说明详见[接口文档](../reference/apis/js-apis-notification.md)
Z
zengyawen 已提交
32

33
**表1** 通知使能开关接口功能介绍 
Z
zengyawen 已提交
34

35 36
| 接口名                                                       | 描述             |
| ------------------------------------------------------------ | ---------------- |
Z
zengyawen 已提交
37 38
| isNotificationEnabled(bundle: BundleOption, callback: AsyncCallback\<boolean>): void | 查询通知使能开关 |
| enableNotification(bundle: BundleOption, enable: boolean, callback: AsyncCallback\<void>): void | 设置使能开关     |
Z
zengyawen 已提交
39

40
用于查询和设置通知使能开关,若某个应用的通知使能关闭状态,则无法发送通知。
Z
zengyawen 已提交
41 42 43



44
**表2** 通知订阅接口功能介绍
Z
zengyawen 已提交
45

46 47
| 接口名                                                       | 描述             |
| ------------------------------------------------------------ | ---------------- |
Z
zengyawen 已提交
48 49 50
| subscribe(subscriber: NotificationSubscriber, info: NotificationSubscribeInfo, callback: AsyncCallback\<void>): void | 订阅指定应用通知 |
| subscribe(subscriber: NotificationSubscriber, callback: AsyncCallback\<void>): void | 订阅所有通知     |
| unsubscribe(subscriber: NotificationSubscriber, callback: AsyncCallback\<void>): void | 取消订阅通知     |
Z
zengyawen 已提交
51

52
订阅接口有支持订阅所有通知、或订阅某些应用的通知。
Z
zengyawen 已提交
53 54 55



56
**表3** 通知订阅回调接口功能介绍
Z
zengyawen 已提交
57

58 59 60 61 62 63 64
| 接口名                                           | 描述             |
| ------------------------------------------------ | ---------------- |
| onConsume?:(data: SubscribeCallbackData) => void | 通知回调         |
| onCancel?:(data: SubscribeCallbackData) => void  | 通知取消回调     |
| onUpdate?:(data: NotificationSortingMap) => void | 通知排序更新回调 |
| onConnect?:() => void;                           | 订阅成功回调     |
| onDisconnect?:() => void;                        | 取消订阅回调     |
Z
zengyawen 已提交
65 66 67



68
**表4** 发送通知接口功能介绍
Z
zengyawen 已提交
69

70 71
| 接口名                                                       | 描述                     |
| ------------------------------------------------------------ | ------------------------ |
Z
zengyawen 已提交
72 73 74 75
| publish(request: NotificationRequest, callback: AsyncCallback\<void>): void | 发布通知                 |
| publish(request: NotificationRequest, userId: number, callback: AsyncCallback\<void>): void | 指定用户发布通知         |
| cancel(id: number, label: string, callback: AsyncCallback\<void>): void | 取消指定的通知           |
| cancelAll(callback: AsyncCallback\<void>): void;             | 取消所有该应用发布的通知 |
Z
zengyawen 已提交
76

77
携带userId的publish接口,可以指定向该用户下订阅者发布通知。
Z
zengyawen 已提交
78 79 80



81
## 开发指导
Z
zengyawen 已提交
82

83
通知的开发步骤一般是订阅通知、开启通知使能、发布通知。
Z
zengyawen 已提交
84

85
### 导入模块
Z
zengyawen 已提交
86

87 88 89
```js
import Notification from '@ohos.notification';
```
Z
zengyawen 已提交
90 91 92



93
### 通知订阅
Z
zengyawen 已提交
94

95
通知接受端首选需要向通知子系统发起通知订阅。
Z
zengyawen 已提交
96

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
```js
var subscriber = {
    onConsume: function (data) {
      let req = data.request;
      console.info('===>onConsume callback req.id: ' + req.id);
    },
    onCancel: function (data) {
      let req = data.request;
      console.info('===>onCancel callback req.id: : ' + req.id);
    },
    onUpdate: function (data) {
      console.info('===>onUpdate in test===>');
    },
    onConnect: function () {
      console.info('===>onConnect in test===>');
    },
    onDisconnect: function () {
      console.info('===>onDisConnect in test===>');
    },
    onDestroy: function () {
      console.info('===>onDestroy in test===>');
    },
  };

  Notification.subscribe(subscriber, (err, data) => { // callback形式调用异步接口
    if (err.code) {
      console.error('===>failed to subscribe because ' + JSON.stringify(err));
      return;
    }
    console.info('===>subscribeTest success : ' + JSON.stringify(data));
Z
zengyawen 已提交
127
  });
128
```
Z
zengyawen 已提交
129 130 131



132
### 通知发送
Z
zengyawen 已提交
133

F
fangjinliang 已提交
134 135 136 137 138
##### 开启通知使能

应用发布通知的使能开关默认是关闭的,所以应用发布通知前需要用户允许后才能发送。应用可以通过Notification.requestEnableNotification弹窗提醒用户允许发送通知。

```js
139
Notification.requestEnableNotification().then((data) => {
F
fangjinliang 已提交
140 141 142 143 144 145 146
	console.info('===>requestEnableNotification success');
}).catch((err) => {
	console.error('===>requestEnableNotification failed because ' + JSON.stringify(err));
});
```


Z
zengyawen 已提交
147

148
##### 通知发布
Z
zengyawen 已提交
149

150
发布通知,先要构造NotificationRequest对象,设置通知类型、标题、内容等一系列属性。下面以发布普通文本和携带wantAgent通知为例。
Z
zengyawen 已提交
151

152
普通文本通知实例
Z
zengyawen 已提交
153

154 155 156 157
```js
//构造NotificationRequest对象
var notificationRequest = {
  	id: 1,
Z
zengyawen 已提交
158
  	content: {
F
fangjinliang 已提交
159
  		contentType: Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
Z
zengyawen 已提交
160 161 162 163 164 165
  		normal: {
  			title: "test_title",
  			text: "test_text",
  			additionalText: "test_additionalText"
  		}
  	}
166 167 168
}

//通知发送
169
Notification.publish(notificationRequest).then((data) => {
170 171 172 173 174
	console.info('===>publish promise success req.id : ' + notificationRequest.id);
}).catch((err) => {
	console.error('===>publish promise failed because ' + JSON.stringify(err));
});
```
Z
zengyawen 已提交
175 176 177



178
携带wantAgent通知实例
Z
zengyawen 已提交
179

180
wantAgent使用详见[wantAgent开发文档](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/ability/wantagent.md)
Z
zengyawen 已提交
181

182
- 创建wantAgent对象
Z
zengyawen 已提交
183

184 185 186 187 188
```js
import wantAgent from '@ohos.wantAgent';

//WantAgentInfo对象
var wantAgentInfo = {
F
fangjinliang 已提交
189 190 191 192 193 194 195 196 197
  wants: [
    {
      bundleName: 'ohos.samples.eTSNotification',
      abilityName: 'ohos.samples.eTSNotification.MainAbility',
    }
  ],
  operationType: wantAgent.OperationType.START_ABILITY,
  requestCode: 0,
  wantAgentFlags:[wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG]
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
}

//wantAgent对象
var WantAgent;

//getWantAgent回调
function getWantAgentCallback(err, data) {
    console.info("===>getWantAgentCallback===>");
    if (err.code == 0) {
    	WantAgent = data;
    } else {
        console.info('----getWantAgent failed!----');
    }
}

// 获取wantAgent对象
wantAgent.getWantAgent(wantAgentInfo, getWantAgentCallback)
```
Z
zengyawen 已提交
216

217
- 发布通知
Z
zengyawen 已提交
218 219

```js
220 221 222
//构造NotificationRequest对象
var notificationRequest = {
  content: {
F
fangjinliang 已提交
223
    contentType: Notification.ContentType.NOTIFICATION_CONTENT_BASIC_TEXT,
224 225 226 227 228 229 230 231 232
    normal: {
      title: "AceApplication_Title",
      text: "AceApplication_Text",
      additionalText: "AceApplication_AdditionalText"
    },
  },
  id: 1,
  label: 'TEST',
  wantAgent: WantAgent,
F
fangjinliang 已提交
233
  slotType: Notification.SlotType.OTHER_TYPES,
234 235 236 237
  deliveryTime: new Date().getTime()
}

//通知发送
238
Notification.publish(notificationRequest).then((data) => {
239 240 241 242
	console.info('===>publish promise success req.id : ' + notificationRequest.id);
}).catch((err) => {
	console.error('===>publish promise failed because ' + JSON.stringify(err));
});
Z
zengyawen 已提交
243 244 245 246
```



247
- 取消通知
Z
zengyawen 已提交
248

249
取消通知可以分成取消指定的单条通知和取消所有通知,应用只能取消自己发布的通知。
Z
zengyawen 已提交
250

251 252 253 254 255
```js
//cancel回调
function cancelCallback(err) {
	console.info("===>cancelCallback===>");
}
Z
zengyawen 已提交
256

257 258
Notification.cancel(1, "label", cancelCallback)
```
Z
zengyawen 已提交
259 260


Z
zengyawen 已提交
261
## 相关实例
Z
zengyawen 已提交
262

Z
zengyawen 已提交
263
针对通知开发,有以下相关可供参考:
Z
zengyawen 已提交
264

265
- [`Notification:`订阅、发送通知(ArkTS)(API9)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/master/Notification/Notification)
Z
zengyawen 已提交
266

267
- [`Notification`:通知(ArkTS)(API8)](https://gitee.com/openharmony/applications_app_samples/tree/master/common/Notification)