# 元数据事件通知 (/zh-CN/realtime-media/rtm/build/state-and-attributes/metadata-events)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

## 添加事件监听 [#添加事件监听]

如果想要接收 Storage 事件通知，你需要实现事件监听程序，详见[事件监听](/zh-CN/realtime-media/rtm/build/messaging/add-event-listener)。除此之外，如果你想要接收 Channel Metadata 的事件通知，你需要在订阅或加入频道时将 `features` 参数设为 `enumv.joinchannelfeaturemetadata` 或 `enumv.subscribechannelfeaturemetadata`，或将 `withMetadata` 参数设置成 `true`。如果你想要接收 User Metadata 的事件通知，你需要调用 `storage.subscribeuser` 订阅指定用户的 User Metadata。

## 事件通知模式 [#事件通知模式]

当前 RTM 仅支持全量数据更新模式，即当 User Metadata 或 Channl Metadata 发生变更后，返回的事件通知中的 `data` 字段包含用户或频道的全部属性数据。

## 事件通知类型 [#事件通知类型]

RTM 的 Storage 事件通知有以下四种类型：

| 事件类型 | 描述 |
| --- | --- |
| `enumv.storageeventtypesnap` | `1`: 用户第一次订阅 Channl Metadata 或 User Metadata，或加入频道时触发，本地用户会收到此类事件通知。 |
| `enumv.storageeventtypeset` | [event-html-1-2-1 details](#table-slot-event-html-1-2-1) |
| `enumv.storageeventtypeupdate` | `3`: 当调用设置、更新或删除 Channel Metadata 或 User Metadata 的方法时会返回该类型事件。 |
| `enumv.storageeventtyperemove` | [event-html-1-4-1 details](#table-slot-event-html-1-4-1) |

<a id="table-slot-event-html-1-2-1"></a>

**event-html-1-2-1 details**

`2`: 当调用 `storage.setchannel` 或者 `storage.setuser` 时触发。

:::info[信息]
该事件仅在增量数据更新模式下返回。
:::

<a id="table-slot-event-html-1-4-1"></a>

**event-html-1-4-1 details**

`4`: 当调用 `storage.removechannel` 或者 `storage.removeuser` 时触发。

:::info[信息]
该事件仅在增量数据更新模式下返回。
:::

Storage 事件的数据结构参数含义如下：

<Tabs defaultValue="web" groupId="rtm-storage-event-properties" persist>
<TabsList>
  <TabsTrigger value="web">Web</TabsTrigger>
  <TabsTrigger value="android">Android</TabsTrigger>
  <TabsTrigger value="swift">Swift</TabsTrigger>
  <TabsTrigger value="ios">Objective-C</TabsTrigger>
  <TabsTrigger value="unity">Unity</TabsTrigger>
  <TabsTrigger value="cpp">C++</TabsTrigger>
  <TabsTrigger value="flutter">Flutter</TabsTrigger>
</TabsList>

<TabsContent value="web">

| 参数 | 描述 |
| --- | --- |
| `storageType` | 通知类型，可能的取值为`NONE`、`USER` 或 `CHANNEL`。`USER` 为用户属性变更，`CHANNEL` 为频道属性变更。 |
| `channelType` | 频道类型，可能的取值为 `MESSAGE` 或 `STREAM`。 |
| `channelName` | 事件发生的频道名称。该参数仅在频道属性相关事件中生效。 |
| `publisher` | 触发此事件的用户 ID。 |
| `eventType` | 事件类型。可能的取值为 `NONE`、`SNAPSHOT`、`SET`、`REMOVE` 或 `UPDATE`。 |
| `data` | 用户或者频道属性数据。 |

</TabsContent>

<TabsContent value="android">

| 属性         |  类型  |   描述                                                                                                                         |
|---|----| ------ |
| `channelType`            | `RtmChannelType`    |  频道类型。详见 [`RtmChannelType`](/zh-CN/api-reference/rtm/android/enumv#channeltype)。   |
| `storageType`            | `RtmStorageType`    |  Storage 类型。详见 [`RtmStorageType`](/zh-CN/api-reference/rtm/android/enumv#storagetype)。  |
| `eventType`            | `RtmStorageEventType`    |  Storage 事件类型。详见 [`RtmStorageEventType`](/zh-CN/api-reference/rtm/android/enumv#storageeventtype)。  |
| `target`              | String                |  用户 ID 或频道名称。   |
| `data`            | `Metadata`               |   Metadata Item。详见 [`Metadata`](/zh-CN/api-reference/rtm/android/storage#metadata)。   |
| `timestamp` | long | 事件发生的时间戳。                |

</TabsContent>

<TabsContent value="swift">

| 属性         |  类型  |   描述                                                                                                                         |
|---|----| ---- |
| `channelType`            | `AgoraRtmChannelType`    |  频道类型。详见 [`AgoraRtmChannelType`](/zh-CN/api-reference/rtm/swift/enumv#channeltype)。   |
| `storageType`            | `AgoraRtmStorageType`   |  Storage 类型。详见 [`AgoraRtmStorageType`](/zh-CN/api-reference/rtm/swift/enumv#storagetype)。  |
| `eventType`            | `AgoraRtmStorageEventType`    |  Storage 事件类型。详见 [`AgoraRtmStorageEventType`](/zh-CN/api-reference/rtm/swift/enumv#storageeventtype)。  |
| `target`              | String                |  用户 ID 或频道名称。   |
| `data`            | `AgoraRtmMetadata`               |   Metadata Item。详见 [`AgoraRtmMetadata`](/zh-CN/api-reference/rtm/swift/storage#agorartmmetadata)。   |
| `timestamp` | UInt64 | 事件发生的时间戳。                |

</TabsContent>

<TabsContent value="ios">

| 属性         |  类型  |   描述                                                                                                                         |
|---|----| ---- |
| `channelType`            | `AgoraRtmChannelType`    |  频道类型。详见 [`AgoraRtmChannelType`](/zh-CN/api-reference/rtm/ios/enumv#channeltype)。   |
| `storageType`            | `AgoraRtmStorageType`   |  Storage 类型。详见 [`AgoraRtmStorageType`](/zh-CN/api-reference/rtm/ios/enumv#storagetype)。  |
| `eventType`            | `AgoraRtmStorageEventType`    |  Storage 事件类型。详见 [`AgoraRtmStorageEventType`](/zh-CN/api-reference/rtm/ios/enumv#storageeventtype)。  |
| `target`              | NSString                |  用户 ID 或频道名称。   |
| `data`            | `AgoraRtmMetadata`               |   Metadata Item。详见 [`AgoraRtmMetadata`](/zh-CN/api-reference/rtm/ios/storage#agorartmmetadata)。   |
| `timestamp` | unsigned long long | 事件发生的时间戳。                |

</TabsContent>

<TabsContent value="unity">

| 属性         |  类型  |   描述                                                                                                                         |
|---|----| ---- |
| `channelType`            | `RTM_CHANNEL_TYPE`    |  频道类型。   |
| `storageType`            | `RTM_STORAGE_TYPE`    |  Storage 事件类型。详见 [`RTM_STORAGE_TYPE`](/zh-CN/api-reference/rtm/unity/enumv#storagetype)。  |
| `eventType`            | `RTM_STORAGE_EVENT_TYPE`    |  Storage 事件类型。详见 [`RTM_STORAGE_EVENT_TYPE`](/zh-CN/api-reference/rtm/unity/enumv#storageeventtype)。  |
| `target`              | string                |  用户 ID 或频道名称。   |
| `data`            | `RtmMetadata`               |   Metadata Item 数组。   |

</TabsContent>

<TabsContent value="cpp">

| 属性         |  类型  |   描述                                                                                                                         |
|---|----| ---- |
| `channelType`            | `RTM_CHANNEL_TYPE`    |  频道类型。详见 [`RTM_CHANNEL_TYPE`](/zh-CN/api-reference/rtm/cpp/enumv#channeltype)。   |
| `storageType`            | `RTM_STORAGE_TYPE`    |  Storage 类型。详见 [`RTM_STORAGE_TYPE`](/zh-CN/api-reference/rtm/cpp/enumv#storagetype)。  |
| `eventType`            | `RTM_STORAGE_EVENT_TYPE`    |  Storage 事件类型。详见 [`RTM_STORAGE_EVENT_TYPE`](/zh-CN/api-reference/rtm/cpp/enumv#storageeventtype)。  |
| `target`              | const char*                |  用户 ID 或频道名称。   |
| `data`            | `Metadata`               |   Metadata Item 数组。   |
| `timestamp` | uint64_t | 事件发生的时间戳。                |

</TabsContent>

<TabsContent value="flutter">

| 属性          | 类型                     | 描述                                                                                          |
| ------------ | --------- | ------- |
| `channelType` | `RtmChannelType`       | 频道类型。详见 [`RtmChannelType`](/zh-CN/api-reference/rtm/flutter/enumv#channeltype)。                    |
| `storageType` | `RtmStorageType`       | Storage 类型。详见 [`RtmStorageType`](/zh-CN/api-reference/rtm/flutter/enumv#storagetype)。                |
| `eventType`   | `RtmStorageEventType` | Storage 事件类型。详见 [`RtmStorageEventType`](/zh-CN/api-reference/rtm/flutter/enumv#storageeventtype)。 |
| `target`      | String              | 用户 ID 或频道名称。                                                                          |
| `data`        | `Metadata`               | Metadata Item 数组。                                                                          |
| `timestamp`   | int                 | 事件发生的时间戳。                                                                            |

</TabsContent>
</Tabs>
