发版说明
本文提供 RTM v2 SDK 的发版说明。
自 2.2.0 起,RTM SDK 和 RTC SDK(4.3.0 及以上版本)都包含 libaosl.so
库。如果你同时使用了 RTM 和 RTC SDK,为避免冲突,需进行如下操作:
- 如果你通过 CDN 手动集成 SDK,请手动删除更低版本的
libaosl.so
库; - 如果你使用依赖管理工具(如 Maven 或 CocoaPods) 集成 SDK,请确保在项目中引入更高版本的
libaosl.so
库。
具体的集成指南可以参考如何处理同时集成 RTM SDK 和 RTC SDK 遇到的问题?
- 2.2.2 RTM SDK
libaosl.so
库版本为 1.0.11。 - 2.2.1 RTM SDK
libaosl.so
库版本为 1.0.11。 - 2.2.0 RTM SDK
libaosl.so
库版本为 1.0.0.17。
2.2.2 版
该版本于 2024 年 11 月 6 日发布。
该版本修定了 Presence 事件中 SNAPSHOT
事件的触发时机。现在,只要用户在频道内,就可能会再次收到 SNAPSHOT
事件;收到后,用户可以更新自己的全量信息,来避免因异常导致的状态不同步问题。
该版本修改了锁(Lock)过期时间的计算规则。该版本起,锁的过期时间将从服务端判定用户离线开始计算。
该版本在 PublishOptions
中新增了 storeInHistory
属性,支持在频道中发送消息的同时,将消息存储到云端,后续用户可以通过历史消息接口获取。
该功能目前处于 Public Beta 阶段。如需使用,需要前往控制台开启。
该版本在 SDK 连接状态 LinkStateEvent
中添加 RtmLinkStateChangeReason
枚举类,报告连接状态变更的原因。
自 Android 15 起,系统新增了对 16 KB 内存页大小的支持,详见支持 16 KB 的页面大小。为了保证 App 的稳定性和性能表现,自该版本起,SDK 支持 16 KB 内存页大小,确保可以在使用 4 KB 和 16 KB 内存页大小的设备上无缝运行,提升兼容性并避免崩溃。
该版本提升了基础消息服务在服务异常时的业务表现,避免因部分服务出现异常,导致的消息服务不可用的问题。
该版本修复了如下问题:
- 某些场景下,Token 类型不正确导致异常错误。
- 某些场景下,用户可能多次收到相同离线用户的离线通知。
- 相同 UID 在不同端登录后,可能出现连接状态异常。
- 频繁设置 Presence 状态时,可能导致数据异常。
- 未开通指定服务时,加入频道时未返回错误。
- 某些场景下,异常属性值可能导致崩溃问题。
2.2.1 版
该版本于 2024 年 7 月 17 日发布。
该版本进行了如下改进:
- 优化了底层算法能力,提升了数据同步速度。
- 在
LinkStateEvent
中,将 Token 过期时返回的reason
字段由TicketExpired
改为TokenExpired
。
该版本修复了本地用户未调用 leave
方法直接调用 logout
方法时,偶现远端用户收不到 REMOTE_LEAVE
事件通知的问题。
2.2.0 版
该版本于 2024 年 4 月 23 日发布。
该版本对以下功能的实现方式进行了优化,涉及一些 API 的改名、删除或行为变更,为确保项目的正常运行,你需要在升级到该版本后更新 App 中的代码:
-
删除了
createMetadata
方法。参考如下示例代码修改你的实现代码:Java// v2.2.0 之前
Metadata metadata = rtmClient.getStorage().createMetadata();Java// v2.2.0
Metadata metadata = new Metadata(); -
取消了
StateItem
类,并将如下参数由ArrayList<StateItem>
类型变为HashMap<String, String>
类型,参考对应 API 文档修改你的实现代码。setState
中的items
参数。PresenceEvent
中的stateItems
参数。UserState
中的states
参数。
-
在
RtmConnectionChangeReason
中新增了CERTIFICATION_VERIFY_FAILURE(22)
枚举,并将STREAM_CHANNEL_NOT_AVAILABLE
和INCONSISTENT_APPID
枚举对应的值修改为 23 和 24。
该版本在 RtmConfig
中新增 privateConfig
参数,用于实现私有化部署功能。详见私有化配置。
该版本在 RtmConfig
中新增 heartbeatInterval
参数,用于配置 SDK 向 RTM 服务器发送心跳包的时间间隔。详见 Heartbeat Interval 与 Presence Timeout。
该版本在 RtmConfig
中新增 protocolType
参数,用于自定义网络传输协议,以便于更好地适配你的网络环境。详见连接协议配置。
该版本在 RtmChannelType
中新增 USER
类型,用于向指定用户发送消息。该功能可以替代 v1 的点对点消息功能。详见在 User Channel 中发送消息。
该版本在 SubscribeOptions
和 JoinChannelOptions
中新增 beQuiet
属性。该属性设置为 true
时表示静默订阅或加入频道,频道中其他用户无法感知该用户的出席状态。
该版本新增 onLinkStateEvent
回调,用于替代废弃的 onConnectionStateChanged
回调,以便更好地管理连接状态。详见连接管理。
该版本改进了 Presence 功能的 REMOTE_STATE_CHANGED
事件的触发逻辑,即当用户一次设置或修改多个 key-value 时,频道内其他用户只会接收到一次事件通知。
该版本在如下数据结构中新增 timestamp
参数,报告触发事件通知的时间戳:
该版本优化了以下 API 的行为:
login
:- 在之前版本中,不支持连续多次调用该方法;也不支持在该方法的
token
参数中传入空字符串。 - 自 2.2.0 版本起,支持连续多次调用该方法,中间无需额外调用
logout
方法。此外,当token
参数为空字符串时,SDK 会默认使用你初始化时传入的 App ID 替代 Token。
- 在之前版本中,不支持连续多次调用该方法;也不支持在该方法的
subscribe
:- 在之前版本中,不支持连续多次调用该方法。
- 自 2.2.0 版本起,支持连续多次调用该方法。
join
:- 在之前版本中,不支持连续多次调用该方法,也不支持在该方法的
token
参数中传入空字符串。 - 自 2.2.0 版本起,支持连续多次调用该方法。此外,当
token
参数为空字符串时,SDK 会默认使用你初始化时传入的 App ID 替代 Token。
- 在之前版本中,不支持连续多次调用该方法,也不支持在该方法的
该版本将 RtmConfig
中 presenceTimeout
参数的取值范围由 [10,300] 修改为 [5,300]。
2.1.12 版
该版本于 2024 年 6 月 7 日发布。
该版本进行了如下改进:
- 在因网络原因导致数据同步出错的情况下,该版本增加了用户退出机制,SDK 会自动登出 RTM 系统。
- 断网期间取消订阅,不再返回取消订阅失败的错误。
该版本修复了如下问题:
- 弱网条件下,断线期间用户取消订阅 Message Channel 出错。
- 弱网条件下,登录成功后,偶现无法收到回调。
- 断线重连情况下,偶现丢失
onStorageEvent
事件通知。 - 断线重连情况下,偶现无法恢复 Stream Channel 中的订阅关系。
- 偶现收不到 Web 端的 Topic 消息。
2.1.11 版
该版本于 2024 年 4 月 30 日发布。
该版本优化了使用 withPresence=true
订阅或加入频道时的响应机制。如果 5 秒内未收到 SNAPSHOT
类型的 onPresenceEvent
事件通知,则 SDK 会在 resultCallback
参数中报告 CHANNEL_PRESENCE_NOT_READY
错误码。
该版本修复了如下问题:
- 特定场景下,登出 RTM 系统后再次登录,然后使用
withPresence=true
订阅或加入频道时,偶现订阅或加入频道失败。 - 由网络问题导致连接断开并恢复的情况下,本地用户主动调用
leave
离开频道,偶现远端用户收不到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 日发布。
该版本对消息发送选项进行了如下优化,请在升级到该版本后更新 App 代码:
- 在
PublishOptions
中删除了sendTs
参数,并新增了channelType
参数。详见PublishOptions
。 - 将
publishTopicMessage
方法中的options
参数类型由PublishOptions
修改为TopicMessageOptions
。详见TopicMessageOptions
。
该版本新增了 INVALID_CHANNEL_TYPE
、RTM_ERROR_INVALID_ENCRYPTION_PARAMETER
和 RTM_ERROR_OPERATION_RATE_EXCEED_LIMITATION
错误码。错误码描述及解决方法见错误排查。
该版本修复了调用 whoNow
方法返回分页结果时偶现的崩溃问题。
2.1.7 版
该版本于 2023 年 10 月 20 日发布。
该版本优化了内存表现并修复了潜在的内存泄漏问题。
该版本修复了如下问题:
- 特定场景下,偶现 Presence 数据丢包。
- 特定场景下,方法调用后未触发异步回调。
- 使用端侧加密时,参数无效导致的崩溃。
2.1.6 版
该版本于 2023 年 9 月 19 日发布。
该版本对部分功能的实现方式进行了优化,请在升级到该版本后更新 App 代码。
为支持同时设置多个访问区域,该版本将 areaCode
参数类型由 RtmAreaCode
修改为 EnumSet<RtmAreaCode>
。你需要参考以下示例代码修改你的实现方式:
// v2.1.6 之前的方式
RtmConfig config = new RtmConfig();
config.code = RtmConstants.RtmAreaCode.GLOB;
// v2.1.6 的方式
RtmConfig config = new RtmConfig.Builder(myAppId, mUserId)
.eventListener(eventListener)
.areaCode(EnumSet.of(RtmConstants.RtmAreaCode.AS, RtmConstants.RtmAreaCode.CN))
.build();
该版本将 RtmConfig
的构造函数修改为 Builder 模式。修改示例如下:
// v2.1.6 之前的方式
RtmConfig config = new RtmConfig();
config.appId = myAppId;
config.userId = mUserId;
config.eventListener = eventListener;
config.logConfig = logConfig;
// v2.1.6 的方式
RtmConfig config = new RtmConfig.Builder(myAppId, mUserId)
.eventListener(eventListener)
.logConfig(logConfig)
.build();
该版本将 onConnectionStateChange
回调名称修改为 onConnectionStateChanged
。
该版本新增 addEventListener
和 removeEventListener
方法。除了在初始化时添加或删除事件监听外,你还可以调用新增方法在 App 生命周期的任意时间添加、删除一个或多个事件监听对象。
此外,为优化设置事件监听的体验,该版本不再需要强制实现 RtmEventListener
的所有事件,只需实现你关注的事件。示例代码如下:
RtmEventListener eventListener = new RtmEventListener() {
@Override
public void onMessageEvent(MessageEvent event) {
String text = "Message received from " + event.publisher + " Message: " + event.message.getData() + "\n";
writeToMessageHistory(text);
}
@Override
public void onPresenceEvent(PresenceEvent event) {
String text = "receive presence event, user: " + event.publisher + " event: " + event.type + "\n";
writeToMessageHistory(text);
}
@Override
public void onConnectionStateChanged(String mChannelName, RtmConstants.RtmConnectionState state, RtmConstants.RtmConnectionChangeReason reason) {
String text = "Connection state changed to " + state + ", Reason: " + reason + "\n";
writeToMessageHistory(text);
}
};
该版本为如下结构体新增构造函数:
JoinChannelOptions
JoinTopicOptions
MetadataItem
MetadataOptions
PresenceOptions
RtmEncryptionConfig
RtmLogConfig
RtmProxyConfig
StateItem
SubscribeOptions
TopicOptions
你可以继续使用之前的实现方式,也可以参考以下示例代码改用新的实现方式:
// v2.1.6 之前的方式
SubscribeOptions options = new SubscribeOptions();
options.withMessage = true;
options.withMetadata = false;
options.withPresence = true;
options.withLock = false;
// v2.1.6 的方式,任选一种方式即可
// 方式一:传参方式
SubscribeOptions options = new SubscribeOptions(true, true, false, false);
// 方式二:SET 方式
SubscribeOptions options = new SubscribeOptions();
options.setWithMessage(true);
options.setWithMetadata(false);
options.setWithPresence(true);
options.setWithLock(false);
该版本提升了在 JoinChannelOptions
中设置 Presence 事件通知的性能。
该版本修复了如下问题:
- 当网络状态发生变化时,偶现无法登出 RTM 系统。
- 登出 RTM 系统后,当网络状态发生变化时,偶现无法登录 RTM 系统。
- 网络断开后,因数据未清理导致偶现用户无法收到
SNAPSHOT
事件通知。 - 用户加入频道后,把 App 切到后台再切换回前台时,偶现 SDK 多次触发
REMOTE_JOIN
事件通知。
2.1.4 版
该版本于 2023 年 8 月 16 日发布。这是 RTM v2 Java SDK 的第一个版本。
本次发布意味着声网实时通讯(RTM)产品步入 v2 时代,我们在功能覆盖、性能提升、体验优化上都将为用户带来革新。
-
功能覆盖:该版本通过引入频道(Channel)、消息(Message)、Topic、Presence、Storage 和 Lock 等功能模块,能覆盖更多业务场景,你可以把更多的精力集中在自己的业务创新上。
-
性能提升:我们在新版本中重构了后台架构,通过优化网络连接进一步提升性能,提供长时间低延迟、高可靠、大并发、易扩展的实时网络接入能力,让你无需为业务质量担忧。
-
体验优化:我们重新设计并简化了 API 接口;优化了包括用户指南、API 参考在内的所有文档,提供了更全面的示例程序,支持开发者低成本学习使用 SDK,快速完成集成,提高开发效率。
该版本提供的核心功能模块如下。
RTM 2.1.4 目前处于 Public Beta 阶段,某些功能细节可能会在随后的版本中发生改变,以提升用户体验。
初始配置(Setup)是初始化生产 RTM Client 时预先定义或配置一些关键参数,影响其后续的行为。同时它还提供了登入、登出等功能。核心能力如下:
create
:创建一个 RTM Client 实例,并进行如下初始配置:appId
:设置 App ID。相同 App ID 的 App 间可以通信,不同 App ID 的 App 相互隔离。userId
:设置用户 ID,用以区分用户或设备。areaCode
:设置区域代码,用于 Geo-fencing 功能。presenceTimeout
:设置 Presence 服务的超时时间。useStringUserId
:设置用户 ID 的数据类型,可以是 String 类型,也可以是 Uint 类型。eventListener
:设置事件监听函数。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
事件通知。频道中的其他用户会收到对应的Join
、Leave
事件通知。- 调用
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 变更而产生的事件通知。
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
方法设置majorRevision
属性开启整组 Channel Metadata 的版本号校验。 - 通过
MetadataItem
中的revision
属性开启某个 Metadata Item 的版本号校验。
设置、删除、更新 Channel Metadata 或 User Metadata 时,配合 revision
参数可以控制本次调用是否开启 Revision 校验,逻辑如下:
majorRevision
或revision
为-1
时,本次调用不开启 CAS 验证。如果 Metadata 或 Metadata Item 已存在,则该 Metadata 或 Metadata Item 会被最新值覆盖;如果 Metadata 或 Metadata Item 不存在,则会创建对应的 Metadata 或 Metadata Item。majorRevision
或revision
为 Uint64 正整数时,本次调用开启 CAS 验证。如果 Metadata 或 Metadata Item 已存在,则 SDK 会在版本号验证成功后更新对应的值;如果 Metadata 或 Metadata Item 不存在,则 SDK 会返回错误码。
临界资源一次只能供一个进程使用,如果不同的进程之间共享了某个临界资源,则各进程需要采取互斥的方式来防止彼此干扰。RTM 提供一整套 Lock 的方案,通过控制分布式系统的不同进程,你可以解决用户在访问共享资源时的竞争问题。Lock 为你提供了以下能力:
setLock
:为指定频道设置锁。acquireLock
:获取指定频道中指定的锁。releaseLock
: 释放指定频道中指定的锁。revokeLock
: 撤销指定频道中某个用户对此锁的占用权限以释放此锁。getLocks
: 获取指定频道中所有锁的详情。removeLock
:删除指定频道中指定的锁。
频道中锁的设置、获取、释放、撤销和删除操作都会上报对应的 onLockEvent
事件通知。你可以充分利用此特性优化业务的实现逻辑。