发版说明
本文提供 RTM 2.x SDK 的发版说明。
2.1.6 版
该版本于 2023 年 9 月 19 日发布。
该版本对部分功能的实现方式进行了优化,请在升级到该版本后更新 App 代码。
为提醒用户在初始化时设置必填参数,该版本新增如下方法:
- 在
AgoraRtmMetadata
中新增init
方法,禁止用户不填参数就初始化。 - 在
AgoraRtmProxyConfig
中新增init
和initWithServer
方法,要求用户在初始化时填写server
、port
和proxyType
参数。 - 在
AgoraRtmClientConfig
中新增init
和initWithAppId
方法,要求用户在初始化时填写appId
和userId
参数。
该版本对 AgoraRtmJoinChannelOption
和 AgoraRtmSubscribeOptions
类进行了如下修改:
- 在
AgoraRtmJoinChannelOption
中删除了withMetadata
、withPresence
和withLock
参数,并新增features
参数替代。根据需要,你可以在features
参数中设置一种或多种事件通知。 - 在
AgoraRtmSubscribeOptions
中删除了withMessage
、withMetadata
、withPresence
和withLock
参数,并新增features
参数替代。根据需要,你可以在features
参数中设置一种或多种事件通知。
此外,该版本提升了在 AgoraRtmJoinChannelOption
中设置 Presence 事件通知的性能。
该版本修改了如下回调的名称:
v2.1.6 之前 | v2.1.6 |
---|---|
onMessageEvent | didReceiveMessageEvent |
onPresenceEvent | didReceivePresenceEvent |
onLockEvent | didReceiveLockEvent |
onStorageEvent | didReceiveStorageEvent |
onTopicEvent | didReceiveTopicEvent |
onTokenPrivilegeWillExpire | tokenPrivilegeWillExpire |
connectionStateChanged | connectionChangedToState |
此外,该版本还将 removeState
方法的 items
参数更名为 keys
,将 areaCode
参数类型由 unsigned int
修改为 AgoraRtmAreaCode
。
该版本新增 addDelegate
和 removeDelegate
方法。除了在初始化时添加或删除事件监听外,你还可以调用新增方法在 App 生命周期的任意时间添加、删除一个或多个事件监听对象。
该版本新增 publish
和 publishTopicMessage
方法的同名方法,并修改了原方法中 message
参数的类型。详情如下:
// v2.1.6 之前
// message 参数类型为 NSObject,支持传入字符串和二进制消息
- (void) publish: (NSString* _Nonnull)channelName
message: (NSObject* _Nonnull)message
withOption: (AgoraRtmPublishOptions* _Nullable)publishOption
completion: (AgoraRtmOperationBlock _Nullable)completionBlock;
- (void) publishTopicMessage: (NSObject * _Nonnull) message
inTopic: (NSString * _Nonnull) topic
withOption:(AgoraRtmPublishOptions * _Nullable) options
completion: (AgoraRtmOperationBlock _Nullable)completionBlock;
// v2.1.6
// message 参数分为 NSString 和 NSData 类型
// NSString 类型仅支持传入字符串数据
// NSData 类型仅支持传入二进制数据
// publish[1/2]
- (void) publish:(NSString* _Nonnull)channelName
message:(NSString* _Nonnull)message
option:(AgoraRtmPublishOptions* _Nullable)publishOption
completion:(AgoraRtmOperationBlock _Nullable)completionBlock
// publish[2/2]
- (void) publish:(NSString* _Nonnull)channelName
data:(NSData* _Nonnull)data
option:(AgoraRtmPublishOptions* _Nullable)publishOption
completion:(AgoraRtmOperationBlock _Nullable)completionBlock
// publishTopicMessage[1/2]
- (void) publishTopicMessage:(NSString * _Nonnull)topic
message:(NSString * _Nonnull)message
option:(AgoraRtmPublishOptions * _Nullable)options
completion:(AgoraRtmOperationBlock _Nullable)completionBlock
// publishTopicMessage[2/2]
- (void) publishTopicMessage:(NSString * _Nonnull)topic
data:(NSData * _Nonnull)data
option:(AgoraRtmPublishOptions * _Nullable)options
completion:(AgoraRtmOperationBlock _Nullable)completionBlock
该方法在 AgoraRtmMessage
类中删除了 getData
方法、getType
方法和 AgoraRtmMessageType
类,新增了 rawData
和 stringData
属性,分别用于接收二进制消息和字符串消息。
该版本优化了各方法中 completionBlock
回调函数返回的信息:
- 如果方法调用成功,则会在
response
参数中返回对应数据,在errorInfo
参数中返回nil
。 - 如果方法调用失败,则会在
response
参数中返回nil
,在errorInfo
参数中返回错误信息。
此外,该版本在 initWithConfig
和 createStreamChannel
方法中新增 error
参数,用于输出方法调用失败的错误描述,方便排查问题。
该版本修复了如下问题:
- 当网络状态发生变化时,偶现无法登出 RTM 系统。
- 登出 RTM 系统后,当网络状态发生变化时,偶现无法登录 RTM 系统。
- 网络断开后,因数据未清理导致偶现用户无法收到
Snapshot
事件通知。 - 用户加入频道后,把 App 切到后台再切换回前台时,偶现 SDK 多次触发
REMOTE_JOIN
事件通知。
2.1.4 版
该版本于 2023 年 8 月 16 日发布。这是 RTM 2.x Objective-C SDK 的第一个版本。
本次发布意味着声网实时通讯(RTM)产品步入 2.x 时代,我们在功能覆盖、性能提升、体验优化上都将为用户带来革新。
-
功能覆盖:该版本通过引入频道(Channel)、消息(Message)、Topic、Presence、Storage 和 Lock 等功能模块,能覆盖更多业务场景,你可以把更多的精力集中在自己的业务创新上。
-
性能提升:我们在新版本中重构了后台架构,通过优化网络连接进一步提升性能,提供长时间低延迟、高可靠、大并发、易扩展的实时网络接入能力,让你无需为业务质量担忧。
-
体验优化:我们重新设计并简化了 API 接口;优化了包括用户指南、API 参考在内的所有文档,提供了更全面的示例程序,支持开发者低成本学习使用 SDK,快速完成集成,提高开发效率。
该版本提供的核心功能模块如下。
RTM 2.1.4 目前处于 Public Beta 阶段,某些功能细节可能会在随后的版本中发生改变,以提升用户体验。
初始配置(Setup)是初始化生产 RTM Client 时预先定义或配置一些关键参数,影响其后续的行为。同时它还提供了登入、登出等功能。核心能力如下:
initWithConfig
:创建一个 RTM Client 实例,并进行如下初始配置:appId
:设置 App ID。相同 App ID 的 app 间可以通信,不同 App ID 的 app 相互隔离。userId
:设置用户 ID,用以区分用户或设备。areaCode
:设置区域代码,用于 Geo-fencing 功能。presenceTimeout
:设置 Presence 服务的超时时间。useStringUserId
:设置用户 ID 的数据类型,可以是 String 类型,也可以是 Uint 类型。logConfig
:配置本地日志大小、位置、输出信息等级等参数。proxyConfig
:配置 Proxy 服务参数。encryptionConfig
:配置端侧加密参数。
- 事件监听:实现
onMessageEvent
、onPresenceEvent
、onTopicEvent
、onStorageEvent
、onLockEvent
、connectionStateChanged
、onTokenPrivilegeWillExpire
等事件通知的业务逻辑。 loginByToken
:登录 RTM 服务。logout
:登出 RTM 服务。destroy
:销毁 RTM Client 实例,释放资源。
频道是 RTM 实时网络中一种数据传输的管理机制,任何订阅或加入频道的用户都可以在 100 毫秒内接收到频道中传输的消息和事件,RTM 允许客户端订阅数百甚至数千个频道。大多数 RTM API 都将以频道为基础进行发送、接收、加密等行为。
基于声网的能力,RTM 的频道分成两种类型:Message Channel 和 Stream Channel。两种类型频道的核心能力如下:
-
Message Channel:
subscribeWithChannel
:订阅指定 Message Channel 并开始接收频道中的消息和事件通知。unsubscribeWithChannel
:取消订阅指定 Message Channel 并停止接收频道中的消息和事件通知。
-
Stream Channel:
createStreamChannel
:创建 Stream Channel 实例,随后可以调用其中的方法。joinWithOption
:加入 Stream Channel,并开始接收频道中的消息和事件通知。leave
:离开 Stream Channel,并停止接收频道中的消息和事件通知。destroy
:销毁 Stream Channel 实例以释放资源。
其中:
subscribeWithChannel
、unsubscribeWithChannel
、joinWithOption
、leave
方法都会触发onPresenceEvent
事件通知。频道中的其他用户会收到对应的Join
、Leave
事件通知。- 调用
subscribeWithChannel
和joinWithOption
操作订阅或加入频道的时候,可以选择是否配置withMessage
、withPresence
、withMetadata
、withLock
等参数以开启对应事件通知的监听功能。如果开启,你同时也需要注册对应事件监听,才能顺利收到对应事件通知。
RTM 的基础是发送消息的能力,你可以随时随地向频道中发送消息,消息会在 100 毫秒内传递到任何地方。RTM 支持 String 类型和 Byte 类型的消息负载。
publish
向指定的 Message Channel 中发送消息。调用 publish
会触发 onMessageEvent
事件通知,如果想要收到频道中的消息,你需要在 subscribeWithChannel
的时候,设置 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 时,如果参数中的 lock
被设置,则开启 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),该方法提供两种独立的版本控制字段,你可以根据实际业务场景设置任意一种或多种:
- 通过
AgoraRtmMetadata
中的setMajorRevision
方法设置majorRevision
属性开启整组 Channel Metadata 的版本号校验。 - 通过
AgoraRtmMetadataItem
中的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
事件通知。你可以充分利用此特性优化业务的实现逻辑。