初始配置
RTM SDK API 参考介绍了实时消息相关 API 的接口描述、接口方法、基本用法示例代码和返回值。
想要了解详细的初始配置步骤,可以查看:
RtmConfig
接口描述
RtmConfig
用于设置 RTM 初始化时配置其他额外属性,这些配置属性会在整个 RTM 客户端的生命周期中生效,影响 RTM 客户端的行为。
接口方法
你可以通过以下方式创建 RtmConfig
实例:
RtmConfig({
int heartbeatInterval,
int presenceTimeout,
bool useStringUserId,
RtmProtocolType protocolType,
RtmLogConfig logConfig,
RtmProxyConfig proxyConfig,
RtmEncryptionConfig encryptionConfig,
RtmPrivateConfig privateConfig,
Set<RtmAreaCode> areaCode
})
属性 | 类型 | 必填 | 默认值 | 描述 |
---|---|---|---|---|
areaCode | RtmAreaCode | 选填 | glob | 服务区域代码,你可以根据自己业务部署的区域进行选择,详见 RtmAreaCode 。 |
protocolType | RtmProtocolType | 选填 | tcpUdp | 消息传输协议类型。RTM 默认使用一路 TCP 和一路 UDP 协议进行传输,你可以根据需要修改协议类型。详见 RtmProtocolType 。 |
presenceTimeout | int | 选填 | 300 | Presence 的超时时间。单位为秒,取值范围为 [5,300]。即 RTM 服务器在判定客户端超时后,延迟多久向其他用户发送 remoteTimeout 事件通知。如果客户端在该参数设置的时间内重新建立连接并返回频道,则 RTM 服务器不会向频道中其他人发送 remoteTimeout 事件通知,也不会删除该用户的临时用户数据。 |
heartbeatInterval | int | 选填 | 5 | SDK 心跳时间。单位为秒,取值范围为 [5,1800]。即客户端向 RTM 服务器发送心跳包的时间间隔。如果客户端在该参数设置的时间内没有向 RTM 服务器发送心跳包,则 RTM 服务器会判定客户端超时。 信息 该参数会影响 PCU 计数,从而影响计费。 |
useStringUserId | bool | 选填 | true | 是否使用 String 类型的用户 ID:
当同时使用声网 RTC 和 RTM 产品时,需要确保 |
logConfig | RtmLogConfig | 选填 | - | 本地日志存储的大小、位置和日志等级等配置属性。 |
proxyConfig | RtmProxyConfig | 选填 | - | 当使用 RTM 的 Proxy 功能时,需要配置此参数。 |
encryptionConfig | RtmEncryptionConfig | 选填 | - | 当使用 RTM 端侧加密功能时,需要配置此项参数。 |
privateConfig | RtmPrivateConfig | 选填 | - | 当使用 RTM 的私有化部署功能时,需要配置此项参数。 |
RtmLogConfig
RtmLogConfig({
String filePath,
int fileSizeInKB,
RtmLogLevel level
})
RtmLogConfig
实例用来设置和存储本地日志文件 agora.log
。在调试阶段,通过日志保存和跟踪 App 运行状态,你可以极大的提升效率。如果遇到复杂问题并需要声网技术人员协助调查,你需要提供该日志信息。RtmLogConfig
包含以下属性:
属性 | 类型 | 必填 | 默认值 | 描述 |
---|---|---|---|---|
filePath | String | 选填 | - | 日志存储路径。 |
fileSizeInKB | int | 选填 | 1024 | 日志文件大小,单位为 KB,取值范围为 [128,1024]。
|
level | RtmLogLevel | 选填 | info | 日志信息的输出等级,详见 RtmLogLevel 。 |
RtmProxyConfig
RtmProxyConfig
实例用来设置客户端 Proxy 服务代理等相关属性。在一些网络服务受限的环境下,你可能需要使用此功能。
RtmProxyConfig({
RtmProxyType proxyType,
String server,
int port,
String account,
String password
})
你需要妥善保管好你的 Proxy 用户名和密码。RTM 不会以任何方式解析、存储、转发你的用户名和密码。此外,如果你在 App 运行过程中修改 Proxy 的设置,该设置要重启 RTM Client 后才能生效。
RtmProxyConfig
包含以下属性:
属性 | 类型 | 必填 | 默认值 | 描述 |
---|---|---|---|---|
proxyType | RtmProxyType | 选填 | none | Proxy 协议类型。详见 RtmProxyType 。 |
server | String | 选填 | - | Proxy 服务器域名或 IP 地址。 |
port | int | 选填 | - | Proxy 监听端口。 |
account | String | 选填 | - | Proxy 登录账号。 |
password | String | 选填 | - | Proxy 登录密码。 |
RtmEncryptionConfig
RtmEncryptionConfig
实例用来设置客户端加密所需要的属性。成功设置加密方式、加密密钥等属性后,用户发送的所有消息或者设置的所有状态都会在客户端自动加密和解密。
RtmEncryptionConfig({
RtmEncryptionMode encryptionMode,
String encryptionKey,
Uint8List encryptionSalt
})
一旦设置了加密,所有用户必须使用相同的加密模式和密钥,否则数据无法互通。
RtmEncryptionConfig
包含以下属性:
属性 | 类型 | 必填 | 默认值 | 描述 |
---|---|---|---|---|
encryptionMode | RtmEncryptionMode | 选填 | none | 加密方式。详见 RtmEncryptionMode 。 |
encryptionKey | String | 选填 | - | 用户自定义加密密钥,长度无限制。声网推荐使用 32 字节的密钥。 |
encryptionKdfSalt | Uint8List | 选填 | null | 用户自定义加密盐,长度为 32 字节。声网推荐你在服务端使用 OpenSSL 生成盐。 |
RtmPrivateConfig
RtmPrivateConfig
实例用来设置私有化部署所需要的属性。
RtmPrivateConfig({
Set<RtmServiceType> serviceType,
List<String> accessPointHosts
})
RtmPrivateConfig
包含以下属性:
属性 | 类型 | 必填 | 默认值 | 描述 |
---|---|---|---|---|
serviceType | Set<RtmServiceType> | 选填 | - | 服务类型。详见 RtmServiceType 。 |
accessPointHosts | List<String> | 选填 | - | 服务器的地址数组,数组中支持填写域名或 IP 地址。 |
基本用法
final proxyConfig = RtmProxyConfig(
protocolType : RtmProxyType.http,
server : "x.x.x.x",
port : 8080,
account : "Tony",
password : "pwd" );
final logConfig = RtmLogConfig(
filePath : "xxxx",
fileSizeInKB : 1024;
leave : RtmLogLevel.info );
final encryptionConfig = RtmEncryptionConfig(
encryptionMode : RtmEncryptionMode.aes256Gcm,
encryptionKey : "XXXXX",
encryptionSalt : [1,2,3,4,5]);
final rtmConfig = RtmConfig(
heartbeatInterval : 10,
presenceTimeout : 5,
proxyConfig : proxyConfig,
logConfig : logConfig,
areaCode : {RtmAreaCode.cn, RtmAreaCode.na},
encryptionConfig : encryptionConfig );
初始化
接口描述
调用 RTM()
方法创建并初始化 RTM Client 实例。
- 创建并初始化客户端实例需要在调用 RTM 的其他 API 之前进行。
- 为区分各用户和设备,你需要确保
userId
全局唯一,并且在用户或设备的生命周期内保持不变。
接口方法
你可以通过以下方式创建并初始化实例:
Future<(RtmStatus,RtmClient)> RTM(
String appId,
String userId,
{
RtmConfig rtmConfig
}
)
参数 | 类型 | 必填 | 默认值 | 描述 |
---|---|---|---|---|
appId | String | 是 | - | 你在声网控制台创建项目时获得的 App ID。 |
userId | String | 是 | - | 用户 ID,用于标识用户或设备。为区分各用户和设备,你需要确保 userId 全局唯一,并且在用户或设备的生命周期内保持不变。 |
rtmConfig | RtmConfig | 选填 | - | 初始化 RTM Client 的配置参数。详见 RtmConfig 。 |
基本用法
final proxyConfig = RtmProxyConfig(
protocolType : RtmProxyType.http,
server : "x.x.x.x",
port : 8080,
account : "Tony",
password : "pwd" );
final logConfig = RtmLogConfig(
filePath : "xxxx",
fileSizeInKB : 1024,
leave : RtmLogLevel.info );
final encryptionConfig = RtmEncryptionConfig(
encryptionMode : RtmEncryptionMode.aes256gcm,
encryptionKey : "XXXXX",
encryptionSalt : [1,2,3,4,5]);
final rtmConfig = RtmConfig(
heartbeatInterval : 10,
presenceTimeout : 5,
proxyConfig : proxyConfig,
logConfig : logConfig,
areaCode : {RtmAreaCode.cn, RtmAreaCode.na},
encryptionConfig : encryptionConfig );
var (status,rtmClient) = await RTM("myAppId", "Tony", rtmConfig:rtmConfig);
if (status.error == true) {
print(status);
} else {
print(response);
}
返回值
调用该方法,会返回 Future<(RtmStatus,RtmClient)>
类型的元组数据。
-
无论该方法是否调用成功,元组的第一项都会返回一个
RtmStatus
类型的数据,其中字段定义如下:Dartclass RtmStatus {
bool error; // 本次操作是否出错。
String errorCode; // 本次操作错误码。
String operation; // 本次操作的 API。
String reason; // 本次操作错误原因简述。
}你可以通过检索
errorCode
字段的错误码了解错误原因,并找到对应的解决方法。 -
如果该方法调用成功,元组的第二项将返回一个 RTM 客户端实例,用以后续调用其他 API。
事件监听
接口描述
RTM 总共有 7 种事件通知类型,如下表所示:
事件类型 | 描述 |
---|---|
presence | 接收用户所订阅的 Message Channel 及加入的 Stream Channel 中所有的 Presence 事件通知。详见 PresenceEvent 。 |
topic | 接收用户所加入的 Stream Channel 中所有 Topic 变更事件通知。详见 TopicEvent 。 |
storage | 接收用户所订阅的 Message Channel 及加入的 Stream Channel 中所有的 Channel Metadata 事件通知,及订阅用户的 User Metadata 事件通知。详见 StorageEvent 。 |
lock | 接收用户所订阅的 Message Channel 及加入的 Stream Channel 中所有的 Lock 事件通知。详见 LockEvent 。 |
linkState | 接收客户端网络连接状态变更的事件通知。详见 LinkStateEvent 。 |
token | 接收客户端 Token 将要过期的事件通知。 |
添加监听
你可以在 App 生命周期的任意时间调用 addListener
方法添加一个或多个事件监听对象。
rtmClient.addListener({
Function(MessageEvent event)? message = null,
Function(PresenceEvent event)? presence = null,
Function(TopicEvent event)? topic = null,
Function(StorageEvent event)? storage = null,
Function(LockEvent event)? lock = null,
Function(LinkStateEvent event)? linkState = null,
Function(TokenEvent event)? token = null,
})
删除监听
如果你不再需要关注某个事件监听对象,但仍需关注其他时间监听对象,你可以调用 removeListener
方法删除指定的事件监听对象。
rtmClient.removeListener({
Function(MessageEvent event) message = null,
})
MessageEvent
消息事件。
MessageEvent
包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
channelType | RtmChannelType | 频道类型。详见 RtmChannelType 。 |
messageType | RtmMessageType | 消息类型。详见 RtmMessageType 。 |
channelName | String | 频道名称。 |
channelTopic | String | Topic 名称。 |
message | Uint8List | 消息。 |
messageLength | int | 消息长度。 |
publisher | String | 消息发布者 ID。 |
customType | String | 用户自定义字段。仅支持 String 型。 |
timestamp | int | 事件发生的时间戳。 |
PresenceEvent
用户 Presence 事件。
PresenceEvent
包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
type | RtmPresenceEventType | Presence 事件类型。详见 RtmPresenceEventType 。 |
channelType | RtmChannelType | 频道类型。详见 RtmChannelType 。 |
channelName | String | 事件发生的频道名称。 |
publisher | String | 触发此事件的用户 ID。 |
stateItems | List<StateItem> | 标识用户临时状态的键值对。 |
interval | IntervalInfo | Interval 状态下,当前频道在上一个周期内用户加入、离开、超时、状态变更等事件通知的聚合增量信息。 |
snapshot | SnapshotInfo | 用户第一次加入或订阅频道时,服务端给用户推送当前频道的内所有用户及其状态的快照数据。 |
timestamp | int | 事件发生的时间戳。 |
StateItem
数据类型包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
key | String | 用户状态的键。如果指定的键已经存在,则该键的值会被新值覆盖;如果指定的键不存在,则 SDK 会新增该键/值对。 |
value | String | 用户状态的值。 |
IntervalInfo
数据类型包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
joinUserList | UserList | 在上一个周期内加入频道的用户列表。 |
leaveUserList | UserList | 在上一个周期内离开频道的用户列表。 |
timeoutUserList | UserList | 在上一个周期内加入频道超时的用户列表。 |
userStateList | List<UserState> | 在上一个周期内状态变更的用户列表。包含用户 ID 和状态键值对。 |
SnapshotInfo
数据类型包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
userStateList | List<UserState> | 用户第一次加入频道时的快照信息,包含用户 ID 和状态键值对。 |
UserList
数据类型包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
users | List<String> | 用户列表。 |
UserState
数据类型包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
userId | String | 用户 ID。 |
states | List<StateItem> | 频道在线用户及其临时状态信息列表。 |
TopicEvent
Topic 事件。
TopicEvent
包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
type | RtmTopicEventType | Topic 事件类型。详见 RtmTopicEventType 。 |
channelName | String | 事件发生的频道名称。 |
publisher | String | 触发此事件的用户 ID。 |
topicInfos | List<TopicInfo> | Topic 的详细信息数组,包含 Topic 名称、Topic 发布者等信息。 |
timestamp | int | 事件发生的时间戳。 |
TopicInfo
数据类型包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
topic | String | Topic 名称。 |
publishers | List<PublisherInfo> | 消息发布者数组。 |
PublisherInfo
数据类型包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
publisherUserId | String | 消息发布者的用户 ID。 |
publisherMeta | String | 消息发布者的元数据。 |
StorageEvent
Storage 事件。
StorageEvent
包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
channelType | RtmChannelType | 频道类型。详见 RtmChannelType 。 |
storageType | RtmStorageType | Storage 类型。详见 RtmStorageType 。 |
eventType | RtmStorageEventType | Storage 事件类型。详见 RtmStorageEventType 。 |
target | String | 用户 ID 或频道名称。 |
data | Metadata | Metadata Item。详见 Metadata 。 |
timestamp | int | 事件发生的时间戳。 |
LockEvent
Lock 事件。
LockEvent
包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
channelType | RtmChannelType | 频道类型。详见 RtmChannelType 。 |
eventType | RtmLockEventType | Lock 事件类型。详见 RtmLockEventType 。 |
channelName | String | 频道名称。 |
lockDetailList | List<LockDetail> | Lock 的详情。 |
timestamp | int | 事件发生的时间戳。 |
LockDetail
数据类型包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
lockName | String | Lock 的名称。 |
owner | String | 拥有锁的用户 ID。 |
ttl | int | 锁的过期时间。单位为秒,取值范围为 [10,300]。当使用这把锁的用户掉线时,如果用户在过期时间之内重新回到频道,则该用户依旧可以使用锁;否则,该用户的锁会被释放,监听了 lock 事件通知的用户会收到 lockReleased 事件。 |
LinkStateEvent
SDK 连接状态事件。
LinkStateEvent
包含以下属性:
属性 | 类型 | 描述 |
---|---|---|
currentState | RtmLinkState | 当前的连接状态。详见 RtmLinkState 。 |
previousState | RtmLinkState | 之前的连接状态。详见 RtmLinkState 。 |
serviceType | RtmServiceType | 网络连接类型。详见 RtmServiceType 。 |
operation | RtmLinkOperation | 触发本次状态迁移的操作。详见 RtmLinkOperation 。 |
reason | String | 本次状态迁移的原因。 |
affectedChannels | List<String> | 本次状态迁移影响的频道。 |
unrestoredChannels | List<String> | 未恢复订阅或加入的频道信息,包含频道名、频道类型和频道中的临时状态数据。一般情况下为空。 |
isResumed | bool | 在连接断开的 2 分钟内,是否从 rtmLinkStateDisconnected 状态恢复成 rtmLinkStateConnected 状态。true 表示已恢复。 |
timestamp | int | 本次事件通知发送的时间戳。 |
login
接口描述
创建并初始化 RTM 实例之后,你需要执行 login
操作以登录 RTM 服务。登录成功将使客户端与 RTM 服务器建立起长连接,之后客户端才能正常访问 RTM 资源。
用户成功登录 RTM 服务后,应用的 PCU 会增加,这将影响你的账单数据。
接口方法
你可以通过以下方法登录 RTM 系统:
Future<(RtmStatus, LoginResult?)> login(String token);
参数 | 类型 | 必填 | 默认值 | 描述 |
---|---|---|---|---|
token | String | 必填 | - | 登录 RTM 系统的 Token。
|
基本用法
var (status,response) = await rtmClient.login('your_token');
if (status.error == true) {
print(status);
} else {
print(response);
}
返回值
调用该方法,会返回 Future<(RtmStatus, LoginResult?)>
类型的元组数据。
-
无论该方法是否调用成功,元组的第一项都会返回一个
RtmStatus
类型的数据,其中字段定义如下:Dartclass RtmStatus {
bool error; // 本次操作是否出错。
String errorCode; // 本次操作错误码。
String operation; // 本次操作的 API。
String reason; // 本次操作错误原因简述。
}你可以通过检索
errorCode
字段的错误码了解错误原因,并找到对应的解决方法。 -
如果该方法调用成功,元组的第二项将返回一个
LoginResult
类型的数据,当前不包含任何字段。
logout
接口描述
当你不再需要操作后,可以登出系统。本操作会影响你账单中的 PCU 计费项。
接口方法
你可以通过以下接口退出登录:
Future<(RtmStatus, LogoutResult?)> logout();
基本用法
var (status,response) = await rtmClient.logout();
if (status.error == true) {
print(status);
} else {
print(response);
}
返回值
调用此方法,会返回 Future<(RtmStatus, LogoutResult?)>
类型的元组数据。
-
无论该方法是否调用成功,元组的第一项都会返回一个
RtmStatus
类型的数据,其中字段定义如下:Dartclass RtmStatus {
bool error; // 本次操作是否出错。
String errorCode; // 本次操作错误码。
String operation; // 本次操作的 API。
String reason; // 本次操作错误原因简述。
}你可以通过检索
errorCode
字段的错误码了解错误原因,并找到对应的解决方法。 -
如果该方法调用成功,元组的第二项将返回一个
LogoutResult
类型的数据,当前不包含任何字段。
release
接口描述
一旦不再需要 RTM 服务,最好销毁 RtmClient
实例。这样做将使你免受内存泄漏甚至错误和异常引起的性能下降的影响。
release
需要在非回调内的子线程调用,避免在回调中执行。
接口方法
你可以通过以下方法销毁 RtmClient
实例:
Future<RtmStatus> release();
基本用法
var status = await rtmClient.release();
返回值
无论该方法是否调用成功,都会返回一个 RtmStatus
类型的数据,其中字段定义如下:
class RtmStatus {
bool error; // 本次操作是否出错。
String errorCode; // 本次操作错误码。
String operation; // 本次操作的 API。
String reason; // 本次操作错误原因简述。
}
你可以通过检索 errorCode
字段的错误码了解错误原因,并找到对应的解决方法。