Android&iOS&Windows&Mac

最近更新时间:2024-10-10 13:01:06

我的收藏

功能描述

群 @ 消息是指发送方监听输入栏里的输入字符,当用户输入 @ 字符后,弹出群成员选择界面。选择完需要 @ 的成员后以 “@A @B @C......” 形式显示在输入框,并可以继续编辑消息内容,完成消息发送。 接收方会在会话界面的群聊天列表,重点显示 “有人@我” 或者 “@所有人” 标识,提醒用户有人在群里 @ 自己了。
说明
目前仅支持文本 @ 消息。

功能演示

监听 @ 字符选择群成员
编辑群 @ 消息发送
收到群 @ 消息









图一:在聊天界面监听到输入框输入 "@" 字符后,可以跳转到群成员选择界面,选择需要 @ 的群成员。 图二:在群成员选择完成后,重新返回聊天界面,继续编辑群 @ 消息发送。 图三:如果有消息 @ 我,自己会收到会话更新,可以在会话 Cell 展示 “有人@我” 信息。

发送群 @ 消息

1. 发送方监听聊天界面的文本输入框,启动群成员选择界面。选择完成后回传所选择的群成员 ID 和昵称信息,ID 用于构建消息对象 V2TIMMessage,昵称用于在文本框显示。
2. 发送方调用 createAtSignedGroupMessage (Android / iOS & Mac / Windows) 接口创建一条群 @ 消息,拿到消息对象 V2TIMMessage,并在其中指定需要 @ 的成员。
3. 发送方调用 sendMessage (Android / iOS & Mac / Windows) 将刚才创建的 @ 消息对象发送出去。
示例代码如下:
Android
iOS & Mac
Windows
// 创建一条原始文本消息
V2TIMMessage textMsg = V2TIMManager.getMessageManager().createTextMessage("这是一条文本消息");
// 使用原始文本消息创建一条群 @ 消息,@ 群成员 "user1" 和 "user2"
List<String> atUserList = new ArrayList<>();
atUserList.add("user1");
atUserList.add("user2");
V2TIMMessage atMsg = V2TIMManager.getMessageManager().createAtSignedGroupMessage(textMsg, atUserList);
// 发送群 @ 消息
V2TIMManager.getMessageManager().sendMessage(atMsg, null, "toGroupID", V2TIMMessage.V2TIM_PRIORITY_DEFAULT, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onError(int code, String desc) {
// 群@消息发送失败
}
@Override
public void onSuccess(V2TIMMessage v2TIMMessage) {
// 群@消息发送成功
}
@Override
public void onProgress(int progress) {
}
});
// 创建一条原始文本消息
V2TIMMessage *textMsg = [[V2TIMManager sharedInstance] createTextMessage:@"这是一条文本消息"];
// 使用原始文本消息创建一条群 @ 消息,@ 群成员 "xixi" 和 "yahaha"
V2TIMMessage *atMsg = [[V2TIMManager sharedInstance] createAtSignedGroupMessage:textMsg atUserList:@[@"xixi", @"yahaha"]];
// 发送群 @ 消息
[[V2TIMManager sharedInstance] sendMessage:atMsg receiver:nil groupID:@"groupA" priority:V2TIM_PRIORITY_NORMAL onlineUserOnly:NO offlinePushInfo:nil progress:nil succ:nil fail:nil];
class SendCallback final : public V2TIMSendCallback {
public:
using SuccessCallback = std::function<void(const V2TIMMessage&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;
using ProgressCallback = std::function<void(uint32_t)>;

SendCallback() = default;
~SendCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback,
ProgressCallback progress_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
progress_callback_ = std::move(progress_callback);
}

void OnSuccess(const V2TIMMessage& message) override {
if (success_callback_) {
success_callback_(message);
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}
void OnProgress(uint32_t progress) override {
if (progress_callback_) {
progress_callback_(progress);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
ProgressCallback progress_callback_;
};

V2TIMStringVector atUserList;
atUserList.PushBack("user1");
atUserList.PushBack("user2");
V2TIMMessage message = V2TIMManager::GetInstance()->GetMessageManager()->CreateTextMessage(u8"这是一条文本消息");
V2TIMMessage at_message = V2TIMManager::GetInstance()->GetMessageManager()->CreateAtSignedGroupMessage(message, atUserList);

auto callback = new SendCallback{};
callback->SetCallback(
[=](const V2TIMMessage& message) {
// 群@消息发送成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 群@消息发送失败
delete callback;
},
[=](uint32_t progress) {});

V2TIMManager::GetInstance()->GetMessageManager()->SendMessage(
at_message, "denny", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);

接收群 @ 消息

1. 在加载和更新会话处,需要调用 V2TIMConversationgroupAtInfolist (Android / iOS & Mac / Windows) 接口获取会话的 @ 数据列表。
2. 通过列表中 V2TIMGroupAtInfo 对象的 atType (Android / iOS & Mac / Windows) 接口获取 @ 数据类型,并更新到当前会话的 @ 信息。
示例代码如下:
Android
iOS & Mac
Windows
//获取群@数据列表
List<V2TIMGroupAtInfo> atInfoList = conversation.getGroupAtInfoList();
// 解析@类型(@我,@所有人, @我且@所有人)
boolean atMe = false;
boolean atAll = false;
String atTips = "";
for(V2TIMGroupAtInfo atInfo : atInfoList){
if (atInfo.getAtType() == V2TIMGroupAtInfo.TIM_AT_ME){
atMe = true;
continue;
}
if (atInfo.getAtType() == V2TIMGroupAtInfo.TIM_AT_ALL){
atAll = true;
continue;
}
}

// 根据@类型,提示
if (atMe && !atAll) {
atTips = "[有人@我]";
} else if (!atMe && atAll) {
atTips = "[@所有人]";
} else if (atMe && atAll) {
atTips = "[有人@我][@所有人]";
}
// 获取群@数据列表
NSArray<V2TIMGroupAtInfo *> *atInfoList = conversation.groupAtInfolist;

// 解析@类型(@我,@所有人, @我且@所有人)
BOOL atMe = NO; // 是否@我
BOOL atAll = NO; // 是否@所有人
NSString *atTipsStr = @"";
for (V2TIMGroupAtInfo *atInfo in atInfoList) {
switch (atInfo.atType) {
case V2TIM_AT_ME:
atMe = YES;
break;
case V2TIM_AT_ALL:
atAll = YES;
break;
case V2TIM_AT_ALL_AT_ME:
atMe = YES;
atAll = YES;
break;
default:
break;
}
}

// 根据@类型,提示
if (atMe && !atAll) {
atTipsStr = @"[有人@我]";
}
if (!atMe && atAll) {
atTipsStr = @"[@所有人]";
}
if (atMe && atAll) {
atTipsStr = @"[有人@我][@所有人]";
}
// 获取群@数据列表
V2TIMGroupAtInfoVector groupAtInfolist = conversation.groupAtInfolist;
// 解析@类型(@我,@所有人, @我且@所有人)
bool atMe = false;
bool atAll = false;
std::string atTips = "";

for (size_t i = 0; i < groupAtInfolist.Size(); ++i) {
const V2TIMGroupAtInfo& atInfo = groupAtInfolist[i];
switch (atInfo.atType) {
case V2TIM_AT_ME:
atMe = true;
break;
case V2TIM_AT_ALL:
atAll = true;
break;
case V2TIM_AT_ALL_AT_ME:
atMe = true;
atAll = true;
break;
default:
break;
}
}

// 根据@类型,提示
if (atMe && !atAll) {
atTips = u8"[有人@我]";
} else if (!atMe && atAll) {
atTips = u8"[@所有人]";
} else if (atMe && atAll) {
atTips = u8"[有人@我][@所有人]";
}