聊天室相关
更新时间: 2025/05/28 10:16:30
聊天室和群组的区别
-
人数支持不同
聊天室支持的人数无上限。
高级群支持的人数上限默认为200人(开通 IM 套餐包可升级拓展,最多2000人),具体内容请点此查看。
2019年6月12日发布的6.5.5版本开始,支持最高5000人的超大群。 创建超大群的群人数级别设置为5000人,该应用只能创建超大群数量200个; 群人数级别设置为2000人,该应用可创建的超大群数量无上限。
**注意:**超大群功能目前只对专属云客户开放。 -
权限功能不同
聊天室的权限管理相对简单,默认可以自由进出(可以设置黑名单不允许进入)。
群组(高级群)可以设置丰富的邀请模式、被邀请模式、验证模式,具体内容请点此查看。 -
场景特性不同
聊天室偏重临时性质,成员多为游客,游客退出聊天室或异常断开后,就和该聊天室没有关系,不再接收聊天室相关信息。
群组偏重固定性质,断开连接后不会退出群组,下次登录会收到离线期间的消息,异常断开会触发消息推送。 -
常见场景举例
- 棋牌游戏:房间是临时性的,玩家可以自由进入和退出,应使用聊天室(也就是说,不是人数少就用群组,而要看场景特性)。
- 娱乐直播:观众人数众多,可以自由进入和退出,应使用聊天室。
- 企业办公:需要设置部门/团队权限,而且需要维护历史消息,应使用群组(高级群)。
收到聊天室消息时怎么获取用户资料 [注意1] 聊天室收到消息时,只能通过聊天室消息本身获取到发送者的账号,可以通过聊天室消息扩展获取到发送者的昵称和头像地址(关于昵称和头像的显示逻辑,请点此查看),其它资料需要通过账号accid再去查询获取。
[注意2] 关于收到点对点和群聊消息时怎么获取用户资料,请点此查看。
[注意3] 关于IM怎么接收消息,请点此查看。
[注意4] 关于怎么通过accid获取用户资料,请点此查看。 -
Windows (C)
-
Android
-
iOS
-
Web
-
- 调用接口
nim_chatroom_enter进入聊天室时,通过enter_info中的kNIMChatRoomEnterKeyNick设置聊天室昵称,通过kNIMChatRoomEnterKeyAvatar设置聊天室头像地址。 - 收到聊天室消息时,会通过回调函数
nim_chatroom_receive_msg_cb_func的result得到聊天室消息的json string,其中kNIMChatRoomMsgKeyFromAccount表示发送者的accid,kNIMChatRoomMsgKeyFromNick表示发送者的昵称,kNIMChatRoomMsgKeyFromAvatar表示发送者的头像地址。
- 调用接口
-
- 调用接口
enterChatRoomEx(EnterChatRoomData roomData, int retryCount)进入聊天室时,通过EnterChatRoomData的setNick方法设置聊天室昵称,通过setAvatar方法设置聊天室头像地址。 - 收到聊天室消息时,会得到
ChatRoomMessage的List,可以通过ChatRoomMessage对象的getFromAccount()方法获取发送者的accid。可以通过ChatRoomMessage对象的getChatRoomMessageExtension().getSenderNick()方法获取发送者的昵称,通过getChatRoomMessageExtension().getSenderAvatar()方法获取发送者的头像地址。
[注意] 对于聊天室通知消息(例如:成员进入聊天室、成员离开聊天室,等等),因为通知消息是系统发送的,无法通过上述方法获取到发送者昵称等信息。当通过ChatRoomMessage的getMsgType()方法获取到消息类型为MsgTypeEnum.notification时,通过ChatRoomMessage的getAttachment()方法获取消息附件对象,并将其强转为ChatRoomNotificationAttachment,可以通过其getOperator()方法获取操作者(例如进入聊天室的成员)的accid,通过其getOperatorNick()方法获取操作者昵称。
- 调用接口
-
- 通过
NIMChatroomManager的-enterChatroom:completion:方法进入聊天室时,通过NIMChatroomEnterRequest的roomNickname属性设置聊天室昵称,通过roomAvatar属性设置聊天室头像地址。 - 收到聊天室消息时,会得到
NIMMessage的NSArray,可以通过NIMMessage对象的from字段获取发送者的accid。可以通过NIMMessage对象的messageExt消息扩展字段(需要转换成NIMMessageChatroomExtension)的roomNickname属性获取发送者的昵称,通过roomAvatar属性获取发送者的头像地址。
- 通过
-
- 调用接口
Chatroom.getInstance初始化聊天室时,通过chatroomNick设置聊天室昵称,通过chatroomAvatar设置聊天室头像地址。 - 收到聊天室消息时,会得到
ChatroomMessage聊天室消息数组,其中from表示发送者accid,fromNick表示发送者昵称,fromAvatar表示发送者头像地址。
关于聊天室的注意事项
- 调用接口
-
聊天室的创建和关闭
- 聊天室只能通过服务端API创建,创建后需要开发者自行保存维护。
创建聊天室需要传入创建者账号accid,每个accid可以创建的聊天室上限数为200 (已关闭的不计;如需调整上限,请联系商务顾问)。
超过上限会返回错误提示,类似于:{"desc":"exceed chatroom count limit, current = 200, limit=200","code":419} - 可以通过服务端API切换聊天室的开启/关闭状态。
处于开启状态的聊天室,其中成员全部退出后,系统不会自动关闭聊天室,可以再重新进入。
聊天室关闭时,所有成员都会被踢出。关闭状态的聊天室无法进入。聊天室没有删除概念,只能关闭(而且只能通过服务端API关闭)。
聊天室关闭后可以重新开启,原有相关信息仍然存在(如:固定成员、未过期的禁言状态、保存期内的聊天记录,等)。
- 聊天室只能通过服务端API创建,创建后需要开发者自行保存维护。
-
聊天室的进入和退出
- 聊天室只允许用户通过SDK接口主动进入,无法进行邀请(如果需要邀请功能,可以通过开发者上层应用逻辑实现)。
- 一个用户最多同时进入10个不同的聊天室,每个聊天室建立不同的连接。如果超过10个连接,服务器会踢出最早建立的连接。
- 默认不支持一个用户多端进入同一个聊天室,后进入的客户端会将前一个踢掉。
[注意] 如需配置聊天室多端登录,请点此查看。 - 用户进入聊天室将建立新的连接,退出聊天室或者被踢会断开连接,在聊天室中掉线会有自动重连,开发者需要监听聊天室连接状态来做出正确的界面展示。
- 断开聊天室连接后,服务器不会再发送该聊天室的消息给该用户。
-
聊天室的人数
-
聊天室的消息记录
服务器只保存最近10天的聊天室消息记录。但是10天之前发送的文件(例如:图片、音频、视频等),其url链接地址仍然是有效的(不过开发者需要自行保存这些url,因为无法通过已过期的消息来查询这些文件url)。
[注意] 如需延长「聊天室历史消息天数」,请联系商务顾问咨询。 -
聊天室消息的优先级
- 发送聊天室消息,仅支持通过服务端API配置高优先级消息:「发送聊天室消息」
https://api.netease.im/nimserver/chatroom/sendMsg.action的highPriority参数。 - 如果消息的
highPriority和needHighPriorityMsgResend同时设置为true,那么除了消息发出时在线的聊天室用户会收到该消息,而且消息发出后的30秒内进入聊天室的用户也会收到该消息(包括30秒内退出并且重新进入聊天室的用户),这种设计的目的是为了确保重要消息到达用户(但是云信服务器仅保存最近30秒内最多1000条高优先级消息)。 - 如果消息的
highPriority设置为true但needHighPriorityMsgResend设置为false,则只会发给当时在线的聊天室用户。 - 如果
highPriority设置为false,则needHighPriorityMsgResend参数无效。
- 发送聊天室消息,仅支持通过服务端API配置高优先级消息:「发送聊天室消息」
-
聊天室的模式
聊天室分为独立模式和非独立模式:独立模式不依赖IM登录,非独立模式依赖IM登录。其中,独立模式又分为匿名模式和非匿名模式。匿名模式只能收消息,不能发消息(发消息会返回403)。
- 独立模式的非匿名模式,同一个账号同一天无论进入多少个聊天室,进入多少次,都只计算一个日活。
- 独立模式的匿名模式,每进入一次聊天室,就计算一个日活。
- 关于独立模式的使用方式,请点此查看。
关于聊天室成员
-
聊天室成员分类
聊天室成员包括固定成员和非固定成员(临时成员/游客)。
固定成员包括四种类型:创建者、管理员、普通用户、受限用户。
受限用户又包括:黑名单用户和永久禁言用户。 -
聊天室成员的注意事项
- 除了创建者,其他成员刚加入时,默认都是游客。
- 如果游客被设置为管理员,再被取消管理员,则变为普通用户(而不是游客)。
- 要将管理员变成普通用户,直接取消其管理员权限即可。不能直接将管理员设置为普通成员(可能会返回
{"desc": "target is MANGER, can't to COMMON operation!", "code": 403})。 - 只有创建者可以对管理员进行操作,管理员不能对创建者和其他管理员进行操作(可能会返回
{"desc": "only room creator can operate manager", "code": 403})。 - 普通用户被取消身份后变为游客。
- 游客被设置为黑名单用户后变为固定成员(同时会被服务器断开连接并且无法进入聊天室,除非被解除黑名单)。
解除黑名单后变为游客。 - 永久禁言后,身份变为固定成员。解除永久禁言后,身份变为游客。解除永久禁言后,不影响临时禁言的到期时间。
- 临时禁言的设置和解除不会改变成员的身份。如果重复设置临时禁言,则后一次设置会覆盖前一次设置的到期时间(不会累积)。
- 游客只有在线时才属于聊天室的非固定成员;游客进入聊天室又退出后,不属于聊天室的任何成员(和聊天室没有任何关系)。
-
聊天室成员type字段
关于IM服务端API聊天室相关接口返回data中的用户角色type字段,请点此查看。
怎么检查聊天室消息的接收方 [注意] 下面提到的是聊天室消息,如果要检查点对点或群聊消息的接收方,请点此查看。
-
Windows (C)
-
Android
-
iOS
-
Web
-
调用接口
nim_chatroom_send_msg (const int64_t room_id, const char *msg, const char *json_extension)发送聊天室消息时,确保room_id参数配置正确。 -
调用接口
NIMClient.getService(ChatRoomService.class).sendMessage(ChatRoomMessage msg, boolean resend)发送聊天室消息时,确保通过ChatRoomMessageBuilder接口创建的各种消息对象中,包含的roomId参数配置正确。 -
调用接口
[[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:&error]发送聊天室消息时,确保其中构造的会话对象NIMSession的会话类型sessionType为NIMSessionTypeChatroom,sessionId配置为正确的聊天室roomId。 -
通过
chatroom的各种send方法发送聊天室消息时,可以通过chatroom.getChatroom(options)方法获取聊天室信息,通过获取成功的回调函数来获取聊天室id。
怎么判断聊天室消息发送成功 [注意] 下面提到的是聊天室消息,如果要判断点对点或群聊消息发送成功,请点此查看。
-
Windows (C)
-
Android
-
iOS
-
Web
-
调用接口
nim_chatroom_send_msg发送聊天室消息时,发送消息状态通过进入聊天室前注册的全局回调nim_chatroom_reg_send_msg_ack_cb (const char *json_extension, nim_chatroom_sendmsg_arc_cb_func cb, const void *user_data)获取,回调函数typedef void(*nim_chatroom_sendmsg_arc_cb_func) (int64_t room_id, int error_code, const char *result, const char *json_extension, const void *user_data)中,error_code如果为kNIMResSuccess = 200表示发送成功。 -
调用接口
NIMClient.getService(ChatRoomService.class).sendMessage(ChatRoomMessage msg, boolean resend).setCallback(new RequestCallback<Void>() {})发送聊天室时,如果回调onSuccess表示发送成功。 -
调用接口
[[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:&error]发送聊天室消息时,判断error == nil表示方法调用成功;实现NIMChatManagerDelegate的–sendMessage:didCompleteWithError:方法,判断error == nil表示消息已经发送至服务器。 -
通过
chatroom的各种send方法发送聊天室消息时,可以通过设置的回调函数done: sendChatroomMsgDone中error参数获取发送结果,如果!error没有错误表示发送成功。
怎么判断账号是否在聊天室内
-
Windows (C)
-
Android
-
iOS
-
Web
-
调用接口
nim_chatroom_enter进入聊天室前,调用接口nim_chatroom_reg_enter_cb注册进入聊天室的全局回调,如果回调函数nim_chatroom_enter_cb_func的error_code为kNIMResSuccess = 200表示进入成功。- [注意1] 进入聊天室前,调用接口
nim_chatroom_reg_link_condition_cb注册聊天室连接状况的全局回调,如果回调函数nim_chatroom_link_condition_cb_func的NIMChatRoomLinkCondition为kNIMChatRoomLinkConditionDeadAndRetry = 1表示连接失败SDK尝试重连,kNIMChatRoomLinkConditionDead = 2表示连接失败需要开发者重新调用进入聊天室接口。 - [注意2] 进入聊天室前,调用接口
nim_chatroom_reg_exit_cb注册离开聊天室的全局回调,回调函数nim_chatroom_exit_cb_func中exit_type表示退出原因ChatRoomExitReason,其中kNIMChatRoomExitReasonRoomInvalid表示聊天室已经被解散,kNIMChatRoomExitReasonKickByManager表示被管理员踢出,kNIMChatRoomExitReasonKickByMultiSpot表示被其它端踢出,kNIMChatRoomExitReasonIllegalState表示连接状态异常,kNIMChatRoomExitReasonBeBlacklisted表示被加黑。
- [注意1] 进入聊天室前,调用接口
-
调用接口
NIMClient.getService(ChatRoomService.class).enterChatRoom(EnterChatRoomData roomData).setCallback(new Request<EnterChatRoomResultData>() { })进入聊天室时,如果回调onSuccess表示进入成功。
[注意] 需要调用接口NIMClient.getService(ChatRoomServiceObserver.class).observeOnlineStatus(Observer<ChatRoomStatusChangeData> observer, true)注册聊天室在线状态观察者,其中onEvent事件会回调ChatRoomStatusChangeData,其中包含roomId和status,例如KICK_BY_OTHER_CLIENT表示被同时在线的其他端主动踢掉,NET_BROKEN表示网络连接已断开,等。 -
调用接口
-enterChatroom:completion:进入聊天室时,如果回调NIMChatroomEnterHandler中的error == nil表示进入成功。- [注意1] 需要实现
NIMChatroomManagerDelegate中的-chatroom:connectionStateChanged:方法来监听聊天室连接状态变化,如果回调的NIMChatroomConnectionState为NIMChatroomConnectionStateLoseConnection = 3表示和聊天室失去连接。 - [注意2] 需要实现
NIMChatroomManagerDelegate中的-chatroom:beKicked:方法来监听聊天室被踢回调,其中NIMChatroomKickReason包含:聊天室已经解散、被聊天室管理员踢出、多端被踢、被拉黑等。
- [注意1] 需要实现
-
调用接口
Chatroom.getInstance初始化聊天室时,SDK会自动进入聊天室,如果回调onChatroomConnect表示进入成功。
[注意] 如果聊天室断开连接,会回调ondisconnect,其中包含错误信息对象,code字段表示断开原因,例如'kicked'表示被踢。关于聊天室在线人数
-
原理介绍
- 可以通过SDK「获取聊天室信息」接口来获取聊天室在线人数,但是由于该接口有频率控制,所以不能用来不停地实时获取。
- 每位聊天室成员进入和离开聊天室,网易服务器都会给SDK下发一条通知消息,因此建议开发者在进入聊天室的时候先调用「获取聊天室信息」的接口获取一次在线人数,之后根据成员进入和离开的「聊天室通知消息」去做在线人数的增减。然后每隔一定时间(例如10秒等)调用一次获取「聊天室信息接口」来校准当前在线人数,以保证在线人数的准确性。否则,如果遇到异常情况,例如由于网络异常导致SDK断线重连,期间部分成员进出的「聊天室通知消息」没有收到,则会造成在线人数不准确。
-
关于获取聊天室信息接口
各SDK「获取聊天室信息」接口如下。
-
Windows (C)
-
Android
-
iOS
-
Web
-
通过接口
nim_chatroom_get_info_async异步获取聊天室信息,回调函数nim_chatroom_get_info_cb_func的result为聊天室Info Json Keys,其中kNIMChatRoomInfoKeyOnlineCount表示当前聊天室在线人数。 -
调用
NIMClient.getService(ChatRoomService.class).fetchRoomInfo(roomId).setCallback(new RequestCallback<ChatRoomInfo>() {...}方法,回调的ChatRoomInfo通过getOnlineUserCount()方法可以获取当前聊天室在线人数。 -
调用
[[NIMSDK sharedSDK].chatroomManager fetchChatroomInfo:roomId completion:^(NSError *error, NIMChatroom *chatroom) {...}方法,回调的NIMChatroom中包含onlineUserCount属性,表示当前聊天室在线人数。 -
调用接口
chatroom.getChatroom({ done: getChatroomDone })获取聊天室信息,回调函数中会带有聊天室信息ChatroomInfo,其中onlineMemberNum属性表示当前聊天室在线人数。
-
-
关于聊天室用户进出的通知消息
请点此查看。
关于聊天室通知消息
-
Windows (C)
-
Android
-
iOS
-
Web
-
通过接口
nim_chatroom_reg_receive_notification_cb注册全局接收消息通知回调,回调函数nim_chatroom_receive_notification_cb_func的result为聊天室通知Keys,其中kChatRoomNotificationKeyID为通知类型ID,NIMChatRoomNotificationId中,例如kNIMChatRoomNotificationIdMemberIn = 301表示成员进入聊天室,kNIMChatRoomNotificationIdMemberExit = 302表示成员离开聊天室。 -
聊天室通知消息是聊天室消息
ChatRoomMessage的一种,当通过聊天室消息对象的getMsgType()方法获取到消息类型为notification时,通过其getAttachment()方法获取附件类型ChatRoomNotificationAttachment,再通过附件类型的getType()方法获取附件类型中的type字段来区分聊天室通知消息的类型,通知消息类型的枚举值请点此查看。 -
聊天室中所有的通知都以消息
NIMMessage的形式展示,内部messageObject为NIMNotificationTypeChatroom类型的NIMNotificationObject,开发者收到具体消息需要进行过滤来显示。详细的解析说明,请点此查看。 -
聊天室通知消息是聊天室消息
ChatroomMessage的一种,收到聊天室通知消息的时候,会通过初始化聊天室时var chatroom = Chatroom.getInstance({... , onmsgs: onChatroomMsgs})注册的回调函数onChatroomMsgs进行通知,其中ChatroomMessage.type为'notification'表示聊天室通知消息,ChatroomMessage.attach.type为聊天室通知消息的类型,例如memberEnter为表示成员进入聊天室,为memberExit表示成员离开聊天室。
关于聊天室独立模式 聊天室独立模式由于不依赖IM连接,SDK无法自动获取聊天室服务器的地址,需要客户端向开发者应用服务器请求该地址,而应用服务器需要向网易云信服务器请求,即请求路径为:客户端 <-> 开发者应用服务器 <-> 网易云信服务器(IM服务端API)。
[注意] 「请求聊天室地址」的IM服务端API接口为https://api.netease.im/nimserver/chatroom/requestAddr.action,其中参数clienttype默认为1表示Web端专用地址;如果用于Android或iOS,应传入2,否则将导致进入聊天室返回408;微信小程序应传入3。
如果聊天室用户位于海外,还必须通过clientip参数传入用户的公网出口IP地址,以便获取到就近的服务器节点,确保良好的接入效果。
下面介绍各端配置方法示例。
-
Android
-
iOS
-
Web
-
- 调用
EnterChatRoomData对象的setIndependentMode(ChatRoomIndependentCallback cb, String account, String token)方法设置聊天室独立模式,例如:``` EnterChatRoomData data = new EnterChatRoomData(roomId); data.setIndependentMode(new ChatRoomIndependentCallback() { @Override public ListgetChatRoomLinkAddresses(String roomId, String accid) { return ChatRoomHttpClient.getInstance().fetchChatRoomAddress(roomId, "accid"); } }, "accid", "token"); 其中`getChatRoomLinkAddresses`方法的内容为开发者应用服务器接口示例,调用网易云IM服务端请求聊天室地址API来获取具体的聊天室IP。 - 调用接口
enterChatRoomEx(EnterChatRoomData roomData, int retryCount)进入聊天室。
[注意1] 如果
setIndependentMode方法没有设置account,那么SDK将匿名登录。这种情况下,必须通过EnterChatRoomData的setNick方法设置昵称,通过其setAvatar方法设置头像。
[注意2] 如果您是kotlin语法使用者,getChatRoomLinkAddresses(String roomId, String accid)无法通过SDK获取到roomId,会回调null,需要改成roomId:String?, 否则加入聊天室会报错1001,并上报App异常。 - 调用
-
-
调用注册聊天室地址的回调方法:``` [NIMChatroomIndependentMode registerRequestChatroomAddressesHandler:^(NSString * _Nonnull roomId, NIMRequestChatroomAddressesCallback _Nonnull callback) { [YourHTTPService request:roomId completion:^(NSError *error, NSArray *addresses) { //无论请求是否成功,都需要进行回调,否则SDK会一直等待 if (callback) { callback(error, addresses); } }]; }];
其中`YourHTTPService`为开发者应用服务器接口示例,调用网易云IM服务端请求聊天室地址API来获取具体的聊天室IP。 -
初始化
NIMChatroomEnterRequest对象和NIMChatroomIndependentMode对象,并进行赋值,例如:``` NIMChatroomEnterRequest *request = [[NIMChatroomEnterRequest alloc] init]; NIMChatroomIndependentMode *mode = [[NIMChatroomIndependentMode alloc] init]; request.mode = mode; -
调用接口
-(void)enterChatroom:(NIMChatroomEnterRequest *)request completion:(NIMChatroomEnterHandler)completion进入聊天室。
[注意1] 如果
NIMChatroomIndependentMode的username设置为nil,那么token无效,SDK将使用自动生成的匿名账号进行登录。这种情况下,必须为NIMChatroomEnterRequest设置roomNickname昵称和roomAvatar头像。
[注意2]NIMChatroomIndependentMode类定义在 NIMChatroomEnterRequest.h 中。 -
-
请查看开发指南初始化聊天室章节。
[注意] 如果配置了isAnonymous: true使用游客身份/匿名方式进入聊天室,网易云信服务器会自动生成虚拟账号,由于虚拟账号也会计算日活,因此建议在onconnect回调中通过Chatroom对象的account参数获取服务器返回的账号,并将其保存起来,当日再以匿名方式进入时,传入已保存的虚拟账号,避免服务器重新分配虚拟账号产生新的日活。怎么设置和获取聊天室的扩展字段
-
Server
-
Windows (C)
-
Android
-
iOS
-
Web
-
调用以下接口时,
ext字段表示聊天室的扩展字段。- 设置聊天室扩展字段
- 创建聊天室:
https://api.netease.im/nimserver/chatroom/create.action - 更新聊天室信息:
https://api.netease.im/nimserver/chatroom/update.action
- 创建聊天室:
- 获取聊天室扩展字段
查询聊天室信息:https://api.netease.im/nimserver/chatroom/get.action
- 设置聊天室扩展字段
-
- 设置聊天室扩展字段
调用nim_chatroom_update_room_info_async更新聊天室信息时(需要管理员权限),参数room_info_json_str表示聊天室信息,其中kNIMChatRoomInfoKeyExt = "ext"表示聊天室扩展字段。 - 获取聊天室扩展字段
调用nim_chatroom_get_info_async获取聊天室信息时,回调函数nim_chatroom_get_info_cb_func中,参数result表示聊天室信息Json Keys,字段同上。
- 设置聊天室扩展字段
-
- 设置聊天室扩展字段
调用NIMClient.getService(ChatRoomService.class).updateRoomInfo(String roomId, ChatRoomUpdateInfo chatRoomUpdateInfo, boolean needNotify, Map<String, Object> notifyExtension)修改聊天室信息时,构造chatRoomUpdateInfo对象,通过其setExtension(Map extension)方法设置聊天室扩展字段。
如果配置needNotify通知,聊天室成员会收到类型为ChatRoomInfoUpdated的聊天室通知消息。 - 获取聊天室扩展字段
调用NIMClient.getService(ChatRoomService.class).fetchRoomInfo(roomId).setCallback(...)获取聊天室信息时,从onSuccess回调获取ChatRoomInfo对象,再通过其getExtension()方法获取聊天室扩展字段。
- 设置聊天室扩展字段
-
- 设置聊天室扩展字段
调用–updateChatroomInfo:completion:修改聊天室信息时,传入的NIMChatroomUpdateRequest对象的updateInfo属性为NIMChatroomUpdateTag的键值对,其中NIMChatroomUpdateTagExt = 12表示聊天室扩展字段。
如果配置needNotify通知,聊天室成员会收到类型为NIMChatroomEventTypeInfoUpdated的聊天室通知消息。 - 获取聊天室扩展字段
调用–fetchChatroomInfo:completion:获取聊天室信息时,通过回调的NIMChatroom对象的ext属性获取聊天室扩展字段。
- 设置聊天室扩展字段
-
-
设置聊天室扩展字段
调用chatroom.updateChatroom({chatroom: {..., custom: 'newCustom'}, ...})更新聊天室信息时,传入的chatroom.custom表示聊天室扩展字段。
如果配置needNotify: true,聊天室成员会收到类型为'updateChatroom'的聊天室通知消息。 -
获取聊天室扩展字段
调用chatroom.getChatroom({done: ...})获取聊天室信息时,回调函数中ChatroomInfo对象的custom属性表示聊天室扩展字段。怎么设置聊天室成员的扩展字段 [注意] 如果需要设置和获取聊天室成员的昵称和头像,请点此查看。
以下为聊天室成员扩展字段的设置方法,获取方法请点此查看。
-
-
Server
-
Windows (C)
-
Android
-
iOS
-
Web
-
调用
https://api.netease.im/nimserver/chatroom/updateMyRoomRole.action变更聊天室内的角色信息时,传入ext字段表示聊天室成员的扩展字段。 -
- 调用
nim_chatroom_enter进入聊天室时,enter_info表示聊天室可选参数,其中kNIMChatRoomEnterKeyExt = "ext"表示聊天室成员的扩展字段。 - 调用
nim_chatroom_update_my_role_async更新自己的信息时,参数role_info_json_str表示自己的信息,其中kNIMChatRoomMemberInfoKeyExt = "ext"表示聊天室成员的扩展字段。
- 调用
-
- 调用
NIMClient.getService(ChatRoomService.class).enterChatRoomEx(EnterChatRoomData roomData, int retryCount)进入聊天室时,构造EnterChatRoomData对象,通过其setExtension(Map extension)方法设置聊天室成员的扩展字段。 - 调用
NIMClient.getService(ChatRoomService.class).updateMyRoomRole(String roomId, ChatRoomMemberUpdate chatRoomMemberUpdate, boolean needNotify, Map<String, Object> notifyExtension)修改自己的聊天室成员信息时,构造ChatRoomMemberUpdate对象,通过其setExtension(Map extension)方法设置聊天室成员的扩展字段。
- 调用
-
- 调用
–enterChatroom:completion:进入聊天室时,构造的NIMChatroomEnterRequest对象,其属性roomExt表示聊天室成员的扩展字段。 - 调用
–updateMyChatroomMemberInfo:completion:修改自己的聊天室成员信息时,传入的NIMChatroomMemberInfoUpdateRequest对象的updateInfo属性为NIMChatroomMemberInfoUpdateTag的键值对,其中NIMChatroomMemberInfoUpdateTagExt = 7表示聊天室扩展字段。
- 调用
-
- 通过
Chatroom.getInstance({..., chatroomCustom: '{custom json}', ...})初始化聊天室时,通过chatroomCustom字段设置聊天室成员的扩展字段。 - 通过
chatroom.updateMyChatroomMemberInfo({member: {..., custom: 'newCustom'}, ...})更新自己在聊天室内的信息时,通过member的custom字段设置聊天室成员的扩展字段。
怎么获取聊天室成员的扩展字段 [注意] 如果需要设置和获取聊天室成员的昵称和头像,请点此查看。
以下为聊天室成员扩展字段的获取方法,设置方法请点此查看。 - 通过
-
Server
-
Windows (C)
-
Android
-
iOS
-
Web
-
调用以下接口时,返回的
ext字段表示聊天室成员的扩展字段。- 分页获取成员列表:
https://api.netease.im/nimserver/chatroom/membersByPage.action - 批量获取在线成员信息:
https://api.netease.im/nimserver/chatroom/queryMembers.action
- 分页获取成员列表:
-
- 收到聊天室消息时,可以通过聊天室消息结构Json Keys中,
kNIMChatRoomMsgKeyFromExt = "from_ext"获取消息发送者的聊天室成员扩展字段。 - 也可以在调用以下接口时,通过聊天室个人Info Json Keys中,
kNIMChatRoomMemberInfoKeyExt = "ext"获取聊天室成员的扩展字段。- 调用
nim_chatroom_get_members_online_async分页获取在线成员信息时,回调函数nim_chatroom_get_members_cb_func的result表示聊天室个人Info Json Keys。 - 调用
nim_chatroom_get_members_by_ids_online_async获取指定id的在线成员信息时,回调函数nim_chatroom_get_members_cb_func的result表示聊天室个人Info Json Keys。
- 调用
- 收到聊天室消息时,可以通过聊天室消息结构Json Keys中,
-
- 收到聊天室消息时,可以通过
ChatRoomMessage对象getChatRoomMessageExtension再getSenderExtension获取消息发送者的聊天室成员扩展字段。若没有设置,则这个字段为null。 - 也可以在调用以下接口时,通过回调的
ChatRoomMember对象的getExtension方法获取聊天室成员的扩展字段。- 调用
NIMClient.getService(ChatRoomService.class).fetchRoomMembers(String roomId, MemberQueryType memberQueryType, long time, int limit)根据成员类型获取聊天室成员。 - 调用
NIMClient.getService(ChatRoomService.class).fetchRoomMembersByIds(String roomId, List<String> accounts)根据accid获取聊天室成员信息。
- 调用
- 收到聊天室消息时,可以通过
-
- 收到聊天室消息时,可以通过
NIMMessage对象的messageExt字段(需强转为NIMMessageChatroomExtension对象)的roomExt字段获取消息发送者的聊天室成员扩展字段。 - 也可以在调用以下接口时,通过回调的
NIMChatroomMember对象的roomExt属性获取聊天室成员的扩展字段。- 调用
–fetchChatroomMembers:completion:按锚点分页获取聊天室成员。 - 调用
–fetchChatroomMembersByIds:completion:按accid获取聊天室成员信息。
- 调用
- 收到聊天室消息时,可以通过
-
-
收到聊天室消息时,可以通过聊天室消息对象的
fromCustom字段获取消息发送者的聊天室成员扩展字段。 -
也可以在调用以下接口时,通过回调的
ChatroomMember对象的custom字段获取聊天室成员的扩展字段。- 调用
chatroom.getChatroomMembers(...)获取聊天室成员列表。 - 调用
chatroom.getChatroomMembersInfo(...)获取聊天室成员信息。
观众端怎么和创建者端同步直播状态
- 调用
-
-
背景介绍
由于直播协议标准中没有通用的状态标准,所以观众端播放器SDK无法和创建者端SDK同步直播状态。
如果可以拉流则正常播放;如果拉流失败,则等超时时间后报告播放失败(Windows/Android/iOS/Web播放器都可以自定义超时时间)。 -
处理建议
如果要同步直播状态,提升用户体验,需要结合开发者的应用服务器来处理,参考建议如下:
-
通过网易云信直播服务端API「设置频道状态变化回调地址」(设置一次即可),以后每当该应用下的直播频道状态发生变化时,网易云信服务器会主动通知开发者的应用服务器。
-
开发者应用服务器收到频道状态变化回调时,通知到客户端app,来同步直播状态。
- 如果状态为「直播中」或者「直播录制中」,说明正在直播;
- 如果直播状态为「空闲」,说明已经停止直播,或者网络/app出现异常。
[注意1] 频道状态变化回调,对纯直播推流和互动直播都适用,但是只对网易云信直播频道地址适用(不适用于第三方直播地址)。
[注意2] 由于网络传输等原因,可能收到的回调出现乱序,请注意比较回调中携带的时间戳字段(time),以时间戳最新的为准。
[注意3] 当直播状态变为空闲时,网易云信服务器仅能感知创建者端和服务器断开了连接,无法区分创建者是正常结束直播,还是和服务器之间的网络连接出现异常,还是app出现异常等,因此需要开发者结合自己的业务场景设计合理的代码逻辑,例如配置播放器重试拉流等方式来实现一定的超时机制。 -
开发者服务器向客户端app通知直播状态的参考建议:
由于直播通常结合聊天室使用(称为直播间),可以通过服务端API「更新聊天室信息」修改聊天室扩展字段(ext)来传递直播频道状态,更新聊天室扩展字段后客户端会触发相应的通知,监听到通知后可以通过SDK接口获取聊天室扩展字段解析传递的直播频道状态,进行相应UI提示。关于聊天室成员权限管理 [注意] 关于聊天室成员及其注意事项,请点此查看。
以下介绍各端SDK聊天室权限管理相关接口。
-
-
Server
-
Windows (C)
-
Android
-
iOS
-
Web
-
- 设置聊天室内用户角色:
https://api.netease.im/nimserver/chatroom/setMemberRole.action。参数opt表示角色权限,参数optvalue表示操作类型(配置为true表示设置,配置为false表示取消)。 - 设置临时禁言状态:
https://api.netease.im/nimserver/chatroom/temporaryMute.action - 将聊天室整体禁言:
https://api.netease.im/nimserver/chatroom/muteRoom.action
- 设置聊天室内用户角色:
-
-
设置/取消管理员、普通成员、拉黑、禁言:
nim_chatroom_set_member_attribute_async,参数parameters_json_str表示“设定聊天室成员标记身份条件Keys”,其中:- 传入
kNIMChatRoomSetMemberAttributeKeyAccoutID表示目标成员的accid。 - 传入
kNIMChatRoomSetMemberAttributeKeyAttribute表示操作目标属性,其中:kNIMChatRoomMemberAttributeAdminister表示管理员,kNIMChatRoomMemberAttributeNomalMember表示普通成员,kNIMChatRoomMemberAttributeBlackList表示黑名单用户,kNIMChatRoomMemberAttributeMuteList表示禁言用户。 - 传入
kNIMChatRoomSetMemberAttributeKeyOpt表示操作类型,其中true表示设置,false表示取消。
[注意] 例如,同时设置
kNIMChatRoomSetMemberAttributeKeyAccoutID为accid001,kNIMChatRoomSetMemberAttributeKeyAttribute为kNIMChatRoomMemberAttributeAdminister,kNIMChatRoomSetMemberAttributeKeyOpt为true表示将用户accid001设置为管理员。 - 传入
-
设置/取消临时禁言:
nim_chatroom_temp_mute_member_async,参数duration表示禁言秒数,传0表示取消临时禁言。 -
踢出成员:
nim_chatroom_kick_member_async,参数id表示要踢出的成员的accid。
-
-
- 设置/取消管理员:
NIMClient.getService(ChatRoomService.class).markChatRoomManager(...) - 设置/取消普通成员:
NIMClient.getService(ChatRoomService.class).markNormalMember(...) - 设置/取消拉黑:
NIMClient.getService(ChatRoomService.class).markChatRoomBlackList(...) - 设置/取消禁言:
NIMClient.getService(ChatRoomService.class).markChatRoomMutedList(...) - 踢出成员:
NIMClient.getService(ChatRoomService.class).kickMember(...)
- 设置/取消管理员:
-
- 设置/取消管理员:
[[NIMSDK sharedSDK].chatroomManager markMemberManager:request completion:...],参数request为NIMChatroomMemberUpdateRequest对象,其参数enable配置为YES表示设置权限,NO表示取消权限。 - 设置/取消普通成员:
[[NIMSDK sharedSDK].chatroomManager markNormalMember:request completion:...] - 设置/取消拉黑:
[[NIMSDK sharedSDK].chatroomManager updateMemberBlack:request completion:...] - 设置/取消禁言:
[[NIMSDK sharedSDK].chatroomManager updateMemberMute:request completion:...] - 踢出成员:
[[NIMSDK sharedSDK].chatroomManager kickMember:request completion:...],参数request为NIMChatroomMemberKickRequest对象。
- 设置/取消管理员:
-
- 设置/取消管理员:
chatroom.markChatroomManager({account: 'accid', isAdd: true, done: ...}),参数isAdd配置为true表示设置权限,false表示取消权限。 - 设置/取消普通成员:
chatroom.markChatroomCommonMember({account: 'accid', isAdd: true, level: 1, done: ...}),参数level表示用户等级(传入2表示普通用户)。 - 设置/取消拉黑:
chatroom.markChatroomBlacklist({account: 'accid', isAdd: true, done: ...}) - 设置/取消禁言:
chatroom.markChatroomGaglist({account: 'accid', isAdd: true, done: ...}) - 设置/取消临时禁言:
chatroom.updateChatroomMemberTempMute({account: 'accid', duration: secondsNum, needNotify: true, isAdd: true, done: ...}),参数duration表示禁言秒数,传0表示取消临时禁言。 - 踢出成员:
chatroom.kickChatroomMember({account: 'accid', done: ...});
关于IM服务端API [往聊天室内添加机器人] 「往聊天室内添加机器人」
https://api.netease.im/nimserver/chatroom/addRobot.action - 设置/取消管理员:
-
机器人通常只用于增加聊天室在线人数,不用于正常交流。
-
同一个机器人账号可以同时加入多个不同的聊天室(不限数量)。
-
机器人24小时后会自动退出聊天室,如果在24小时内重复添加则重新计时。开发者也可以调用服务端接口「从聊天室内删除机器人」。
-
「往聊天室内添加机器人」时,如果返回
"code": 200但是failAccids中包含账号,可能的原因包含但不限于:- accid不存在
- accid被封禁
- accid被设为聊天室黑名单用户
- accid已经主动登录到聊天室了
-
如果调用服务端接口「查询聊天室信息」
https://api.netease.im/nimserver/chatroom/get.action时,配置了needOnlineUserCount参数为true,那么返回的在线人数会包含机器人数量。 -
如果调用服务端接口「分页获取成员列表」
https://api.netease.im/nimserver/chatroom/membersByPage.action时,配置了type为1(非固定成员),那么返回结果中会包含机器人账号(机器人账号会包含属性"isRobot": true)。 -
聊天室的成员角色和互踢策略,不区分账号是否是机器人。
如果该账号第一次加入聊天室就是以机器人方式被加入的,那么它属于游客。关于聊天室成员类型,请点此查看。关于聊天室用户进出的通知消息 聊天室用户进出消息属于聊天室通知消息的一种,是指有聊天室成员进入或离开聊天室时,网易云信服务器会向SDK下发一条通知消息。
-
应用级别配置:网易云信控制台 > 选择应用 > IM 即时通讯 > 功能配置 > 聊天室配置 > 聊天室用户进出消息系统下发 > 开启/关闭。
-
单个聊天室配置:调用服务端API「关闭指定聊天室进出通知」
https://api.netease.im/nimserver/chatroom/updateInOutNotification.action。
关于聊天室用户进出消息的解析,请参考:关于聊天室通知消息。
另外,如果希望查询聊天室消息历史时,也不要包含聊天室用户进出消息,请联系商务顾问申请关闭「聊天室用户进出消息历史存储」。
客户端怎么感知服务端关闭了聊天室 如果服务端关闭了某聊天室,客户端下次进入该聊天室会返回404。
如果服务端关闭某聊天室的时候,客户端正在该聊天室内,则客户端可以立即感知,具体请见下文描述。
-
Windows (C)
-
Android
-
iOS
-
Web
-
通过
nim_chatroom_reg_exit_cb注册全局回调,聊天室被关闭时会收到通知,回调函数的exit_type参数为kNIMChatRoomExitReasonRoomInvalid = 1表示聊天室已经被解散。 -
通过
NIMClient.getService(ChatRoomServiceObserver.class).observeKickOutEvent(Observer<ChatRoomKickOutEvent> observer, true)注册被踢出聊天室的观察者,聊天室关闭时会收到通知,ChatRoomKickOutEvent.ChatRoomKickOutReason为CHAT_ROOM_INVALID表示聊天室已经被解散。 -
会触发
NIMChatroomManagerDelegate的-(void)chatroomBeKicked:(NIMChatroomBeKickedResult *)result回调,其中result的reason为NIMChatroomKickReasonInvalidRoom表示聊天室已经被解散。 -
会触发
ondisconnect回调,其中error.code为kicked,error.reason为chatroomClosed。
怎么设置聊天室通知消息的扩展字段 [注意1] 设置聊天室通知消息扩展字段的场景很多,以下仅列举部分,具体请参考官网开发指南和API指南。
[注意2] 以下为聊天室通知消息扩展字段的设置方法。获取方法请点此查看。
[注意3] 离开/退出聊天室的接口,只能传递参数roomId,因此不支持在退出聊天室的时候配置通知消息扩展字段。
-
Server
-
Windows (C)
-
Android
-
iOS
-
Web
-
调用聊天室相关服务端API时,通过传入
notifyExt参数设置聊天室通知消息的扩展字段,相关API例如:- 更新聊天室信息:
https://api.netease.im/nimserver/chatroom/update.action - 设置聊天室内用户角色:
https://api.netease.im/nimserver/chatroom/setMemberRole.action - 往聊天室内添加机器人:
https://api.netease.im/nimserver/chatroom/addRobot.action - 设置临时禁言状态:
https://api.netease.im/nimserver/chatroom/temporaryMute.action - 将聊天室整体禁言:
https://api.netease.im/nimserver/chatroom/muteRoom.action - 变更聊天室内的角色信息:
https://api.netease.im/nimserver/chatroom/updateMyRoomRole.action
- 更新聊天室信息:
-
- 调用
nim_chatroom_enter进入聊天室时,参数enter_info表示聊天室可选信息,其中kNIMChatRoomEnterKeyNotifyExt = "notify_ext"表示聊天室通知消息扩展字段。 - 调用
nim_chatroom_set_member_attribute_async设置聊天室成员身份标识(例如:设置管理员、设置普通成员、设置黑名单、禁言)时,参数parameters_json_str表示聊天室成员身份标识参数,其中kNIMChatRoomSetMemberAttributeKeyNotifyExt = "notify_ext"表示聊天室通知消息的扩展字段。
- 调用
-
- 调用
enterChatRoomEx进入聊天室时,通过EnterChatRoomData的setNotifyExtension(Map notifyExtension)方法设置。 - 调用以下接口时,通过
notifyExtension参数设置。
调用updateRoomInfo修改聊天室信息; 调用updateMyRoomRole修改自己的聊天室成员信息; 调用kickMember踢出聊天室成员。 - 调用以下接口时,通过
MemberOption的setNotifyExtension(Map notifyExtension)方法设置。
调用markChatRoomManager设置聊天室管理员; 调用markNormalMember设置聊天室普通成员;调用markChatRoomBlackList设置拉黑用户;调用markChatRoomMutedList设置永久禁言用户; 调用markChatRoomTempMute设置临时禁言用户。
- 调用
-
- 调用
-enterChatroom:completion:进入聊天室时,通过NIMChatroomEnterRequest的roomNotifyExt参数设置。 - 调用
-updateChatroomInfo:completion:修改聊天室信息时,通过NIMChatroomUpdateRequest的notifyExt参数设置。 - 调用
-updateMyChatroomMemberInfo:completion:修改自己的聊天室成员信息时,通过NIMChatroomMemberInfoUpdateRequest的notifyExt参数设置。 - 调用
-kickMember:completion:踢出成员时,通过NIMChatroomMemberKickRequest的notifyExt字段设置。 - 调用以下聊天室权限管理接口时,通过
NIMChatroomMemberUpdateRequest的notifyExt参数设置。
调用-markMemberManager:completion:设置为管理员;调用-markNormalMember:completion:设置为普通成员;调用-updateMemberBlack:completion:设置为拉黑用户;调用-updateMemberMute:completion:设置为禁言用户。
- 调用
-
-
调用
Chatroom.getInstance(...)初始化聊天室时,通过传入chatroomEnterCustom字段设置。 -
调用以下接口时,通过传入
custom字段设置。
调用chatroom.updateChatroom(...)更新聊天室信息;调用chatroom.updateMyChatroomMemberInfo(...)更新自己在聊天室内的信息;调用chatroom.markChatroomManager(...)设置聊天室管理员;调用chatroom.markChatroomCommonMember(...)设置聊天室普通成员;调用chatroom.markChatroomBlacklist(...)设置聊天室黑名单;调用chatroom.markChatroomGaglist(...)设置聊天室禁言名单;调用chatroom.updateChatroomMemberTempMute(...)设置聊天室临时禁言;调用chatroom.kickChatroomMember(...)踢出聊天室成员。怎么获取聊天室通知消息的扩展字段 [注意] 以下为聊天室通知消息的获取方法。设置方法请点此查看。
-
-
Windows (C)
-
Android
-
iOS
-
Web
-
通过
nim_chatroom_reg_receive_notification_cb注册聊天室全局接收通知回调,回调函数nim_chatroom_receive_notification_cb_func的参数result表示聊天室通知Keys,其中kChatRoomNotificationDataKeyExt = "ext"表示聊天室通知消息扩展字段。 -
收到聊天室通知消息时,通过
ChatRoomMessage的getAttachment()方法得到聊天室通知消息,将其强转为ChatRoomNotificationAttachment,然后再通过ChatRoomNotificationAttachment的getExtension()方法获取聊天室通知消息扩展字段。 -
- 判断
NIMMessage的messageType字段是否为NIMMessageTypeNotification通知消息。 - 将通知消息
NIMMessage的messageObject字段强转为NIMNotificationObject。判断NIMNotificationObject中notificationType字段是否为NIMNotificationTypeChatroom聊天室通知消息。 - 将聊天室通知消息
NIMNotificationObject中content字段强转为NIMChatroomNotificationContent聊天室通知消息内容。通过其notifyExt字段获取聊天室通知消息扩展字段。
- 判断
-
- 收到聊天室消息
ChatroomMessage时,判断其type是否为'notification'聊天室通知消息。 - 通过聊天室通知消息的
attach.custom属性获取聊天室通知消息扩展字段。
关于IM服务端API 聊天室 部分接口的说明
- 收到聊天室消息
-
关于IM服务端API「创建聊天室」中参数 [broadcasturl] 的说明
IM服务端API「创建聊天室」
https://api.netease.im/nimserver/chatroom/create.action中参数broadcasturl表示直播地址。很多直播间是结合使用聊天室和直播功能的,这个可选参数是方便开发者通过聊天室保存和传递直播的推拉流地址的。关于直播推拉流地址,请点此查看。 -
关于IM服务端API「设置聊天室内用户角色」返回417
IM服务端API「设置聊天室内用户角色」
https://api.netease.im/nimserver/chatroom/setMemberRole.action返回{desc:"duplicate...", code:"417"},可能原因包括但不限于:- 重复操作,例如已经设置某角色之后再次设置,或者已经取消某角色之后再次取消。
- 设置不当,例如对非管理员角色取消管理员,或者对非聊天室成员进行操作,等等。
-
返回{"desc":"parameter roomid should be long","code":414}
聊天室相关API返回
{"desc":"parameter roomid should be long","code":414},可能原因包括但不限于:
开发者对roomid参数的值进行了误编码,例如PHP中对其进行json_encode可能导致出现此报错。 -
返回
{"desc": "no valid param provided, skip update!", "code": 414}表示没有提供有效的参数,无需更新。
例如,对于「更新聊天室信息」接口 (https://api.netease.im/nimserver/chatroom/update.action),如果只传入roomid、needNotify和notifyExt,而没有传入其它任何需要更新的参数,则会返回此提示。 -
返回
{"code":417,"desc":"target accid '****' is limited already, ban=false, mute=true"}该账号已经被永久禁言了,所以调用服务端临时禁言接口时会返回重复操作。
如果服务端想要解除禁言,可以调用https://api.netease.im/nimserver/chatroom/setMemberRole.action接口进行解禁。关于IM服务端API聊天室相关接口返回data中的用户角色type字段 IM服务端API聊天室相关接口,例如:
-
设置聊天室内用户角色
https://api.netease.im/nimserver/chatroom/setMemberRole.action -
分页获取成员列表
https://api.netease.im/nimserver/chatroom/membersByPage.action -
批量获取在线成员信息
https://api.netease.im/nimserver/chatroom/queryMembers.action
返回data中,用户角色type字段可能的值和含义:
| 文字 | 数字 | 含义 |
|---|---|---|
| LIMITED | -1 | 受限用户(黑名单或禁言) |
| COMMON | 0 | 普通固定成员 |
| CREATOR | 1 | 创建者 |
| MANAGER | 2 | 管理员 |
| TEMPORARY | 3 | 临时成员 |
| (非固定成员,可以收发消息) | ||
| ANONYMOUS | 4 | 匿名用户 |
| (没有云信账号,只能收消息,不能发消息) |
[注意] 另请查看:关于聊天室成员
关于聊天室队列变更通知的特别说明 对聊天室队列新增、更新元素时,默认会触发「队列元素变更通知」,枚举值为317 (kNIMChatRoomNotificationIdQueueChanged / ChatRoomQueueChange / NIMChatroomEventTypeQueueChange / updateQueue)。
[注意] 如果调用接口时配置了transient参数为true/YES,那么当提交元素的用户从聊天室正常退出或异常断开时 (掉线、被踢等),服务器会自动删除该用户加入或更新的元素,不再触发「队列元素变更通知」,而是触发「队列元素批量变更通知」,枚举值为320 (kNIMChatRoomNotificationIdQueueBatchChanged / ChatRoomQueueBatchChange / NIMChatroomEventTypeQueueBatchChange / batchUpdateQueue)。
[注意]:聊天室队列,如果没有任何变更操作,默认就会7天过期,自动清除。
关于聊天室成员信息的持久化 IM显示聊天室成员昵称和头像的优先顺序为:
- 如果在进入聊天室时设置了昵称和头像,以此显示;
- 如果进入聊天室时没有设置,则查询是否为固定成员并有持久化信息,如是则以此显示;
- 否则显示用户资料中的昵称和头像(如果用户资料中没有昵称,则返回账号accid;如果用户资料中没有头像,则返回空字符串)。
【注意】固定成员离线之后,聊天室成员的扩展字段默认和聊天室昵称绑定,查询离线的没有配置聊天室昵称的用户成员时,同样也是查询不到对应的聊天室成员的扩展字段的内容的,可以联系云信侧单独配置不做对应的绑定。
各端设置聊天室成员信息(昵称和头像)持久化的方法如下(仅对固定成员有效):
-
Windows
-
Android
-
iOS
-
Web
-
请参考开发指南,查询示例代码中的关键字:
kNIMChatRoomUpdateMyRoleExtNeedSave -
调用
NIMClient.getService(ChatRoomService.class).updateMyRoomRole(...)「修改自己的聊天室成员信息」时,通过chatRoomMemberUpdate对象的setNeedSave(true)方法设置持久化。 -
调用
NIMChatroomManager的–updateMyChatroomMemberInfo:completion:方法「修改自己的聊天室成员信息」时,通过设置NIMChatroomMemberInfoUpdateRequest对象的needSave属性为YES实现持久化。 -
调用
chatroom.updateMyChatroomMemberInfo(...)「更新自己在聊天室内的信息」时,传入needSave: true实现持久化。
聊天室的断网重连逻辑 登录成功后,网络断开,SDK会自动重连。
-
Windows
-
Android
-
iOS
-
Web
-
重连时间间隔为15秒,默认最多重试3次(开发者不可配置)。
-
最多20次,第一次延迟1秒,之后每次多延时1秒,也就是间隔1秒、2秒、3秒、4秒...
-
1秒、2秒、3秒...8秒,然后重新从1秒开始(默认不限制重连次数,直到重连成功)。
-
重连次数无限,前3次自动重连时间间隔逐渐增大,第4次以后每次重连间隔时间固定8秒。
可以在初始化聊天室实例getInstance方法里传reconnectionAttempts配置重连次数。关于聊天室队列的注意事项 聊天室的队列,本质上就是一个键值对的存储,可以用于存储麦位管理等逻辑。
[注意] 调用 https://api.netease.im/nimserver/chatroom/queueBatchOffer.action 批量添加队列的时候,如果聊天室已经存在对应的 key,会直接更新。
[注意] 调用 https://api.netease.im/nimserver/chatroom/queueBatchOffer.action 批量添加队列的时候,返回的 failkey,添加队列失败的 key 的原因主要是,添加的队列的时候 transient 配置为 true,但是配置的 accid 用户不在线会返回 failkey。
[注意] 调用 https://api.netease.im/nimserver/chatroom/queueBatchUpdateElements.action 批量更新队列的时候,elements 传入的参数必须是 json 格式,下面提供一个示例: { "麦位1": "{\"key1\":\"10\",\"key2\":\"20\",\"key3\":\"30\"}", "麦位2": "{\"key1\":\"111\",\"key2\":\"222\",\"key3\":\"333\"}" }
[注意] 调用 https://api.netease.im/nimserver/chatroom/queueBatchUpdateElements.action 批量更新队列的时候,在返回的结果里面 noExistElementKey 表示因为 key 不存在而更新失败的元素。
[注意] 没有初始化队列的情况下,调用添加队列的接口,服务器会自动初始化队列,默认初始化的队列长度为 100。如果需要限制队列长度的情况下,需要在创建聊天室之后调用 https://api.netease.im/nimserver/chatroom/queueInit.action 接口初始化限制队列长度。
关于聊天室登出抄送
聊天室登录登出的抄送,可以在管理后台->消息抄送配置 里勾选。
只是勾选“进出聊天室信息,即汇报创建者或管理员进出聊天室事件消息”,只有聊天室创建者和管理员进出聊天室会抄送eventtype 9的抄送事件
勾选上面的抄送之后,勾选“聊天室全员进出抄送”才会生效,勾选“聊天室全员进出抄送”之后,所有的聊天室成员进出都会抄送eventtype 9的抄送事件
【注意1】聊天室成员如果被服务器调用kickMember.action或setMemberRole.action设置聊天室黑名单踢出聊天室的时候,由于是应用服务器主动操作触发的,所以支持情况下默认是不会触发eventtype 9登出抄送的,这种场景如果需要抄送,可以联系云信技术支持单独申请开通配置。
【注意2】调用toggleCloseStat.action关闭聊天室的时候,由于聊天室人数较大,所有用户同时被踢下线的场景,抄送数据会很大,所以即使开通了上述的被踢抄送,也是不会触发登出eventtype 9登出抄送的





