发版说明
本文提供 RTM v2 SDK 的发版说明。
自 2.2.0 起,RTM SDK 和 RTC SDK(4.3.0 及以上版本)都包含动态库文件。如果你同时使用了 RTM 和 RTC SDK,为避免冲突,请手动删除更低版本的动态库文件。
- 2.2.2 RTM SDK 动态库版本为 1.0.11。
- 2.2.1 RTM SDK 动态库版本为 1.0.11。
- 2.2.0 RTM SDK 动态库版本为 1.0.0.17。
2.2.2 版
该版本于 2024 年 11 月 6 日发布。
该版本修定了 Presence 事件中 SNAPSHOT
事件的触发时机。现在,只要用户在频道内,就可能会再次收到 SNAPSHOT
事件;收到后,用户可以更新自己的全量信息,来避免因异常导致的状态不同步问题。
该版本修改了锁(Lock)过期时间的计算规则。该版本起,锁的过期时间将从服务端判定用户离线开始计算。
该版本在 PublishOptions
中新增了 storeInHistory
属性,支持在频道中发送消息的同时,将消息存储到云端,后续用户可以通过历史消息接口获取。
该功能目前处于 Public Beta 阶段。如需使用,需要前往控制台开启。
该版本在 SDK 连接状态 LinkStateEvent
中添加 RTM_LINK_STATE_CHANGE_REASON
枚举类,报告连接状态变更的原因。
该版本提升了基础消息服务在服务异常时的业务表现,避免因部分服务出现异常,导致的消息服务不可用的问题。
该版本修复了如下问题:
- 某些场景下,Token 类型不正确导致异常错误。
- 某些场景下,用户可能多次收到相同离线用户的离线通知。
- 相同 UID 在不同端登录后,可能出现连接状态异常。
- 频繁设置 Presence 状态时,可能导致数据异常。
- 未开通指定服务时,加入频道时未返回错误。
- 某些场景下,异常属性值可能导致崩溃问题。
2.2.1 版
该版本于 2024 年 7 月 26 日发布。
该版本对以下功能的实现方式进行了优化,涉及一些 API 的改名、删除或行为变更,为确保项目的正常运行,你需要在升级到该版本后更新 App 中的代码。
该版本删除了 initialize
方法,并在 createAgoraRtmClient
方法中新增初始化参数作为替代。参考如下示例代码修改你的实现代码:
// v2.2.1 之前
// 创建 RTM 实例
IRtmClient* rtmClient = createAgoraRtmClient();
RtmConfig config;
config.appId = "your_appid";
config.userId = "your_name";
config.eventHandler = new RtmEventHandler();
// 初始化 RTM 实例
int ret = rtmClient->initialize(config);
if (ret != RTM_ERROR_OK) {
// 处理初始化报错
}
// v2.2.1
RtmConfig config;
config.appId = "your_appid"
config.userId = "your_name";
config.eventHandler = new RtmEventHandler();
int errorCode = 0;
// 创建并初始化 RTM 实例
rtmClient = createAgoraRtmClient(config, errorCode);
if (!rtmClient || errorCode != 0) {
std::cout << RED <<"error creating rtm service!" << std::endl;
exit(0);
}
该版本将除 createAgoraRtmClient
、createStreamChannel
和 release
以外方法的返回值从 int
类型修改为 void
类型,并补齐以下异步回调:
onPublishTopicMessageResult
onUnsubscribeTopicResult
onUnsubscribeResult
onLogoutResult
onRenewTokenResult
onUnsubscribeUserMetadataResult
该版本删除了 createMetadata
方法。参考如下示例代码修改你的实现代码:
// v2.2.1 之前
IMetadata* metadata = rtmClient->getStorage()->createMetadata();
// v2.2.1
Metadata data;
该版本在 RTM_CONNECTION_CHANGE_REASON
中新增了 RTM_CONNECTION_CHANGED_CERTIFICATION_VERIFY_FAILURE(22)
枚举,并将 RTM_CONNECTION_CHANGED_STREAM_CHANNEL_NOT_AVAILABLE
和 RTM_CONNECTION_CHANGED_INCONSISTENT_APPID
枚举对应的值修改为 23 和 24。
该版本在 RtmConfig
中新增 privateConfig
参数,用于实现私有化部署功能。详见私有化配置。
该版本在 RtmConfig
中新增 heartbeatInterval
参数,用于配置 SDK 向 RTM 服务器发送心跳包的时间间隔。详见 Heartbeat Interval 与 Presence Timeout。
该版本在 RtmConfig
中新增 protocolType
参数,用于自定义网络传输协议,以便于更好地适配你的网络环境。详见连接协议配置。
该版本在 RTM_CHANNEL_TYPE
中新增 RTM_CHANNEL_TYPE_USER
类型,用于向指定用户发送消息。该功能可以替代 v1 的点对点消息功能。详见在 User Channel 中发送消息。
该版本在 SubscribeOptions
和 JoinChannelOptions
中新增 beQuiet
属性。该属性设置为 true
时表示静默订阅或加入频道,频道中其他用户无法感知该用户的出席状态。
该版本新增 onLinkStateEvent
回调,用于替代废弃的 onConnectionStateChanged
回调,以便更好地管理连接状态。详见连接管理。
该版本改进了 Presence 功能的 RTM_PRESENCE_EVENT_TYPE_REMOTE_STATE_CHANGED
事件的触发逻辑,即当用户一次设置或修改多个 key-value 时,频道内其他用户只会接收到一次事件通知。
该版本在如下数据结构中新增 timestamp
参数,报告触发事件通知的时间戳:
该版本优化了以下 API 的行为:
login
:- 在之前版本中,不支持连续多次调用该方法;也不支持在该方法的
token
参数中传入空字符串。 - 自 2.2.1 版本起,支持连续多次调用该方法,中间无需额外调用
logout
方法。此外,当token
参数为空字符串时,SDK 会默认使用你初始化时传入的 App ID 替代 Token。
- 在之前版本中,不支持连续多次调用该方法;也不支持在该方法的
subscribe
:- 在之前版本中,不支持连续多次调用该方法。
- 自 2.2.1 版本起,支持连续多次调用该方法。
join
:- 在之前版本中,不支持连续多次调用该方法,也不支持在该方法的
token
参数中传入空字符串。 - 自 2.2.1 版本起,支持连续多次调用该方法。此外,当
token
参数为空字符串时,SDK 会默认使用你初始化时传入的 App ID 替代 Token。
- 在之前版本中,不支持连续多次调用该方法,也不支持在该方法的
该版本将 RtmConfig
中 presenceTimeout
参数的取值范围由 [10,300] 修改为 [5,300]。
该版本还进行了如下改进。
- 优化了底层算法能力,提升了数据同步速度。
- 在以下方法中新增
requestId
参数: - 在
createStreamChannel
方法中新增errorCode
参数。
该版本修复了本地用户未调用 leave
方法直接调用 logout
方法时,偶现远端用户收不到 RTM_PRESENCE_EVENT_TYPE_REMOTE_LEAVE_CHANNEL
事件通知的问题。
2.1.12 版
该版本于 2024 年 6 月 7 日发布。
该版本进行了如下改进:
- 在因网络原因导致数据同步出错的情况下,该版本增加了用户退出机制,SDK 会自动登出 RTM 系统。
- 断网期间取消订阅,不再返回取消订阅失败的错误。
该版本修复了如下问题:
- 弱网条件下,断线期间用户取消订阅 Message Channel 出错。
- 弱网条件下,登录成功后,偶现无法收到回调。
- 断线重连情况下,偶现丢失
onStorageEvent
事件通知。 - 断线重连情况下,偶现无法恢复 Stream Channel 中的订阅关系。
- 偶现收不到 Web 端的 Topic 消息。
2.1.11 版
该版本于 2024 年 4 月 30 日发布。
该版本优化了使用 withPresence=true
订阅或加入频道时的响应机制。如果 5 秒内未收到 RTM_PRESENCE_EVENT_TYPE_SNAPSHOT
类型的 onPresenceEvent
事件通知,则 SDK 会触发 onJoinResult
回调并报告 RTM_ERROR_CHANNEL_PRESENCE_NOT_READY
错误码。
该版本修复了如下问题:
- 特定场景下,登出 RTM 系统后再次登录,然后使用
withPresence=true
订阅或加入频道时,偶现订阅或加入频道失败。 - 由网络问题导致连接断开并恢复的情况下,本地用户主动调用
leave
离开频道,偶现远端用户收不到RTM_PRESENCE_EVENT_TYPE_REMOTE_TIMEOUT
类型的onPresenceEvent
事件通知。 - 频繁调用
subscribe
和unsubscribe
方法,偶现调用失败。
2.1.10 版
该版本于 2024 年 2 月 26 日发布。
该版本修复了如下问题:
- 频繁发送消息时,偶现消息发送超时。
- 调用
renewToken
刷新 Token,因部分服务未能生效而导致非预期的连接断开。
2.1.9 版
该版本于 2024 年 1 月 10 日发布。
该版本优化了在断线重连时对过期用户状态数据的处理逻辑。
2.1.8 版
该版本于 2023 年 12 月 4 日发布。这是 RTM v2 C++ SDK 的第一个版本。
本次发布意味着声网实时通讯(RTM)产品步入 v2 时代,我们在功能覆盖、性能提升、体验优化上都将为用户带来革新。
-
功能覆盖:该版本通过引入频道(Channel)、消息(Message)、Topic、Presence、Storage 和 Lock 等功能模块,能覆盖更多业务场景,你可以把更多的精力集中在自己的业务创新上。
-
性能提升:我们在新版本中重构了后台架构,通过优化网络连接进一步提升性能,提供长时间低延迟、高可靠、大并发、易扩展的实时网络接入能力,让你无需为业务质量担忧。
-
体验优化:我们重新设计并简化了 API 接口;优化了包括用户指南、API 参考在内的所有文档,提供了更全面的示例程序,支持开发者低成本学习使用 SDK,快速完成集成,提高开发效率。
该版本提供的核心功能模块如下。
初始配置(Setup)是初始化生产 RTM Client 时预先定义或配置一些关键参数,影响其后续的行为。同时它还提供了登入、登出等功能。核心能力如下:
createAgoraRtmClient
:创建一个 RTM Client 实例。initialize
:进行如下初始配置:appId
:设置 App ID。相同 App ID 的 App 间可以通信,不同 App ID 的 App 相互隔离。userId
:设置用户 ID,用以区分用户或设备。areaCode
:设置区域代码,用于 Geo-fencing 功能。presenceTimeout
:设置 Presence 服务的超时时间。context
:- 对于 Android 操作系统,设置安卓活动上下文。
- 对于 Windows 操作系统,设置视窗句柄。如设值,则表示支持设备热插拔。
useStringUserId
:设置用户 ID 的数据类型,可以是 String 类型,也可以是 Uint 类型。eventHandler
:设置事件监听函数。logConfig
:配置本地日志大小、位置、输出信息等级等参数。proxyConfig
:配置 Proxy 服务参数。encryptionConfig
:配置端侧加密参数。
- 事件监听:实现
onMessageEvent
、onPresenceEvent
、onTopicEvent
、onStorageEvent
、onLockEvent
、onConnectionStateChange
、onTokenPrivilegeWillExpire
等事件通知的业务逻辑。 login
:登录 RTM 服务。logout
:登出 RTM 服务。release
:销毁 RTM Client 实例,释放资源。
频道是 RTM 实时网络中一种数据传输的管理机制,任何订阅或加入频道的用户都可以在 100 毫秒内接收到频道中传输的消息和事件,RTM 允许客户端订阅数百甚至数千个频道。大多数 RTM API 都将以频道为基础进行发送、接收、加密等行为。
基于声网的能力,RTM 的频道分成两种类型:Message Channel 和 Stream Channel。两种类型频道的核心能力如下:
-
Message Channel:
subscribe
:订阅指定 Message Channel 并开始接收频道中的消息和事件通知。unsubscribe
:取消订阅指定 Message Channel 并停止接收频道中的消息和事件通知。
-
Stream Channel:
createStreamChannel
:创建 Stream Channel 实例,随后可以调用其中的方法。join
:加入 Stream Channel,并开始接收频道中的消息和事件通知。leave
:离开 Stream Channel,并停止接收频道中的消息和事件通知。release
:销毁 Stream Channel 实例以释放资源。
其中:
subscribe
、unsubscribe
、join
、leave
方法都会触发onPresenceEvent
事件通知。频道中的其他用户会收到对应的RTM_PRESENCE_EVENT_TYPE_REMOTE_JOIN_CHANNEL
、RTM_PRESENCE_EVENT_TYPE_REMOTE_LEAVE_CHANNEL
事件通知。- 调用
subscribe
和join
操作订阅或加入频道的时候,可以选择是否配置withMessage
、withPresence
、withMetadata
、withLock
等参数以开启对应事件通知的监听功能。如果开启,你同时也需要注册对应事件监听,才能顺利收到对应事件通知。
RTM 的基础是发送消息的能力,你可以随时随地向频道中发送消息,消息会在 100 毫秒内传递到任何地方。RTM 支持 String 类型和 Byte 类型的消息负载。
publish
向指定的 Message Channel 中发送消息。调用 publish
会触发 onMessageEvent
事件通知,如果想要收到频道中的消息,你需要在 subscribe
的时候,设置 withMessage = true
,注册并实现 onMessageEvent
事件。
Topic 是 Stream Channel 中的数据流管理机制。你可以在 Stream Channel 中利用此特性进行数据流的订阅、分发、事件通知等,灵活使用 Topic 能力,能大大降低业务复杂度,提升开发效率。Topic 的主要功能如下:
joinTopic
:注册成为此 Topic 的消息发布者(publisher)。注册后,该用户会具备发送消息的能力。publishTopicMessage
:向 Stream Channel 中的 Topic 发送消息。leaveTopic
: 取消注册为该 Topic 的消息发布者。subscribeTopic
:订阅该频道中 Topic 的一名或多名消息发布者。unsubscribeTopic
:取消订阅该 Topic 或取消订阅该 Topic 中指定的一名或多名消息发布者。
注册(joinTopic
)或取消注册(leaveTopic
)消息发布者操作,会触发 onTopicEvent
事件通知,频道中的其他用户将会收到此事件通知。
Topic 特性只在 Stream Channel 中有效,Message Channel 中不存在此特性。
Presence 提供监控用户在线状态及临时状态变化的能力。通过 Presence 功能,你可以实时获取以下信息:
- 用户加入或离开频道的实时状态
- 订阅或加入同一频道的所有用户的实时状态
- 一个用户订阅或加入的所有频道的实时信息
- 自定义临时用户状态及其变更信息
在 Message Channel 和 Stream Channel 中均可使用以下 Presence 功能:
whoNow
:实时获取指定频道的在线用户数量、在线用户列表、在线用户的临时状态等信息。whereNow
:实时获取指定用户所在频道的列表。setState
:设置用户在指定频道的临时状态。getState
:获取用户在指定频道的临时状态。removeState
:删除用户在特定频道的临时状态。
Presence 在提供上述功能的同时,也提供了 onPresenceEvent
事件通知能力。频道中用户的加入、离开、掉线、用户状态设置、用户状态删除等事件都会以实时通知(Announce Mode)或定时通知(Interval Mode)的方式通知到频道中的其他用户。Presence 能力将大大简化开发者业务中关于在线用户上下线、状态变更等状态的同步逻辑实现,充分利用此特性将使得你的业务实现更稳定、实时、可靠。
RTM 的 Storage 功能提供了一套动态数据库机制,可以让开发者动态设置、存储、更新、删除 Channel Metadata 和 User Metadata 等数据,并监听由 Channel Metadata 或 User Metadata 变更而产生的事件通知。调用 createMetadata
创建 Metadata
后,你可以根据实际需求对 Channel Metadata 和 User Metadata 进行操作。
Channel Metadata
setChannelMetadata
:为指定频道设置 Channel Metadata 或 Channel Metadata Item。getChannelMetadata
:获取指定频道的 Channel Metadata 和 Channel Metadata Item。removeChannelMetadata
:删除指定频道的 Channel Metadata 或 Channel Metadata Item。updateChannelMetadata
:更新指定频道已有 Channel Metadata 或 Channel Metadata Item。
Channel Metadata 的设置、删除和更新都会触发 onStorageEvent
事件通知,合理使用此特性可以极大的优化业务逻辑,获得优异的用户体验。当前 onStorageEvent
事件通知中携带的是当前 Channel Metadata 的全量信息,我们将在后续版本中优化,提供性能更优的增量更新能力。
Channel Metadata 同时也引入了 Lock 的控制能力,当调用 API 设置、删除、更新 Channel Metadata 时,如果参数中的 lockName
被设置,则开启 Lock 的校验,此时只有拥有此锁的用户才被允许成功调用对应的方法。
User Metadata
setUserMetadata
:设置指定用户的 User Metadata 或 User Metadata Item。getUserMetadata
:获取指定用户的 User Metadata 和 User Metadata Item。removeUserMetadata
:删除指定用户的 User Metadata 或 User Metadata Item。updateUserMetadata
:更新指定用户已存在的 User Metadata 或 User Metadata Item。subscribeUserMetadata
:订阅指定用户的 User Metadata 或 User Metadata Item 变更事件通知。unsubscribeUserMetadata
:取消订阅指定用户的 User Metadata 或 User Metadata Item 事件通知。
User Metadata 的设置、删除和更新都会触发 onStorageEvent
事件通知,所有订阅此 User Metadata 的其他用户将会收到事件通知,合理使用此特性可以极大的优化业务逻辑,获得优异的用户体验。当前 onStorageEvent
事件通知中携带的是所订阅 User Metadata 的全量信息,我们将在后续的版本中优化,提供性能更优的增量更新能力。
CAS 控制
Channel Metadata 和 User Metadata 都引进了版本控制逻辑 CAS(Compare And Set),该方法提供两种独立的版本控制字段,你可以根据实际业务场景设置任意一种或多种:
- 通过
Metadata
中的setMajorRevision
方法设置revision
属性开启整组 Channel Metadata 的版本号校验。 - 通过
MetadataItem
中的revision
属性开启某个 Metadata Item 的版本号校验。
设置、删除、更新 Channel Metadata 或 User Metadata 时,配合 revision
参数可以控制本次调用是否开启 Revision 校验,逻辑如下:
revision
为-1
时,本次调用不开启 CAS 验证。如果 Metadata 或 Metadata Item 已存在,则该 Metadata 或 Metadata Item 会被最新值覆盖;如果 Metadata 或 Metadata Item 不存在,则会创建对应的 Metadata 或 Metadata Item。revision
为 Uint64 正整数时,本次调用开启 CAS 验证。如果 Metadata 或 Metadata Item 已存在,则 SDK 会在版本号验证成功后更新对应的值;如果 Metadata 或 Metadata Item 不存在,则 SDK 会返回错误码。
临界资源一次只能供一个进程使用,如果不同的进程之间共享了某个临界资源,则各进程需要采取互斥的方式来防止彼此干扰。RTM 提供一整套 Lock 的方案,通过控制分布式系统的不同进程,你可以解决用户在访问共享资源时的竞争问题。Lock 为你提供了以下能力:
setLock
:为指定频道设置锁。acquireLock
:获取指定频道中指定的锁。releaseLock
: 释放指定频道中指定的锁。revokeLock
: 撤销指定频道中某个用户对此锁的占用权限以释放此锁。getLocks
: 获取指定频道中所有锁的详情。removeLock
:删除指定频道中指定的锁。
频道中锁的设置、获取、释放、撤销和删除操作都会上报对应的 onLockEvent
事件通知。你可以充分利用此特性优化业务的实现逻辑。