本文档适用于开发以下平台的应用:iOS、Android、macOS、Windows、Web。
ZIM SDK 提供多人房间聊天功能,支持用户向房间内发送文本消息或自定义消息,实现了多人在线交流、同步分享。
多人房间聊天功能可应用于小班课或者会议室等场景,房间成员数量上限请参考 计费说明。
在实现“房间管理”功能之前,请确保:
用户可以通过以下两种方式,创建房间并进入房间。
房间内的用户,可以通过 sendRoomMessage 接口,向房间内发送消息,详情请参考 收发房间消息。
如果 roomID 已存在:
如果 roomID 不存在:
以下流程中,我们以客户端 A 创建并加入房间,客户端 B 加入房间为例。
所有进入房间的用户,都需注册 onRoomMemberJoined、onRoomMemberLeft 和 onRoomStateChanged 回调,用于监听房间其他成员的变动和接收房间连接状态发生改变的事件通知。
注册 onRoomMemberJoined 回调示例源码:
ZIMEventHandler.onRoomMemberJoined = (ZIM zim, List<ZIMUserInfo> memberList, String roomID){
};
注册 onRoomMemberLeft 回调示例源码:
ZIMEventHandler.onRoomMemberLeft = (ZIM zim, List<ZIMUserInfo> memberList, String roomID) {
};
注册 onRoomStateChanged 回调示例源码:
ZIMEventHandler.onRoomStateChanged = (ZIM zim, ZIMRoomState state, ZIMRoomEvent event,
Map extendedData, String roomID){
};
客户端 A 登录后,创建一个房间,可以调用 createRoom 接口,传入 ZIMRoomInfo 信息,即可创建并加入房间。同时可以通过错误码 ZIMErrorCode
的参数值,判断是否创建成功。相关错误码请查看 常见错误码。
创建成功后会收到 onRoomStateChanged 的通知回调,ZIMRoomState 为 connected,ZIMRoomEvent 为 success。
// 设置房间配置参数
// roomID 最大 32 字节的字符串。仅支持数字,英文字符 和 '!', '#', '$', '%', '&', '(', ')', '+', '-', ':', ';', '<', '=', '.', '>', '?', '@', '[', ']', '^', '_', '{', '}', '|', '~'。
// roomName 最大 64 字节的字符串,无特殊字符限制。
ZIMRoomInfo roomInfo = ZIMRoomInfo();
roomInfo.roomID = 'roomID';
roomInfo.roomName = 'roomName';
//创建房间
ZIM
.getInstance()
!.createRoom(roomInfo)
.then((value) => {
//创建成功触发此处
})
.catchError((onError) {
//创建失败触发此处
});
客户端 B 加入房间,可以调用 joinRoom 接口,传入由 A 创建的房间 roomID,即可加入房间。同时可以根据错误码 ZIMErrorCode
的参数值,判断用户是否加入成功。相关错误码请查看 常见错误码。
加入成功后会收到 onRoomStateChanged 的通知回调,ZIMRoomState 为 connected,ZIMRoomEvent 为 success。
ZIM
.getInstance()
!.joinRoom('roomID')
.then((value) => {
//加入房间成功触发此处
})
.catchError((onError) {
//加入房间失败触发此处
});
当房间有其他成员加入时,可以使用回调接口 onRoomMemberJoined 方法,实现对其他房间成员加入的监听。
例如,当客户端 B 加入由 A 创建的房间时,A 将收到房间内成员变动的通知。
ZIMEventHandler.onRoomMemberJoined = (zim, memberList, roomID) {
//这里写房间成员加入后的自定义代码
};
以下流程中,我们以客户端 X 创建并进入房间,客户端 Y 直接进入房间为例。
// 设置房间配置参数
ZIMRoomInfo roomInfo = ZIMRoomInfo();
roomInfo.roomID = 'roomID';
roomInfo.roomName = 'roomName';
ZIMRoomAdvancedConfig advancedConfig = ZIMRoomAdvancedConfig();
//创建房间
ZIM.getInstance()!.enterRoom(roomInfo, advancedConfig).then((value) => {
// enter 成功触发此处
}).catchError((onError){
// enter 失败触发此处
});
如果用户想要从一个房间切换至另一个房间,可以调用 switchRoom 接口,传入原房间的 ID(fromRoomID
)以及目标房间信息(toRoomInfo
,含房间 ID 和房间名称),即可切换房间。
然而,可能因目标房间不存在而导致房间切换失败。如需避免这种失败,也可以在调用 switchRoom 接口时,传入 isCreateWhenRoomNotExisted
为 true
(允许 ZIM 在房间不存在时创建新房间)和 config(用于配置新房间)。如此,当 ZIM 判断目标房间不存在时,就会根据 toRoomInfo
和 config
(如有)创建新房间用于切换。
房间切换成功后,原房间内的其他用户可通过回调接口 onRoomMemberLeft,得知有用户离开房间;目标房间内的其他用户可通过回调接口 onRoomMemberJoined,得知有用户进入了房间。
完整流程请参考下图:
示例代码:
String fromRoomID = 'fromRoomID';
ZIMRoomInfo toRoomInfo = ZIMRoomInfo();
toRoomInfo.roomID = 'toRoomID';
toRoomInfo.roomName = 'toRoomName';
// 如果房间不存在时,是否创建房间。
// 只有此为 true 且切换到的房间不存在时,toRoomInfo 中的 toRoomName 以及 config 才有意义
bool isCreateWhenRoomNotExisted = true;
// 进阶配置,用于创建房间
ZIMRoomAdvancedConfig config = ZIMRoomAdvancedConfig();
config.roomAttributes['key1'] = 'value1';
config.roomDestroyDelayTime = 90;
try{
ZIMRoomSwitchedResult? result = await ZIM.getInstance()?.switchRoom(fromRoomID, toRoomInfo, isCreateWhenRoomNotExisted, config);
// 切换房间成功,可以从 result.roomInfo 中获取切换后房间的信息
} on PlatformException catch (onError){
onError.code; //切换房间失败的错误码
onError.message; //切换房间失败的错误信息
}
用户如果想要离开房间,可以调用 leaveRoom 接口,传入房间的 roomID,即可退出此房间;房间内的其他用户可以通过回调接口 onRoomMemberLeft,收到成员变动通知。
离开房间成功后会收到 onRoomStateChanged 的通知回调,ZIMRoomState 为 disconnected,ZIMRoomEvent 为 success。
离开房间后,将不能收到房间内的消息。
ZIM
.getInstance()
!.leaveRoom('roomID')
.then((value) => {
//离开成功触发此处
})
.catchError((onError) {
//离开失败触发此处
});
ZIMEventHandler.onRoomMemberLeft = (zim, memberList, roomID) {
//这里写房间成员离开后的自定义代码
};
当所有成员离开房间后,房间将自动销毁。ZIM SDK 支持通过 ZIMRoomAdvancedConfig 设置房间延迟销毁,最大延迟为 3 小时。
调用 leaveAllRoom 接口,即可立即离开当前加入的所有房间,并返回离开的房间列表。如果用户多端登录,则用户在一端调用此接口后,仅会退出在该端上加入的房间,在其他端加入的房间不受影响。
try{
ZIMRoomAllLeftResult result = await ZIM.getInstance()!.leaveAllRoom();
result.roomIDs; // 离开的房间列表
} on PlatformException catch (onError) {
onError.code;
onError.message;
}
房间内的其他用户可以通过 onRoomMemberLeft,收到成员变动通知。
退出所有房间成功后,用户会根据所离开房间的数量,多次收到 onRoomStateChanged 的通知回调,ZIMRoomState 为 disconnected,ZIMRoomEvent 为 success。
离开房间后,将不能收到房间内的消息。
开发者可以在后台调用 ZIM 服务端接口进行 销毁房间。房间被销毁后,用户通过 onRoomStateChanged 收到房间状态(ZIMRoomState)从 connected
转变为 disconnected
的事件通知。根据 ZIM SDK 版本不同,回调中描述导致房间连接状态发生变更的事件(ZIMRoomEvent)如下所示:
kickedOut
。roomNotExist
。ZIM 房间类似于在线聊天室、网络中断会导致房间进入重连状态并抛出 onRoomStateChanged。详情请参考 场景 4 :ZIM 房间断网。
联系我们
文档反馈