# Stream Channel (/zh-CN/realtime-media/rtm/build/channels-and-topics/stream-channel)

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

<_PlatformTabsGroup>
<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="android" />
**Stream** 频道是 RTM 提供的一种基于 Room 模型的频道类型。与 Message 频道不同的是，使用 Stream 频道的相关方法前你需要先创建 `StreamChannel` 对象实例。加入 Stream 频道后，你就可以监听频道中的事件通知了，但如需收发消息，你还需要通过 Topic 特性来实现，详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。RTM 允许你的 App 中同时存在成千上万个 Stream 频道，但由于端侧性能和带宽的限制，单个客户端同时只能加入有限数量的频道，详见 [API 使用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。

:::info[信息]
如需接收并处理接收到的消息和事件通知，除了要加入该频道外，你还需要完成[事件监听](/zh-CN/api-reference/rtm/android/configuration#事件监听)程序的配置。
:::

## 创建频道 [#创建频道]

在使用 Stream 频道之前，你需要先调用 `createStreamChannel` 方法创建 Stream Channel 实例。成功创建 Stream Channel 实例后，你可以调用 Stream Channel 相关方法，例如：加入频道、离开频道、销毁频道、发送 Topic 消息、订阅 Topic 消息等。

你可以通过以下方式创建 `StreamChannel` 对象实例：

```java
StreamChannel mStreamChannel = mRtmClient.createStreamChannel("chat_room");
```

该方法一次只能创建一个 `StreamChannel` 对象实例，如需同时创建多个 `StreamChannel` 对象实例，你需要多次调用该方法。

```java
// Create the first instance
StreamChannel mStreamChannel1 = mRtmClient.createStreamChannel("chat_room11");
// Create the second instance
StreamChannel mStreamChannel2 = mRtmClient.createStreamChannel("chat_room2");
```

RTM 支持你在单个客户端创建无限个 `StreamChannel` 对象实例，但声网建议你结合实际需求和端侧性能情况合理创建。例如，如果你同时持有多个暂时用不到的 `StreamChannel` 实例，为避免浪费资源，声网建议你及时销毁该实例，并在需要使用的时候再创建。

## 加入频道 [#加入频道]

创建 `StreamChannel` 对象实例后，调用 `join` 方法加入 Stream Channel，以便监听其中的事件通知。

```java
JoinChannelOptions options = new JoinChannelOptions();
options.setToken("your_token");
options.setWithPresence(true);
options.setWithLock(true);
options.setWithMetadata(true);

mStreamChannel.join(options, new ResultCallback<Void>() {
    @Override
    public void onSuccess(Void responseInfo) {
        log(CALLBACK, "join stream channel success");
    }

    @Override
    public void onFailure(ErrorInfo errorInfo) {
        log(ERROR, errorInfo.toString());
    }
});
```

加入频道时，你需要在 `JoinChannelOptions` 中设置 `token` 参数。为方便体验和测试 App，你可以在创建项目时选择**鉴权机制**为**调试模式：APP ID**，并在加入频道时将 App ID 填写至 `token` 参数中。

```java
JoinChannelOptions options = new JoinChannelOptions("your_appid", true, true, true);
mStreamChannel.join(options, new ResultCallback<Void>() {
    @Override
    public void onSuccess(Void responseInfo) {
        log(CALLBACK, "join stream channel success");
    }

    @Override
    public void onFailure(ErrorInfo errorInfo) {
        log(ERROR, errorInfo.toString());
    }
});
```

Stream Channel 通过 Topic 来实现消息流机制。即使你设置了全局的消息监听程序，你也需要加入 Topic 才能发送消息，需要订阅 Topic 才能接收消息。详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。

## 离开频道 [#离开频道]

如果你不再需要接收某个频道中所有消息和事件通知，你可以调用 `leave` 方法离开该频道。

```java
mStreamChannel.leave(new ResultCallback<Void>() {
    @Override
    public void onSuccess(Void responseInfo) {
        log(CALLBACK, "leave stream channel success");
    }

    @Override
    public void onFailure(ErrorInfo errorInfo) {
        log(ERROR, errorInfo.toString());
    }
});
```

离开频道后，只要当前的 `StreamChannel` 对象实例没有被销毁，你还可以调用 `join` 方法再次加入该频道。

## 销毁频道 [#销毁频道]

对于不再需要的 `StreamChannel` 对象实例，你可以调用 `release` 方法销毁它以释放资源。

```java
mStreamChannel.release();
```

销毁频道指的是销毁当前客户端中的 `StreamChannel` 对象实例，而非在整个 RTM 网络中销毁该频道，所以该操作不会影响频道中的其他用户。

:::info[信息]
`release` 需要在非回调内的子线程调用，避免在回调中执行。
:::

## 共频道传输 [#共频道传输]

声网会同时发行和维护两套 RTM SDK 版本：

- **独立版**（Standalone Version）：保持 RTM 功能独立，体积精简。版本号以 RTM 前缀开始，例如 RTM 2.3.0。适用于只需消息实时传输或与其他厂商 RTC 产品配合使用但不需要同步传输或优先级控制的场景。

- **融合版**（Merge Version）：与声网 RTC 产品深度融合，版本号以 RTC 加 RTM 版本号的形式展示。适用于需要实时消息传输和实时音视频传输的场景。基于 SDK 的深度融合，融合版在独立版的基础上增加了共频道传输数据、[消息与音视频同步传输](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/usage#同步传输)、消息数据与音视频数据全局优先级控制等特性。

无论是哪套版本，SDK 都具备同样的优异性能和 SLA 保证。你只需根据自己的业务场景进行选择。

共频道传输是指声网 RTM 的频道和 RTC 的频道可以通过合理的接口调用共用一个网络连接，且同名的 RTM Stream Channel 和 RTC Channel 会作为同一个频道，即你可以用同一个频道传输消息数据和音视频数据。共频道传输特性是实现消息与音视频数据同步传输和数据全局优先级控制等特性的基础。

:::info[信息]
只有融合版 SDK 支持共频道传输特性，且该特性仅对 Stream 类型频道有效。
:::
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="ios" />
**Stream** 频道是 RTM 提供的一种基于 Room 模型的频道类型。与 Message 频道不同的是，使用 Stream 频道的相关方法前你需要先创建 `AgoraRtmStreamChannel` 对象实例。加入 Stream 频道后，你就可以监听频道中的事件通知了，但如需收发消息，你还需要通过 Topic 特性来实现，详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。RTM 允许你的 App 中同时存在成千上万个 Stream 频道，但由于端侧性能和带宽的限制，单个客户端同时只能加入有限数量的频道，详见 [API 使用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。

:::info[信息]
如需接收并处理接收到的消息和事件通知，除了要加入该频道外，你还需要完成[事件监听](/zh-CN/api-reference/rtm/ios/configuration#事件监听)程序的配置。
:::

## 创建频道 [#创建频道-1]

在使用 Stream 频道之前，你需要先调用 `createStreamChannel` 方法创建 Stream Channel 实例。成功创建 Stream Channel 实例后，你可以调用 Stream Channel 相关方法，例如：加入频道、离开频道、销毁频道、发送 Topic 消息、订阅 Topic 消息等。

你可以通过以下方式创建 `AgoraRtmStreamChannel` 对象实例：

```objc
NSError* create_error = nil;
AgoraRtmStreamChannel* stream_channel = [rtm createStreamChannel:@"your_channel" error:&create_error];
```

该方法一次只能创建一个 `AgoraRtmStreamChannel` 对象实例，如需同时创建多个 `AgoraRtmStreamChannel` 对象实例，你需要多次调用该方法。

```objc
NSError* create_error = nil;
// Create the first instance
AgoraRtmStreamChannel* stream_channel1 = [rtm createStreamChannel:@"your_channel1" error:&create_error];
// Create the second instance
AgoraRtmStreamChannel* stream_channel2 = [rtm createStreamChannel:@"your_channel2" error:&create_error];
```

RTM 支持你在单个客户端创建无限个 `AgoraRtmStreamChannel` 对象实例，但声网建议你结合实际需求和端侧性能情况合理创建。例如，如果你同时持有多个暂时用不到的 `AgoraRtmStreamChannel` 实例，为避免浪费资源，声网建议你及时销毁该实例，并在需要使用的时候再创建。

## 加入频道 [#加入频道-1]

创建 `AgoraRtmStreamChannel` 对象实例后，调用 `joinWithOption` 方法加入 Stream Channel，以便监听其中的事件通知。

```objc
AgoraRtmJoinChannelOption* join_opt =  [[AgoraRtmJoinChannelOption alloc] init];
join_opt.token =  @"your_token";
[stream_channel joinWithOption:join_opt completion:^(AgoraRtmCommonResponse * _Nullable response, AgoraRtmErrorInfo * _Nullable errorInfo) {
    if (errorInfo == nil) {
        NSLog(@"join channel success!!");
    } else {
        NSLog(@"join channel failed, errorCode %d, reason %@", errorInfo.errorCode, errorInfo.reason);
    }
}];
```

加入频道时，你需要在 `AgoraRtmJoinChannelOption` 中设置 `token` 参数。为方便体验和测试 App，你可以在创建项目时选择**鉴权机制**为**调试模式：APP ID**，并在加入频道时将 App ID 填写至 `token` 参数中。

```objc
AgoraRtmJoinChannelOption* join_opt =  [[AgoraRtmJoinChannelOption alloc] init];
join_opt.token =  @"your_appId";
join_opt.features = join_opt.features | AgoraRtmJoinChannelFeatureLock;
[stream_channel joinWithOption:join_opt completion:^(AgoraRtmCommonResponse * _Nullable response, AgoraRtmErrorInfo * _Nullable errorInfo) {
    if (errorInfo == nil) {
        NSLog(@"join channel success!!");
    } else {
        NSLog(@"join channel failed, errorCode %d, reason %@", errorInfo.errorCode, errorInfo.reason);
    }
}];
```

Stream Channel 通过 Topic 来实现消息流机制。即使你设置了全局的消息监听程序，你也需要加入 Topic 才能发送消息，需要订阅 Topic 才能接收消息。详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。

## 离开频道 [#离开频道-1]

如果你不再需要接收某个频道中所有消息和事件通知，你可以调用 `leave` 方法离开该频道。

```objc
[stream_channel leave:^(AgoraRtmCommonResponse * _Nullable response, AgoraRtmErrorInfo * _Nullable errorInfo) {
    if (errorInfo == nil) {
        NSLog(@"leave channel success!!");
    } else {
        NSLog(@"leave channel failed, errorCode %d, reason %@", errorInfo.errorCode, errorInfo.reason);
    }
}];
```

离开频道后，只要当前的 `AgoraRtmStreamChannel` 对象实例没有被销毁，你还可以调用 `joinWithOption` 方法再次加入该频道。

## 销毁频道 [#销毁频道-1]

对于不再需要的 `AgoraRtmStreamChannel` 对象实例，你可以调用 `destroy` 方法销毁它以释放资源。

```objc
[stream_channel destroy];
stream_channel = nil;
```

销毁频道指的是销毁当前客户端中的 `AgoraRtmStreamChannel` 对象实例，而非在整个 RTM 网络中销毁该频道，所以该操作不会影响频道中的其他用户。

:::info[信息]
`destroy` 需要在非回调内的子线程调用，避免在回调中执行。
:::

## 共频道传输 [#共频道传输-1]

声网会同时发行和维护两套 RTM SDK 版本：

- **独立版**（Standalone Version）：保持 RTM 功能独立，体积精简。版本号以 RTM 前缀开始，例如 RTM 2.3.0。适用于只需消息实时传输或与其他厂商 RTC 产品配合使用但不需要同步传输或优先级控制的场景。

- **融合版**（Merge Version）：与声网 RTC 产品深度融合，版本号以 RTC 加 RTM 版本号的形式展示。适用于需要实时消息传输和实时音视频传输的场景。基于 SDK 的深度融合，融合版在独立版的基础上增加了共频道传输数据、[消息与音视频同步传输](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/usage#同步传输)、消息数据与音视频数据全局优先级控制等特性。

无论是哪套版本，SDK 都具备同样的优异性能和 SLA 保证。你只需根据自己的业务场景进行选择。

共频道传输是指声网 RTM 的频道和 RTC 的频道可以通过合理的接口调用共用一个网络连接，且同名的 RTM Stream Channel 和 RTC Channel 会作为同一个频道，即你可以用同一个频道传输消息数据和音视频数据。共频道传输特性是实现消息与音视频数据同步传输和数据全局优先级控制等特性的基础。

:::info[信息]
只有融合版 SDK 支持共频道传输特性，且该特性仅对 Stream 类型频道有效。
:::
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="web" />
**Stream** 频道是 RTM 提供的一种基于 Room 模型的频道类型。与 Message 频道不同的是，使用 Stream 频道的相关方法前你需要先创建 `RTMStreamChannel` 对象实例。加入 Stream 频道后，你就可以监听频道中的事件通知了，但如需收发消息，你还需要通过 Topic 特性来实现，详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。RTM 允许你的 App 中同时存在成千上万个 Stream 频道，但由于端侧性能和带宽的限制，单个客户端同时只能加入有限数量的频道，详见 [API 使用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。

:::info[信息]
如需接收并处理接收到的消息和事件通知，除了要加入该频道外，你还需要完成[事件监听](/zh-CN/api-reference/rtm/web/configuration#事件监听)程序的配置。
:::

## 创建频道 [#创建频道-2]

在使用 Stream 频道之前，你需要先调用 `createStreamChannel` 方法创建 Stream Channel 实例。成功创建 Stream Channel 实例后，你可以调用 Stream Channel 相关方法，例如：加入频道、离开频道、销毁频道、发送 Topic 消息、订阅 Topic 消息等。

你可以通过以下方式创建 `RTMStreamChannel` 对象实例：

```javascript
const channelName = "chat_room";
const streamChannel = rtmClient.createStreamChannel(channelName);
```

该方法一次只能创建一个 `RTMStreamChannel` 对象实例，如需同时创建多个 `RTMStreamChannel` 对象实例，你需要多次调用该方法。

RTM 支持你在单个客户端创建无限个 `RTMStreamChannel` 对象实例，但声网建议你结合实际需求和端侧性能情况合理创建。例如，如果你同时持有多个暂时用不到的 `RTMStreamChannel` 实例，为避免浪费资源，声网建议你及时销毁该实例，并在需要使用的时候再创建。

## 加入频道 [#加入频道-2]

创建 `RTMStreamChannel` 对象实例后，调用 `join` 方法加入 Stream Channel，以便监听其中的事件通知。

```javascript
const options = {
    token: "your_token",
    withPresence: true,
    withLock: true,
    withMetadata: true
};
try {
    const result = await streamChannel.join(options);
} catch (status) {
    const { operation, reason, errorCode } = status;
    console.log(`${operation} failed, ErrorCode: ${errorCode}, due to: ${reason}.`);
}
```

加入频道时，你需要在 `JoinChannelOptions` 中设置 `token` 参数。为方便体验和测试 App，你可以在创建项目时选择**鉴权机制**为**调试模式：APP ID**，并在加入频道时将 App ID 填写至 `token` 参数中。

```javascript
const options = {
    token: "your_appId",
    withPresence: true,
    withLock: true,
    withMetadata: true
};
try {
    const result = await streamChannel.join(options);
} catch (status) {
    const { operation, reason, errorCode } = status;
    console.log(`${operation} failed, ErrorCode: ${errorCode}, due to: ${reason}.`);
}
```

Stream Channel 通过 Topic 来实现消息流机制。即使你设置了全局的消息监听程序，你也需要加入 Topic 才能发送消息，需要订阅 Topic 才能接收消息。详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。

## 离开频道 [#离开频道-2]

如果你不再需要接收某个频道中所有消息和事件通知，你可以调用 `leave` 方法离开该频道。

```javascript
try {
    const result = await streamChannel.leave();
} catch (status) {
    const { operation, reason, errorCode } = status;
    console.log(`${operation} failed, ErrorCode ${errorCode}, due to: ${reason}.`);
}
```

离开频道后，只要当前的 `RTMStreamChannel` 对象实例没有被销毁，你还可以调用 `join` 方法再次加入该频道。

## 共频道传输 [#共频道传输-2]

声网会同时发行和维护两套 RTM SDK 版本：

- **独立版**（Standalone Version）：保持 RTM 功能独立，体积精简。版本号以 RTM 前缀开始，例如 RTM 2.3.0。适用于只需消息实时传输或与其他厂商 RTC 产品配合使用但不需要同步传输或优先级控制的场景。

- **融合版**（Merge Version）：与声网 RTC 产品深度融合，版本号以 RTC 加 RTM 版本号的形式展示。适用于需要实时消息传输和实时音视频传输的场景。基于 SDK 的深度融合，融合版在独立版的基础上增加了共频道传输数据、[消息与音视频同步传输](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/usage#同步传输)、消息数据与音视频数据全局优先级控制等特性。

无论是哪套版本，SDK 都具备同样的优异性能和 SLA 保证。你只需根据自己的业务场景进行选择。

共频道传输是指声网 RTM 的频道和 RTC 的频道可以通过合理的接口调用共用一个网络连接，且同名的 RTM Stream Channel 和 RTC Channel 会作为同一个频道，即你可以用同一个频道传输消息数据和音视频数据。共频道传输特性是实现消息与音视频数据同步传输和数据全局优先级控制等特性的基础。

:::info[信息]
只有融合版 SDK 支持共频道传输特性，且该特性仅对 Stream 类型频道有效。
:::
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="harmonyos" />
**Stream** 频道是 RTM 提供的一种基于 Room 模型的频道类型。与 Message 频道不同的是，使用 Stream 频道的相关方法前你需要先创建 `StreamChannel` 对象实例。加入 Stream 频道后，你就可以监听频道中的事件通知了，但如需收发消息，你还需要通过 Topic 特性来实现，详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。RTM 允许你的 App 中同时存在成千上万个 Stream 频道，但由于端侧性能和带宽的限制，单个客户端同时只能加入有限数量的频道，详见 [API 使用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。

:::info[信息]
如需接收并处理接收到的消息和事件通知，除了要加入该频道外，你还需要完成[事件监听](/zh-CN/api-reference/rtm/harmonyos/configuration#事件监听)程序的配置。
:::

## 创建频道 [#创建频道-3]

在使用 Stream 频道之前，你需要先调用 `createStreamChannel` 方法创建 Stream Channel 实例。成功创建 Stream Channel 实例后，你可以调用 Stream Channel 相关方法，例如：加入频道、离开频道、销毁频道、发送 Topic 消息、订阅 Topic 消息等。

你可以通过以下方式创建 `StreamChannel` 对象实例：

```typescript
import { StreamChannel } from '@shengwang/rtm-full';

const channelName = "chat_room";
const streamChannel: StreamChannel = rtmClient.createStreamChannel(channelName);
console.log("Stream channel created:", channelName);
```

该方法一次只能创建一个 `StreamChannel` 对象实例，如需同时创建多个 `StreamChannel` 对象实例，你需要多次调用该方法。

```typescript
import { StreamChannel } from '@shengwang/rtm-full';

// 创建第一个实例
const streamChannel1: StreamChannel = rtmClient.createStreamChannel("chat_room1");
console.log("Stream channel 1 created");

// 创建第二个实例
const streamChannel2: StreamChannel = rtmClient.createStreamChannel("chat_room2");
console.log("Stream channel 2 created");
```

RTM 支持你在单个客户端创建无限个 `StreamChannel` 对象实例，但声网建议你结合实际需求和端侧性能情况合理创建。例如，如果你同时持有多个暂时用不到的 `StreamChannel` 实例，为避免浪费资源，声网建议你及时销毁该实例，并在需要使用的时候再创建。

## 加入频道 [#加入频道-3]

创建 `StreamChannel` 对象实例后，调用 `join` 方法加入 Stream Channel，以便监听其中的事件通知。

```typescript
import { JoinOptions } from '@shengwang/rtm-full';
import { RtmError } from '@shengwang/rtm-full';

const options: JoinOptions = {
  token: "your_token",
  withPresence: true,
  withLock: true,
  withMetadata: true
};

try {
  const response = await streamChannel.join(options);
  console.log("Join stream channel success:", response);
} catch (error) {
  console.error("Join channel failed:", error);
  if (error instanceof RtmError) {
    console.error(`Join channel failed: ${error.reason} (code: ${error.errorCode})`);
  }
}
```

加入频道时，你需要在 `JoinChannelOptions` 中设置 `token` 参数。为方便体验和测试 App，你可以在创建项目时选择**鉴权机制**为**调试模式：APP ID**，并在加入频道时将 App ID 填写至 `token` 参数中。

```typescript
import { JoinOptions } from '@shengwang/rtm-full';
import { RtmError } from '@shengwang/rtm-full';

const options: JoinOptions = {
  token: "your_appId",  // 调试模式下使用 App ID
  withPresence: true,
  withLock: true,
  withMetadata: true
};

try {
  const response = await streamChannel.join(options);
  console.log("Join stream channel success:", response);
} catch (error) {
  console.error("Join channel failed:", error);
  if (error instanceof RtmError) {
    console.error(`Join channel failed: ${error.reason} (code: ${error.errorCode})`);
  }
}
```

Stream Channel 通过 Topic 来实现消息流机制。即使你设置了全局的消息监听程序，你也需要加入 Topic 才能发送消息，需要订阅 Topic 才能接收消息。详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。

## 离开频道 [#离开频道-3]

如果你不再需要接收某个频道中所有消息和事件通知，你可以调用 `leave` 方法离开该频道。

```typescript
import { RtmError } from '@shengwang/rtm-full';

try {
  const response = await streamChannel.leave();
  console.log("Leave stream channel success:", response);
} catch (error) {
  console.error("Leave channel failed:", error);
  if (error instanceof RtmError) {
    console.error(`Leave channel failed: ${error.reason} (code: ${error.errorCode})`);
  }
}
```

离开频道后，只要当前的 `StreamChannel` 对象实例没有被销毁，你还可以调用 `join` 方法再次加入该频道。

## 销毁频道 [#销毁频道-2]

对于不再需要的 `StreamChannel` 对象实例，你可以调用 `release` 方法销毁它以释放资源。

```typescript
streamChannel.release();
console.log("Stream channel released");
```

销毁频道指的是销毁当前客户端中的 `StreamChannel` 对象实例，而非在整个 RTM 网络中销毁该频道，所以该操作不会影响频道中的其他用户。

:::info[信息]
`release` 需要在非回调内的子线程调用，避免在回调中执行。
:::

## 共频道传输 [#共频道传输-3]

声网会同时发行和维护两套 RTM SDK 版本：

- **独立版**（Standalone Version）：保持 RTM 功能独立，体积精简。版本号以 RTM 前缀开始，例如 RTM 2.3.0。适用于只需消息实时传输或与其他厂商 RTC 产品配合使用但不需要同步传输或优先级控制的场景。

- **融合版**（Merge Version）：与声网 RTC 产品深度融合，版本号以 RTC 加 RTM 版本号的形式展示。适用于需要实时消息传输和实时音视频传输的场景。基于 SDK 的深度融合，融合版在独立版的基础上增加了共频道传输数据、[消息与音视频同步传输](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/usage#同步传输)、消息数据与音视频数据全局优先级控制等特性。

无论是哪套版本，SDK 都具备同样的优异性能和 SLA 保证。你只需根据自己的业务场景进行选择。

共频道传输是指声网 RTM 的频道和 RTC 的频道可以通过合理的接口调用共用一个网络连接，且同名的 RTM Stream Channel 和 RTC Channel 会作为同一个频道，即你可以用同一个频道传输消息数据和音视频数据。共频道传输特性是实现消息与音视频数据同步传输和数据全局优先级控制等特性的基础。

:::info[信息]
只有融合版 SDK 支持共频道传输特性，且该特性仅对 Stream 类型频道有效。
:::
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="unity" />
**Stream** 频道是 RTM 提供的一种基于 Room 模型的频道类型。与 Message 频道不同的是，使用 Stream 频道的相关方法前你需要先创建 `IStreamChannel` 对象实例。加入 Stream 频道后，你就可以监听频道中的事件通知了，但如需收发消息，你还需要通过 Topic 特性来实现，详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。RTM 允许你的 App 中同时存在成千上万个 Stream 频道，但由于端侧性能和带宽的限制，单个客户端同时只能加入有限数量的频道，详见 [API 使用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。

:::info[信息]
如需接收并处理接收到的消息和事件通知，除了要加入该频道外，你还需要完成[事件监听](/zh-CN/api-reference/rtm/unity/configuration#事件监听)程序的配置。
:::

## 创建频道 [#创建频道-4]

在使用 Stream 频道之前，你需要先调用 `CreateStreamChannel` 方法创建 Stream Channel 实例。成功创建 Stream Channel 实例后，你可以调用 Stream Channel 相关方法，例如：加入频道、离开频道、销毁频道、发送 Topic 消息、订阅 Topic 消息等。

你可以通过以下方式创建 `IStreamChannel` 对象实例：

```csharp
IStreamChannel streamChannel = rtmClient.CreateStreamChannel("chat_room");
```

该方法一次只能创建一个 `IStreamChannel` 对象实例，如需同时创建多个 `IStreamChannel` 对象实例，你需要多次调用该方法。

```csharp
// Create the first instance
IStreamChannel streamChannel1 = rtmClient.CreateStreamChannel("chat_room1");
// Create the second instance
IStreamChannel streamChannel2 = rtmClient.CreateStreamChannel("chat_room2");
```

RTM 支持你在单个客户端创建无限个 `IStreamChannel` 对象实例，但声网建议你结合实际需求和端侧性能情况合理创建。例如，如果你同时持有多个暂时用不到的 `IStreamChannel` 实例，为避免浪费资源，声网建议你及时销毁该实例，并在需要使用的时候再创建。

## 加入频道 [#加入频道-4]

创建 `IStreamChannel` 对象实例后，调用 `JoinAsync` 方法加入 Stream Channel，以便监听其中的事件通知。

```csharp
var options = new JoinChannelOptions();
options.token = "your_token";
var (status,response) = await streamChannel.JoinAsync(options);
if (status.Error)
{
    Debug.Log(string.Format("{0} is failed, ErrorCode: {1}, due to: {2}", status.Operation, status.ErrorCode, status.Reason));
}
else
{
    Debug.Log(string.Format("User:{0} Join stream channel success! at Channel:{1}", response.UserId, response.ChannelName));
}
```

加入频道时，你需要在 `JoinChannelOptions` 中设置 `token` 参数。为方便体验和测试 App，你可以在创建项目时选择**鉴权机制**为**调试模式：APP ID**，并在加入频道时将 App ID 填写至 `token` 参数中。

```csharp
var options = new JoinChannelOptions();
options.token = "your_appId";
options.withLock = true;

var (status,response) = await streamChannel.JoinAsync(options);
if (status.Error)
{
    Debug.Log(string.Format("{0} is failed,The error code is {1},because of: {2}", status.Operation, status.ErrorCode, status.Reason));
}
else
{
    Debug.Log(string.Format("User:{0} Join stream channel success! at Channel:{1}", response.UserId, response.ChannelName));
}
```

Stream Channel 通过 Topic 来实现消息流机制。即使你设置了全局的消息监听程序，你也需要加入 Topic 才能发送消息，需要订阅 Topic 才能接收消息。详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。

## 离开频道 [#离开频道-4]

如果你不再需要接收某个频道中所有消息和事件通知，你可以调用 `LeaveAsync` 方法离开该频道。

```csharp
var (status,response) = await streamChannel.LeaveAsync();
if (status.Error)
{
    Debug.Log(string.Format("{0} is failed, ErrorCode: {1}, due to: {2}", status.Operation, status.ErrorCode, status.Reason));
}
else
{
    Debug.Log(string.Format("User:{0} Join stream channel success! at Channel:{1}", response.UserId, response.ChannelName));
}
```

离开频道后，只要当前的 `IStreamChannel` 对象实例没有被销毁，你还可以调用 `JoinAsync` 方法再次加入该频道。

## 销毁频道 [#销毁频道-3]

对于不再需要的 `IStreamChannel` 对象实例，你可以调用 `Dispose` 方法销毁它以释放资源。

```csharp
var status = streamChannel.Dispose();
if (status.Error)
{
    Debug.Log(string.Format("{0} is failed, ErrorCode: {1}, due to: {2}", status.Operation, status.ErrorCode, status.Reason));
}
else
{
    Debug.Log("Dispose Channel Success!");
}
```

销毁频道指的是销毁当前客户端中的 `IStreamChannel` 对象实例，而非在整个 RTM 网络中销毁该频道，所以该操作不会影响频道中的其他用户。

:::info[信息]
`Dispose` 需要在非回调内的子线程调用，避免在回调中执行。
:::

## 共频道传输 [#共频道传输-4]

声网会同时发行和维护两套 RTM SDK 版本：

- **独立版**（Standalone Version）：保持 RTM 功能独立，体积精简。版本号以 RTM 前缀开始，例如 RTM 2.3.0。适用于只需消息实时传输或与其他厂商 RTC 产品配合使用但不需要同步传输或优先级控制的场景。

- **融合版**（Merge Version）：与声网 RTC 产品深度融合，版本号以 RTC 加 RTM 版本号的形式展示。适用于需要实时消息传输和实时音视频传输的场景。基于 SDK 的深度融合，融合版在独立版的基础上增加了共频道传输数据、[消息与音视频同步传输](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/usage#同步传输)、消息数据与音视频数据全局优先级控制等特性。

无论是哪套版本，SDK 都具备同样的优异性能和 SLA 保证。你只需根据自己的业务场景进行选择。

共频道传输是指声网 RTM 的频道和 RTC 的频道可以通过合理的接口调用共用一个网络连接，且同名的 RTM Stream Channel 和 RTC Channel 会作为同一个频道，即你可以用同一个频道传输消息数据和音视频数据。共频道传输特性是实现消息与音视频数据同步传输和数据全局优先级控制等特性的基础。

:::info[信息]
只有融合版 SDK 支持共频道传输特性，且该特性仅对 Stream 类型频道有效。
:::
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="flutter" />
**Stream** 频道是 RTM 提供的一种基于 Room 模型的频道类型。与 Message 频道不同的是，使用 Stream 频道的相关方法前你需要先创建 `StreamChannel` 对象实例。加入 Stream 频道后，你就可以监听频道中的事件通知了，但如需收发消息，你还需要通过 Topic 特性来实现，详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。RTM 允许你的 App 中同时存在成千上万个 Stream 频道，但由于端侧性能和带宽的限制，单个客户端同时只能加入有限数量的频道，详见 [API 使用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。

:::info[信息]
如需接收并处理接收到的消息和事件通知，除了要加入该频道外，你还需要完成[事件监听](/zh-CN/api-reference/rtm/flutter/configuration#事件监听)程序的配置。
:::

## 创建频道 [#创建频道-5]

在使用 Stream 频道之前，你需要先调用 `createStreamChannel` 方法创建 Stream Channel 实例。成功创建 Stream Channel 实例后，你可以调用 Stream Channel 相关方法，例如：加入频道、离开频道、销毁频道、发送 Topic 消息、订阅 Topic 消息等。

你可以通过以下方式创建 `StreamChannel` 对象实例：

```dart
final channel = 'stream_room';
late StreamChannel stChannel;
try {
    var (status, channel) = await rtmClient.createStreamChannel(channel);
    if (status.error == true ){
       print('${status.operation} failed, errorCode: ${status.errorCode}, due to ${status.reason}');
    } else {
        stChannel = channel ;
        print('${status.operation} success!');
    }
} catch (e) {
    print('something went wrong: $e');
}
```

该方法一次只能创建一个 `StreamChannel` 对象实例，如需同时创建多个 `StreamChannel` 对象实例，你需要多次调用该方法。

RTM 支持你在单个客户端创建无限个 `StreamChannel` 对象实例，但声网建议你结合实际需求和端侧性能情况合理创建。例如，如果你同时持有多个暂时用不到的 `StreamChannel` 实例，为避免浪费资源，声网建议你及时销毁该实例，并在需要使用的时候再创建。

## 加入频道 [#加入频道-5]

创建 `StreamChannel` 对象实例后，调用 `join` 方法加入 Stream Channel，以便监听其中的事件通知。

```dart
var (status, response) = await stChannel.join(
    token: 'your_streamChannel_token',
    withMetadata: true,
    withPresence: true,
    withLock: true,
    beQuite: false);
if (status.error == true ){
    print('${status.operation} failed, errorCode: ${status.errorCode}, due to ${status.reason}');
} else {
    print('${status.operation} success!');
    print(response);
}
```

加入频道时，你需要在 `join` 中设置 `token` 参数。为方便体验和测试 App，你可以在创建项目时选择**鉴权机制**为**调试模式：APP ID**，并在加入频道时将 App ID 填写至 `token` 参数中。

```dart
var (status, response) = await stChannel.join(
    token: 'your_appId',
    withMetadata: true,
    withPresence: true,
    withLock: true,
    beQuite: false);
if (status.error == true ){
    print('${status.operation} failed, errorCode: ${status.errorCode}, due to ${status.reason}');
} else {
    print('${status.operation} success!');
    print(response);
}
```

Stream Channel 通过 Topic 来实现消息流机制。即使你设置了全局的消息监听程序，你也需要加入 Topic 才能发送消息，需要订阅 Topic 才能接收消息。详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。

## 离开频道 [#离开频道-5]

如果你不再需要接收某个频道中所有消息和事件通知，你可以调用 `leave` 方法离开该频道。

```dart
try {
    var (status, response) = await stChannel.leave();
    if (status.error == true ){
       print('${status.operation} failed, errorCode: ${status.errorCode}, due to ${status.reason}');
    } else {
        print('${status.operation} success!');
    }
} catch (e) {
    print('something went wrong: $e');
}
```

离开频道后，只要当前的 `StreamChannel` 对象实例没有被销毁，你还可以调用 `join` 方法再次加入该频道。

## 销毁频道 [#销毁频道-4]

对于不再需要的 `StreamChannel` 对象实例，你可以调用 `release` 方法销毁它以释放资源。

```dart
try {
    var status = await stChannel.release();
    if (status.error == true ){
       print('${status.operation} failed, errorCode: ${status.errorCode}, due to ${status.reason}');
    } else {
        print('${status.operation} success!');
    }
} catch (e) {
    print('something went wrong: $e');
}

```

销毁频道指的是销毁当前客户端中的 `StreamChannel` 对象实例，而非在整个 RTM 网络中销毁该频道，所以该操作不会影响频道中的其他用户。

:::info[信息]
`release` 需要在非回调内的子线程调用，避免在回调中执行。
:::

## 共频道传输 [#共频道传输-5]

声网会同时发行和维护两套 RTM SDK 版本：

- **独立版**（Standalone Version）：保持 RTM 功能独立，体积精简。版本号以 RTM 前缀开始，例如 RTM 2.3.0。适用于只需消息实时传输或与其他厂商 RTC 产品配合使用但不需要同步传输或优先级控制的场景。

- **融合版**（Merge Version）：与声网 RTC 产品深度融合，版本号以 RTC 加 RTM 版本号的形式展示。适用于需要实时消息传输和实时音视频传输的场景。基于 SDK 的深度融合，融合版在独立版的基础上增加了共频道传输数据、[消息与音视频同步传输](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/usage#同步传输)、消息数据与音视频数据全局优先级控制等特性。

无论是哪套版本，SDK 都具备同样的优异性能和 SLA 保证。你只需根据自己的业务场景进行选择。

共频道传输是指声网 RTM 的频道和 RTC 的频道可以通过合理的接口调用共用一个网络连接，且同名的 RTM Stream Channel 和 RTC Channel 会作为同一个频道，即你可以用同一个频道传输消息数据和音视频数据。共频道传输特性是实现消息与音视频数据同步传输和数据全局优先级控制等特性的基础。

:::info[信息]
只有融合版 SDK 支持共频道传输特性，且该特性仅对 Stream 类型频道有效。
:::
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="cpp" />
**Stream** 频道是 RTM 提供的一种基于 Room 模型的频道类型。与 Message 频道不同的是，使用 Stream 频道的相关方法前你需要先创建 `IStreamChannel` 对象实例。加入 Stream 频道后，你就可以监听频道中的事件通知了，但如需收发消息，你还需要通过 Topic 特性来实现，详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。RTM 允许你的 App 中同时存在成千上万个 Stream 频道，但由于端侧性能和带宽的限制，单个客户端同时只能加入有限数量的频道，详见 [API 使用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。

:::info[信息]
如需接收并处理接收到的消息和事件通知，除了要加入该频道外，你还需要完成[事件监听](/zh-CN/api-reference/rtm/cpp/configuration#事件监听)程序的配置。
:::

## 创建频道 [#创建频道-6]

在使用 Stream 频道之前，你需要先调用 `createStreamChannel` 方法创建 Stream Channel 实例。成功创建 Stream Channel 实例后，你可以调用 Stream Channel 相关方法，例如：加入频道、离开频道、销毁频道、发送 Topic 消息、订阅 Topic 消息等。

你可以通过以下方式创建 `IStreamChannel` 对象实例：

```cpp
int errorCode = 0;
IStreamChannel* stream_channel = rtm_client->createStreamChannel("channel_name", errorCode);
if (stream_channel == nullptr || errorCode != 0) {
    printf("create stream channel failed");
} else {
    printf("create stream channel success");
}
```

该方法一次只能创建一个 `IStreamChannel` 对象实例，如需同时创建多个 `IStreamChannel` 对象实例，你需要多次调用该方法。

```cpp
int errorCode = 0;
IStreamChannel* stream_channel1 = rtm_client->createStreamChannel("chat_room1", errorCode);
if (stream_channel1 == nullptr || errorCode != 0) {
    printf("create stream channel failed");
} else {
    printf("create stream channel success");
}

IStreamChannel* stream_channel2 = rtm_client->createStreamChannel("chat_room2", errorCode);
if (stream_channel2 == nullptr || errorCode != 0) {
    printf("create stream channel failed");
} else {
    printf("create stream channel success");
}
```

RTM 支持你在单个客户端创建无限个 `IStreamChannel` 对象实例，但声网建议你结合实际需求和端侧性能情况合理创建。例如，如果你同时持有多个暂时用不到的 `IStreamChannel` 实例，为避免浪费资源，声网建议你及时销毁该实例，并在需要使用的时候再创建。

## 加入频道 [#加入频道-6]

创建 `IStreamChannel` 对象实例后，调用 `join` 方法加入 Stream Channel，以便监听其中的事件通知。

```cpp
// 方法调用
JoinChannelOptions options;
options.token = "your_token";

uint64_t requestId;
stream_channel->join(options, requestId);
```

调用该方法后，SDK 会触发 `onJoinResult` 回调并返回 API 调用结果。

```cpp
// 异步回调
class RtmEventHandler : public IRtmEventHandler {
    void onJoinResult(const uint64_t requestId, const char *channelName, const char *userId, RTM_ERROR_CODE errorCode) {
        if (errorCode != RTM_ERROR_OK) {
            printf("join rtm channel failed error is %d reason is %s\n", errorCode, getErrorReason(errorCode));
        } else {
            printf("join rtm channel %s success\n", channelName);
        }
    }
};
```

加入频道时，你需要在 `JoinChannelOptions` 中设置 `token` 参数。为方便体验和测试 App，你可以在创建项目时选择**鉴权机制**为**调试模式：APP ID**，并在加入频道时将 App ID 填写至 `token` 参数中。

```cpp
JoinChannelOptions options;
options.token = "your_token";
options.withLock = false;
options.withMetadata = false;
options.withPresence = true;

uint64_t requestId;
stream_channel->join(options, requestId);
```

Stream Channel 通过 Topic 来实现消息流机制。即使你设置了全局的消息监听程序，你也需要加入 Topic 才能发送消息，需要订阅 Topic 才能接收消息。详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。

## 离开频道 [#离开频道-6]

如果你不再需要接收某个频道中所有消息和事件通知，你可以调用 `leave` 方法离开该频道。

```cpp
// 方法调用
uint64_t requestId;
streamChannel->leave(requestId);
```

调用该方法后，SDK 会触发 `onLeaveResult` 回调并返回 API 调用结果。

```cpp
// 异步回调
class RtmEventHandler : public IRtmEventHandler {
    void onLeaveResult(const uint64_t requestId, const char *channelName, const char *userId, RTM_ERROR_CODE errorCode) {
        if (errorCode != RTM_ERROR_OK) {
            printf("leave rtm channel failed error is %d reason is %s\n", errorCode, getErrorReason(errorCode));
        } else {
            printf("leave rtm channel %s success\n", channelName);
        }
    }
};
```

离开频道后，只要当前的 `IStreamChannel` 对象实例没有被销毁，你还可以调用 `join` 方法再次加入该频道。

## 销毁频道 [#销毁频道-5]

对于不再需要的 `IStreamChannel` 对象实例，你可以调用 `release` 方法销毁它以释放资源。

```cpp
int ret = streamChannel->release();
```

销毁频道指的是销毁当前客户端中的 `IStreamChannel` 对象实例，而非在整个 RTM 网络中销毁该频道，所以该操作不会影响频道中的其他用户。

:::info[信息]
`release` 需要在非回调内的子线程调用，避免在回调中执行。
:::

## 共频道传输 [#共频道传输-6]

声网会同时发行和维护两套 RTM SDK 版本：

- **独立版**（Standalone Version）：保持 RTM 功能独立，体积精简。版本号以 RTM 前缀开始，例如 RTM 2.3.0。适用于只需消息实时传输或与其他厂商 RTC 产品配合使用但不需要同步传输或优先级控制的场景。

- **融合版**（Merge Version）：与声网 RTC 产品深度融合，版本号以 RTC 加 RTM 版本号的形式展示。适用于需要实时消息传输和实时音视频传输的场景。基于 SDK 的深度融合，融合版在独立版的基础上增加了共频道传输数据、[消息与音视频同步传输](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/usage#同步传输)、消息数据与音视频数据全局优先级控制等特性。

无论是哪套版本，SDK 都具备同样的优异性能和 SLA 保证。你只需根据自己的业务场景进行选择。

共频道传输是指声网 RTM 的频道和 RTC 的频道可以通过合理的接口调用共用一个网络连接，且同名的 RTM Stream Channel 和 RTC Channel 会作为同一个频道，即你可以用同一个频道传输消息数据和音视频数据。共频道传输特性是实现消息与音视频数据同步传输和数据全局优先级控制等特性的基础。

:::info[信息]
只有融合版 SDK 支持共频道传输特性，且该特性仅对 Stream 类型频道有效。
:::
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="swift" />
**Stream** 频道是 RTM 提供的一种基于 Room 模型的频道类型。与 Message 频道不同的是，使用 Stream 频道的相关方法前你需要先创建 `AgoraRtmStreamChannel` 对象实例。加入 Stream 频道后，你就可以监听频道中的事件通知了，但如需收发消息，你还需要通过 Topic 特性来实现，详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。RTM 允许你的 App 中同时存在成千上万个 Stream 频道，但由于端侧性能和带宽的限制，单个客户端同时只能加入有限数量的频道，详见 [API 使用限制](/zh-CN/realtime-media/rtm/reference/usage-limits-and-errors/api-limits)。

:::info[信息]
如需接收并处理接收到的消息和事件通知，除了要加入该频道外，你还需要完成[事件监听](/zh-CN/api-reference/rtm/swift/configuration#事件监听)程序的配置。
:::

## 创建频道 [#创建频道-7]

在使用 Stream 频道之前，你需要先调用 `createStreamChannel` 方法创建 Stream Channel 实例。成功创建 Stream Channel 实例后，你可以调用 Stream Channel 相关方法，例如：加入频道、离开频道、销毁频道、发送 Topic 消息、订阅 Topic 消息等。

你可以通过以下方式创建 `AgoraRtmStreamChannel` 对象实例：

```swift
 do {
    let stream_channel = try RtmClient?.createStreamChannel(channelName)
    if stream_channel != nil {
        print("create stream channel success");
    }
 }catch let error {
    print("error\(error)")
}
```

该方法一次只能创建一个 `AgoraRtmStreamChannel` 对象实例，如需同时创建多个 `AgoraRtmStreamChannel` 对象实例，你需要多次调用该方法。

```swift
do {
    let stream_channel = try RtmClient?.createStreamChannel(channelName1)
    if stream_channel != nil {
        print("create stream channel success");
    }
 }catch let error {
    print("error\(error)")
}

do {
    let stream_channel = try RtmClient?.createStreamChannel(channelName2)
    if stream_channel != nil {
        print("create stream channel success");
    }
 }catch let error {
    print("error\(error)")
}
```

RTM 支持你在单个客户端创建无限个 `AgoraRtmStreamChannel` 对象实例，但声网建议你结合实际需求和端侧性能情况合理创建。例如，如果你同时持有多个暂时用不到的 `AgoraRtmStreamChannel` 实例，为避免浪费资源，声网建议你及时销毁该实例，并在需要使用的时候再创建。

## 加入频道 [#加入频道-7]

创建 `AgoraRtmStreamChannel` 对象实例后，调用 `join` 方法加入 Stream Channel，以便监听其中的事件通知。

```swift
let join_option = AgoraRtmJoinChannelOption();
join_option.token = "your_token"
stream_channel.join(join_option, completion: { (res, error) in
    if error != nil {
        print("\(error?.operation) failed! error reason is \(error?.reason)")
    } else {
        print("success")
    }
    })
```

加入频道时，你需要在 `AgoraRtmJoinChannelOption` 中设置 `token` 参数。为方便体验和测试 App，你可以在创建项目时选择**鉴权机制**为**调试模式：APP ID**，并在加入频道时将 App ID 填写至 `token` 参数中。

```swift
let join_option = AgoraRtmJoinChannelOption();
join_option.token = "your_token"
join_option.features = [.presence, .storage]
stream_channel.join(join_option, completion: { (res, error) in
    if error != nil {
        print("\(error?.operation) failed! error reason is \(error?.reason)")
    } else {
        print("success")
    }
    })
```

Stream Channel 通过 Topic 来实现消息流机制。即使你设置了全局的消息监听程序，你也需要加入 Topic 才能发送消息，需要订阅 Topic 才能接收消息。详见 [Topic](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/topic-basic)。

## 离开频道 [#离开频道-7]

如果你不再需要接收某个频道中所有消息和事件通知，你可以调用 `leave` 方法离开该频道。

```swift
stream_channel.leave({ res, error in
    if error != nil {
        print("\(error?.operation) failed! error reason is \(error?.reason)")
    } else {
        print("success")
    }
})
```

离开频道后，只要当前的 `AgoraRtmStreamChannel` 对象实例没有被销毁，你还可以调用 `join` 方法再次加入该频道。

## 销毁频道 [#销毁频道-6]

对于不再需要的 `AgoraRtmStreamChannel` 对象实例，你可以调用 `destroy` 方法销毁它以释放资源。

```swift
stream_channel.destroy();
stream_channel = nil;
```

销毁频道指的是销毁当前客户端中的 `AgoraRtmStreamChannel` 对象实例，而非在整个 RTM 网络中销毁该频道，所以该操作不会影响频道中的其他用户。

:::info[信息]
`destroy` 需要在非回调内的子线程调用，避免在回调中执行。
:::

## 共频道传输 [#共频道传输-7]

声网会同时发行和维护两套 RTM SDK 版本：

- **独立版**（Standalone Version）：保持 RTM 功能独立，体积精简。版本号以 RTM 前缀开始，例如 RTM 2.3.0。适用于只需消息实时传输或与其他厂商 RTC 产品配合使用但不需要同步传输或优先级控制的场景。

- **融合版**（Merge Version）：与声网 RTC 产品深度融合，版本号以 RTC 加 RTM 版本号的形式展示。适用于需要实时消息传输和实时音视频传输的场景。基于 SDK 的深度融合，融合版在独立版的基础上增加了共频道传输数据、[消息与音视频同步传输](/zh-CN/realtime-media/rtm/build/channels-and-topics/topics/usage#同步传输)、消息数据与音视频数据全局优先级控制等特性。

无论是哪套版本，SDK 都具备同样的优异性能和 SLA 保证。你只需根据自己的业务场景进行选择。

共频道传输是指声网 RTM 的频道和 RTC 的频道可以通过合理的接口调用共用一个网络连接，且同名的 RTM Stream Channel 和 RTC Channel 会作为同一个频道，即你可以用同一个频道传输消息数据和音视频数据。共频道传输特性是实现消息与音视频数据同步传输和数据全局优先级控制等特性的基础。

:::info[信息]
只有融合版 SDK 支持共频道传输特性，且该特性仅对 Stream 类型频道有效。
:::
<_PlatformProcessedMarker close="true" />

<_PlatformProcessedMarker groupMode="structured" canonicalPlatform="web" platform="mini-program" />
### 小程序（不适用） [#小程序不适用]

[平台能力列表](/zh-CN/realtime-media/rtm/reference/capabilities-and-compatibility/feature-list/mini-program)
<_PlatformProcessedMarker close="true" />
</_PlatformTabsGroup>
