序号 | 直播间的状态 |
1 | 直播待开始 |
2 | 直播中 |
3 | 直播暂停 |
4 | 直播结束 |
5 | 直播回放中 |
序号 | 特点 |
1 | 直播间状态的更改需要实时通知直播间用户 |
2 | 新进入直播间用户需要获取当前直播间状态 |
两种实现方案 | 优点 | 缺点 |
需要频繁多次获取直播间状态时,相比于将直播间状态存 IM 群资料,直播间状态存业务后台可以减少 IM SDK 的调用频率。提供在未集成 IM SDK 地方提供获取直播间状态的可能。 | 需要业务后台额外提供读写直播间状态模块。增加获取直播间数据异常概率,直播间数据来自业务后台和 IM 群资料两部分。发送自定义消息有丢失的可能,当消息量特别大时,低优先级消息会优先被丢弃从而影响直播间状态的显示。因此这里建议使用高优先自定义消息。 | |
开发者不需要提供额外的读写直播间状态模块。群属性变更回调理论上不存在丢失可能。直播间数据都从群资料中获取,统一数据源,减少异常。 | 在高曝光模块需要频繁获取群资料,增大 IM 压力。在未集成 IM SDK 模块,需要通过业务后台调用 IM 服务端 SDK 获取群资料。且调用频率有限制。 |
// 客户端获取群资料V2TIMManager.getGroupManager().getGroupsInfo(groupIDList, new V2TIMValueCallback<List<V2TIMGroupInfoResult>>() {@Overridepublic void onSuccess(List<V2TIMGroupInfoResult> v2TIMGroupInfoResults) {// 获取群资料成功}@Overridepublic void onError(int code, String desc) {// 获取群资料失败}});// 客户端修改群资料V2TIMGroupInfo v2TIMGroupInfo = new V2TIMGroupInfo();v2TIMGroupInfo.setGroupID("需要修改的群 ID");v2TIMGroupInfo.setFaceUrl("http://xxxx");V2TIMManager.getGroupManager().setGroupInfo(v2TIMGroupInfo, new V2TIMCallback() {@Overridepublic void onSuccess() {// 修改群资料成功}@Overridepublic void onError(int code, String desc) {// 修改群资料失败}});
[[V2TIMManager sharedInstance] getGroupsInfo:@[@"groupA"] succ:^(NSArray<V2TIMGroupInfoResult *> *groupResultList) {// 获取群资料成功} fail:^(int code, NSString *desc) {// 获取群资料失败}];V2TIMGroupInfo *info = [[V2TIMGroupInfo alloc] init];info.groupID = @"需要修改的群 ID";info.faceURL = @"http://xxxx";[[V2TIMManager sharedInstance] setGroupInfo:info succ:^{// 修改群资料成功} fail:^(int code, NSString *desc) {// 修改群资料失败}];
// 获取群资料V2TimValueCallback<List<V2TimGroupInfoResult>> groupinfos = await groupManager.getGroupsInfo(groupIDList: ['groupid1']);// 修改群资料groupManager.setGroupInfo(info: V2TimGroupInfo.fromJson({"groupAddOpt":GroupAddOptTypeEnum.V2TIM_GROUP_ADD_AUTH// ...其他资料}));// 回调TencentImSDKPlugin.v2TIMManager.addGroupListener(listener: V2TimGroupListener(onGroupInfoChanged: ((groupID, changeInfos) {// 群信息更改回调})));
// 获取群资料let promise = tim.getGroupProfile({ groupID: 'group1', groupCustomFieldFilter: ['key1','key2'] });promise.then(function(imResponse) {console.log(imResponse.data.group);}).catch(function(imError) {console.warn('getGroupProfile error:', imError); // 获取群详细资料失败的相关信息});// 修改群资料let promise = tim.updateGroupProfile({groupID: 'group1',name: 'new name', // 修改群名称introduction: 'this is introduction.', // 修改群简介// v2.6.0 起,群成员能收到群自定义字段变更的群提示消息,且能获取到相关的内容,详见 Message.payload.newGroupProfile.groupCustomFieldgroupCustomField: [{ key: 'group_level', value: 'high'}] // 修改群组维度自定义字段});promise.then(function(imResponse) {console.log(imResponse.data.group) // 修改成功后的群组详细资料}).catch(function(imError) {console.warn('updateGroupProfile error:', imError); // 修改群组资料失败的相关信息});// v2.6.2 起,提供了全体禁言和取消禁言的功能。目前群全体禁言后,不支持下发群提示消息。let promise = tim.updateGroupProfile({groupID: 'group1',muteAllMembers: true, // true 表示全体禁言,false表示取消全体禁言});promise.then(function(imResponse) {console.log(imResponse.data.group) // 修改成功后的群组详细资料}).catch(function(imError) {console.warn('updateGroupProfile error:', imError); // 修改群组资料失败的相关信息});
优先级 | 含义 |
High | 高优先级 |
Normal | 正常优先级 |
Low | 低优先级 |
// 创建自定义消息V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage("单聊自定义消息".getBytes());// 设置消息优先级为高优先级消息v2TIMMessage.setPriority(V2TIMMessage.V2TIM_PRIORITY_HIGH)// 发送消息V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "receiver_userID", null, V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {@Overridepublic void onProgress(int progress) {// 自定义消息不会回调进度}@Overridepublic void onSuccess(V2TIMMessage message) {// 发送群聊自定义消息成功}@Overridepublic void onError(int code, String desc) {// 发送群聊自定义消息失败}});
/ 创建文本消息V2TIMMessage *message = [[V2TIMManager sharedInstance] createTextMessage:@"content"];// 发送消息[V2TIMManager.sharedInstance sendMessage:messagereceiver:@"userID"groupID:nilpriority:V2TIM_PRIORITY_NORMALonlineUserOnly:NOofflinePushInfo:nilprogress:nilsucc:^{// 文本消息发送成功}fail:^(int code, NSString *desc) {// 文本消息发送失败}];
/ 创建文本消息V2TimValueCallback<V2TimMsgCreateInfoResult> createTextAtMessageRes = await TencentImSDKPlugin.v2TIMManager.getMessageManager().createTextAtMessage(text: "test",atUserList: [],);if(createTextAtMessageRes.code == 0){String id = createTextAtMessageRes.data.id;// 发送文本消息V2TimValueCallback<V2TimMessage> sendMessageRes = await TencentImSDKPlugin.v2TIMManager.getMessageManager().sendMessage(id: id, receiver: "", groupID: "groupID");if(sendMessageRes.code == 0){// 发送成功}}
// 发送文本消息// 1. 创建消息实例,接口返回的实例可以上屏let message = tim.createTextMessage({to: 'user1',conversationType: TIM.TYPES.CONV_C2C,// 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参见:https://www.tencentcloud.com/document/product/269/3663?from_cn_redirect=1#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)// 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST// priority: TIM.TYPES.MSG_PRIORITY_NORMAL,payload: {text: 'Hello world!'},// v2.20.0起支持C2C消息已读回执功能,如果您发消息需要已读回执,需购买进阶版套餐,并且创建消息时将 needReadReceipt 设置为 trueneedReadReceipt: true// 消息自定义数据(云端保存,会发送到对端,程序卸载重装后还能拉取到,v2.10.2起支持)// cloudCustomData: 'your cloud custom data'});// 2. 发送消息let promise = tim.sendMessage(message);promise.then(function(imResponse) {// 发送成功console.log(imResponse);}).catch(function(imError) {// 发送失败console.warn('sendMessage error:', imError);});
{"CallbackCommand": "Group.CallbackAfterSendMsg", // 回调命令"GroupId": "@TGS#2J4SZEAEL", // 群组 ID"Type": "Public", // 群组类型"From_Account": "jared", // 发送者"Operator_Account":"admin", // 请求的发起者"Random": 123456, // 随机数"MsgSeq": 123, // 消息的序列号"MsgTime": 1490686222, // 消息的时间"OnlineOnlyFlag": 1, //在线消息,为1,否则为0;直播群忽略此属性,为默认值0。"MsgBody": [ // 消息体,参见 TIMMessage 消息对象{"MsgType": "TIMTextElem", // 文本"MsgContent": {"Text": "red packet"}}],"CloudCustomData": "your cloud custom data"}
{"CallbackCommand": "State.StateChange","EventTime": 1629883332497,"Info": {"Action": "Login","To_Account": "testuser316","Reason": "Register"},"KickedDevice": [{"Platform": "Windows"},{"Platform": "Android"}]}
V2TIMMessageListGetOption option = new V2TIMMessageListGetOption();option.setGetType(V2TIMMessageListGetOption.V2TIM_GET_CLOUD_OLDER_MSG); // 拉取云端的更老的消息option.setGetTimeBegin(1640966400); // 从 2022-01-01 00:00:00 开始option.setGetTimePeriod(1 * 24 * 60 * 60); // 拉取一整天的消息option.setCount(Integer.MAX_VALUE); // 返回时间范围内所有的消息option.setGroupID(#you group id#); // 拉取群聊消息V2TIMManager.getMessageManager().getHistoryMessageList(option, new V2TIMValueCallback<List<V2TIMMessage>>() {@Overridepublic void onSuccess(List<V2TIMMessage> v2TIMMessages) {Log.i("imsdk", "success");}@Overridepublic void onError(int code, String desc) {Log.i("imsdk", "failure, code:" + code + ", desc:" + desc);}});
// 拉取单聊历史消息// 首次拉取,lastMsg 设置为 nil// 再次拉取时,lastMsg 可以使用返回的消息列表中的最后一条消息[V2TIMManager.sharedInstance getC2CHistoryMessageList:#your user id# count:20 lastMsg:nil succ:^(NSArray<V2TIMMessage *> *msgs) {// 记录下次拉取的 lastMsg,用于下次拉取V2TIMMessage *lastMsg = msgs.lastObject;NSLog(@"success, %@", msgs);} fail:^(int code, NSString *desc) {NSLog(@"fail, %d, %@", code, desc);}];
// 拉取单聊历史消息// 首次拉取,lastMsgID 设置为 null// 再次拉取时,lastMsgID 可以使用返回的消息列表中的最后一条消息的idTencentImSDKPlugin.v2TIMManager.getMessageManager().getC2CHistoryMessageList(userID: "userId",count: 10,lastMsgID: null,);
// 打开某个会话时,第一次拉取消息列表let promise = tim.getMessageList({conversationID: 'C2Ctest', count: 15});promise.then(function(imResponse) {const messageList = imResponse.data.messageList; // 消息列表。const nextReqMessageID = imResponse.data.nextReqMessageID; // 用于续拉,分页续拉时需传入该字段。const isCompleted = imResponse.data.isCompleted; // 表示是否已经拉完所有消息。});// 下拉查看更多消息let promise = tim.getMessageList({conversationID: 'C2Ctest', nextReqMessageID, count: 15});promise.then(function(imResponse) {const messageList = imResponse.data.messageList; // 消息列表。const nextReqMessageID = imResponse.data.nextReqMessageID; // 用于续拉,分页续拉时需传入该字段。const isCompleted = imResponse.data.isCompleted; // 表示是否已经拉完所有消息。});
2TIMManager.getGroupManager().getGroupOnlineMemberCount("group_avchatroom", new V2TIMValueCallback<Integer>() {@Overridepublic void onSuccess(Integer integer) {// 获取直播群在线人数成功}@Overridepublic void onError(int code, String desc) {// 获取直播群在线人数失败}});
[[V2TIMManager sharedInstance] getGroupOnlineMemberCount:@"group_avchatroom" succ:^(NSInteger count) {// 获取直播群在线人数成功} fail:^(int code, NSString *desc) {// 获取直播群在线人数失败}];
groupManager.getGroupOnlineMemberCount(groupID: '');
// v2.8.0 起,支持查询直播群在线人数let promise = tim.getGroupOnlineMemberCount('group1');promise.then(function(imResponse) {console.log(imResponse.data.memberCount);}).catch(function(imError) {console.warn('getGroupOnlineMemberCount error:', imError); // 获取直播群在线人数失败的相关信息});
// 禁言群成员 userB 1分钟V2TIMManager.getGroupManager().muteGroupMember("groupA", "userB", 60, new V2TIMCallback() {@Overridepublic void onSuccess() {// 禁言群成员成功}@Overridepublic void onError(int code, String desc) {// 禁言群成员失败}});// 全员禁言V2TIMGroupInfo info = new V2TIMGroupInfo();info.setGroupID("groupA");info.setAllMuted(true);V2TIMManager.getGroupManager().setGroupInfo(info, new V2TIMCallback() {@Overridepublic void onSuccess() {// 全员禁言成功}@Overridepublic void onError(int code, String desc) {// 全员禁言失败}});V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() {@Overridepublic void onMemberInfoChanged(String groupID, List<V2TIMGroupMemberChangeInfo> v2TIMGroupMemberChangeInfoList) {// 禁言群成员监听for (V2TIMGroupMemberChangeInfo memberChangeInfo : v2TIMGroupMemberChangeInfoList) {// 被禁言用户 IDString userID = memberChangeInfo.getUserID();// 禁言时间long muteTime = memberChangeInfo.getMuteTime();}}@Overridepublic void onGroupInfoChanged(String groupID, List<V2TIMGroupChangeInfo> changeInfos) {// 全员禁言监听for (V2TIMGroupChangeInfo groupChangeInfo : changeInfos) {if (groupChangeInfo.getType() == V2TIMGroupChangeInfo.V2TIM_GROUP_INFO_CHANGE_TYPE_SHUT_UP_ALL) {// 是否全员禁言boolean isMuteAll = groupChangeInfo.getBoolValue();}}}});
// 禁言群成员 user1 1分钟[[V2TIMManager sharedInstance] muteGroupMember:@"groupA" member:@"user1" muteTime:60 succ:^{// 禁言群成员成功} fail:^(int code, NSString *desc) {// 禁言群成员失败}];// 全员禁言V2TIMGroupInfo *info = [[V2TIMGroupInfo alloc] init];info.groupID = @"groupA";info.allMuted = YES;[[V2TIMManager sharedInstance] muteGroupMember:@"groupA" member:@"user1" muteTime:60 succ:^{// 全员禁言成功} fail:^(int code, NSString *desc) {// 全员禁言失败}];[[V2TIMManager sharedInstance] addGroupListener:self];- (void)onMemberInfoChanged:(NSString *)groupID changeInfoList:(NSArray <V2TIMGroupMemberChangeInfo *> *)changeInfoList {// 禁言群成员监听for (V2TIMGroupMemberChangeInfo *memberChangeInfo in changeInfoList) {// 被禁言用户 IDNSString *userID = memberChangeInfo.userID;// 禁言时间uint32_t muteTime = memberChangeInfo.muteTime;}}- (void)onGroupInfoChanged:(NSString *)groupID changeInfoList:(NSArray <V2TIMGroupChangeInfo *> *)changeInfoList {// 全员禁言监听for (V2TIMGroupChangeInfo groupChangeInfo in changeInfoList) {if (groupChangeInfo.type == V2TIM_GROUP_INFO_CHANGE_TYPE_SHUT_UP_ALL) {// 是否全员禁言BOOL isMuteAll = groupChangeInfo.boolValue;}}}
// 禁言群成员 userB 10分钟groupManager.muteGroupMember(groupID: '',userID: 'userB',seconds: 10);// 全员禁言groupManager.setGroupInfo(info: V2TimGroupInfo(isAllMuted: true,groupID: '',groupType: 'Public'));TencentImSDKPlugin.v2TIMManager.addGroupListener(listener: V2TimGroupListener(onMemberInfoChanged: (groupID, v2TIMGroupMemberChangeInfoList) {//群成员信息更改},onGroupInfoChanged: (groupID,info){// 群信息修改}));
tim.setGroupMemberMuteTime(options);let promise = tim.setGroupMemberMuteTime({groupID: 'group1',userID: 'user1',muteTime: 600 // 禁言10分钟;设为0,则表示取消禁言});promise.then(function(imResponse) {console.log(imResponse.data.group); // 修改后的群资料console.log(imResponse.data.member); // 修改后的群成员资料}).catch(function(imError) {console.warn('setGroupMemberMuteTime error:', imError); // 禁言失败的相关信息});// 设置群成员在话题中的禁言时间let promise = tim.setGroupMemberMuteTime({groupID: 'topicID',userID: 'user1',muteTime: 600 // 禁言10分钟;设为0,则表示取消禁言});promise.then(function(imResponse) {console.log(imResponse.data.group); // 修改后的群资料console.log(imResponse.data.member); // 修改后的群成员资料}).catch(function(imError) {console.warn('setGroupMemberMuteTime error:', imError); // 禁言失败的相关信息});// v2.6.2 起,提供了全体禁言和取消禁言的功能。目前群全体禁言后,不支持下发群提示消息。let promise = tim.updateGroupProfile({groupID: 'group1',muteAllMembers: true, // true 表示全体禁言,false表示取消全体禁言});promise.then(function(imResponse) {console.log(imResponse.data.group) // 修改成功后的群组详细资料}).catch(function(imError) {console.warn('updateGroupProfile error:', imError); // 修改群组资料失败的相关信息});
List<String> userIDList = new ArrayList<>();userIDList.add("userB");V2TIMManager.getGroupManager().kickGroupMember("groupA", userIDList, "", new V2TIMValueCallback<List<V2TIMGroupMemberOperationResult>>() {@Overridepublic void onSuccess(List<V2TIMGroupMemberOperationResult> v2TIMGroupMemberOperationResults) {// 踢人成功}@Overridepublic void onError(int code, String desc) {// 踢人失败}});V2TIMManager.getInstance().addGroupListener(new V2TIMGroupListener() {@Overridepublic void onMemberKicked(String groupID, V2TIMGroupMemberInfo opUser,List<V2TIMGroupMemberInfo> memberList) {// 群成员被踢通知}});
[[V2TIMManager sharedInstance] kickGroupMember:@"groupA" memberList:@[@"user1"] reason:@"" succ:^(NSArray<V2TIMGroupMemberOperationResult *> *resultList) {// 踢人成功} fail:^(int code, NSString *desc) {// 踢人失败}];[[V2TIMManager sharedInstance] addGroupListener:self];- (void)onMemberKicked:(NSString *)groupID opUser:(V2TIMGroupMemberInfo *)opUser memberList:(NSArray<V2TIMGroupMemberInfo *>*)memberList {// 群成员被踢通知}
groupManager.kickGroupMember(groupID: '',memberList: []);
tim.deleteGroupMember(options);
{"CallbackCommand": "Group.CallbackBeforeSendMsg", // 回调命令"GroupId": "@TGS#2J4SZEAEL", // 群组 ID"Type": "Public", // 群组类型"From_Account": "jared", // 发送者"Operator_Account":"admin", // 请求的发起者"Random": 123456, // 随机数"OnlineOnlyFlag": 1, //在线消息,为1,否则为0;直播群忽略此属性,为默认值0。"MsgBody": [ // 消息体,参见 TIMMessage 消息对象{"MsgType": "TIMTextElem", // 文本"MsgContent": {"Text": "red packet"}}],"CloudCustomData": "your cloud custom data"}
{"ActionStatus": "OK","ErrorInfo": "","ErrorCode": 0 // 不同的ErrorCode有不同的含义}
ErrorCode | 含义 |
0 | 为允许发言,正常下发消息 |
1 | 为拒绝发言,客户端返回10016 |
2 | 为静默丢弃,客户端返回正常 |
getGroupMemberList
接口获取群成员列表,但 AVChatRoom 由于人数众多,不提供拉取全量成员列表的功能。根据进阶版和非进阶版区分不同的表现:getGroupMemberList
拉取最近进群的 30 位群成员。getGroupMemberList
拉取最近进群的 1000 位群成员。此功能需要在 IM 控制台开启开关,如果不开启,默认跟非进阶版一样,仅拉取最近进群 30 位群成员。getGroupMemberList
与群监听中的 onGroupMemberEnter 和 onGroupMemberQuit 回调,在客户端维护当前在线群成员列表。但此方案用户退出直播间重新进入后,也只能获取最新的30位群成员。// 通过 filter 参数指定只拉取群主的资料int role = V2TIMGroupMemberFullInfo.V2TIM_GROUP_MEMBER_FILTER_OWNER;V2TIMManager.getGroupManager().getGroupMemberList("testGroup", role, 0,new V2TIMValueCallback<V2TIMGroupMemberInfoResult>() {@Overridepublic void onError(int code, String desc) {// 拉取失败}@Overridepublic void onSuccess(V2TIMGroupMemberInfoResult v2TIMGroupMemberInfoResult) {// 拉取成功}});
[[V2TIMManager sharedInstance] getGroupMemberList:@"groupA" filter:V2TIM_GROUP_MEMBER_FILTER_OWNER nextSeq:0 succ:^(uint64_t nextSeq, NSArray<V2TIMGroupMemberFullInfo *> *memberList) {// 拉取成功} fail:^(int code, NSString *desc) {// 拉取失败}];
// 通过 filter 参数指定只拉取群主的资料 ,可指定ALL拉取全部群成员groupManager.getGroupMemberList(count: 10,filter: GroupMemberFilterTypeEnum.V2TIM_GROUP_MEMBER_FILTER_ADMIN,nextSeq: '0',offset: 0,groupID: "",);
tim.getGroupMemberList(options);
Message.nick
与 Message.avatar
字段都为空,该怎么处理才能在界面上正常展示昵称和头像?
本页内容是否解决了您的问题?