Android&iOS&Windows&Mac

最近更新时间:2024-10-10 10:33:11

我的收藏

功能描述

发送消息方法在核心类 V2TIMManagerV2TIMMessageManager(Android) / V2TIMManager(Message)(iOS & Mac) 中。
支持发送文本、自定义、富媒体消息,消息类型都是 V2TIMMessage
V2TIMMessage 中可以携带 V2TIMElem 的不同类型子类,表示不同类型的消息。

重点接口说明

接口 sendMessage (Android / iOS & Mac / Windows) 是发送消息中最核心的接口。该接口支持发送所有类型的消息。
说明
下文中提到的发消息高级接口,指的都是 sendMessage
接口说明如下:
Android
iOS & Mac
Windows
方法原型:
// V2TIMMessageManager
public abstract String sendMessage(
V2TIMMessage message,
String receiver,
String groupID,
int priority,
boolean onlineUserOnly,
V2TIMOfflinePushInfo offlinePushInfo,
V2TIMSendCallback<V2TIMMessage> callback);
参数说明:
参数
含义
单聊有效
群聊有效
说明
message
消息对象
YES
YES
需要通过对应的 createXxxMessage 接口先行创建,Xxx 表示具体的类型。
receiver
单聊消息接收者 userID
YES
NO
如果是发送 C2C 单聊消息,只需要指定 receiver 即可。
groupID
群聊 groupID
NO
YES
如果是发送群聊消息,只需要指定 groupID 即可。
priority
消息优先级
NO
YES
请把重要消息设置为高优先级(例如红包、礼物消息),高频且不重要的消息设置为低优先级(例如点赞消息)。
onlineUserOnly
是否只有在线用户才能收到
YES
YES
如果设置为 true,接收方历史消息拉取不到,常被用于实现 “ 对方正在输入” 或群组里的非重要提示等弱提示功能。
offlinePushInfo
离线推送信息
YES
YES
离线推送时携带的标题和内容。
callback
发送回调
YES
YES
包含上传进度回调、发送成功回调、发送失败回调。
方法原型:
// V2TIMManager+Message.h
- (NSString *)sendMessage:(V2TIMMessage *)message
receiver:(NSString *)receiver
groupID:(NSString *)groupID
priority:(V2TIMMessagePriority)priority
onlineUserOnly:(BOOL)onlineUserOnly
offlinePushInfo:(V2TIMOfflinePushInfo *)offlinePushInfo
progress:(V2TIMProgress)progress
succ:(V2TIMSucc)succ
fail:(V2TIMFail)fail;
参数说明:
参数
含义
单聊有效
群聊有效
说明
message
消息对象
YES
YES
需要通过对应的 `createXxxMessage` 接口先行创建,`Xxx` 表示具体的类型。
receiver
单聊消息接收者 userID
YES
NO
如果是发送 C2C 单聊消息,只需要指定 `receiver` 即可。
groupID
群聊 groupID
NO
YES
如果是发送群聊消息,只需要指定 `groupID` 即可。
priority
消息优先级
NO
YES
请把重要消息设置为高优先级(例如红包、礼物消息),高频且不重要的消息设置为低优先级(例如点赞消息)。
onlineUserOnly
是否只有在线用户才能收到
YES
YES
如果设置为 YES,接收方历史消息拉取不到,常被用于实现 “对方正在输入” 或群组里的非重要提示等弱提示功能。
offlinePushInfo
离线推送信息
YES
YES
离线推送时携带的标题和内容。
progress
文件上传进度
YES
YES
文件上传进度。当发送消息中包含图片、语音、视频、文件等富媒体消息时才有效,纯文本、表情、定位消息不会回调。
succ
消息发送成功回调
YES
YES
——
fail
消息发送失败回调
YES
YES
回调失败错误码、错误描述。

方法原型:
// V2TIMMessageManager
virtual V2TIMString SendMessage(
V2TIMMessage& message,
const V2TIMString& receiver,
const V2TIMString& groupID,
V2TIMMessagePriority priority,
bool onlineUserOnly,
const V2TIMOfflinePushInfo& offlinePushInfo,
V2TIMSendCallback* callback);
参数说明:
参数
含义
单聊有效
群聊有效
说明
message
消息对象
YES
YES
需要通过对应的 CreateXxxMessage 接口先行创建,`Xxx` 表示具体的类型。
receiver
单聊消息接收者 userID
YES
NO
如果是发送 C2C 单聊消息,只需要指定 receiver 即可。
groupID
群聊 groupID
NO
YES
如果是发送群聊消息,只需要指定 groupID 即可。
priority
消息优先级
NO
YES
请把重要消息设置为高优先级(例如红包、礼物消息),高频且不重要的消息设置为低优先级(例如点赞消息)。
onlineUserOnly
是否只有在线用户才能收到
YES
YES
如果设置为 true,接收方历史消息拉取不到,常被用于实现“对方正在输入” 或群组里的非重要提示等弱提示功能。
offlinePushInfo
离线推送信息
YES
YES
离线推送时携带的标题和内容。
callback
发送回调
YES
YES
包含上传进度回调、发送成功回调、发送失败回调。
注意
如果 groupIDreceiver 同时设置,表示给 receiver 发送定向群消息。详情请参考 群定向消息

发送文本消息

文本消息区分单聊和群聊,涉及的接口、传参有所区别。
发送文本消息可以采用两种接口:普通接口和高级接口。高级接口比普通接口能设置更多的发送参数(例如优先级、离线推送信息等)。 普通接口参考下文具体描述,高级接口就是上文中提到的 sendMessage

单聊文本消息

普通接口

调用 sendC2CTextMessage (Android / iOS & Mac / Windows) 发送单聊文本消息,直接传入消息内容和接收者的 userID 即可。
示例代码如下:
Android
iOS & Mac
Windows
// API 返回 msgID,按需使用
String msgID = V2TIMManager.getInstance().sendC2CTextMessage("单聊文本消息", "receiver_userID", new V2TIMValueCallback<V2TIMMessage>() {
@Override
public void onSuccess(V2TIMMessage message) {
// 发送单聊文本消息成功
}

@Override
public void onError(int code, String desc) {
// 发送单聊文本消息失败
}
});
// API 返回 msgID,按需使用
NSString *msgID = [[V2TIMManager sharedInstance] sendC2CTextMessage:@"单聊文本消息"
to:@"receiver_userID"
succ:^{
// 发送单聊文本消息成功
} fail:^(int code, NSString *msg) {
// 发送单聊文本消息失败
}];
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_;
};

auto callback = new SendCallback{};
callback->SetCallback(
[=](const V2TIMMessage& message) {
// 发送单聊文本消息成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 发送单聊文本消息失败
delete callback;
},
[=](uint32_t progress) {
// 文本消息不会回调进度
});
// API 返回 msgID,按需使用
V2TIMString msgID =
V2TIMManager::GetInstance()->SendC2CTextMessage("单聊文本消息", "receiver_userID", callback);

高级接口

调用高级接口发送单聊文本消息分两步:
1. 调用 createTextMessage (Android / iOS & Mac / Windows) 创建文本消息。
2. 调用 sendMessage (Android / iOS & Mac / Windows) 发送消息。
示例代码如下:
Android
iOS & Mac
Windows
// 创建文本消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createTextMessage("content");
// 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "userID", null, V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
// 文本消息不会回调进度
}

@Override
public void onSuccess(V2TIMMessage message) {
// 文本消息发送成功
}

@Override
public void onError(int code, String desc) {
// 文本消息发送失败
}
});
// 创建文本消息
V2TIMMessage *message = [[V2TIMManager sharedInstance] createTextMessage:@"content"];
// 发送消息
[V2TIMManager.sharedInstance sendMessage:message
receiver:@"userID"
groupID:nil
priority:V2TIM_PRIORITY_NORMAL
onlineUserOnly:NO
offlinePushInfo:nil
progress:nil
succ:^{
// 文本消息发送成功
}
fail:^(int code, NSString *desc) {
// 文本消息发送失败
}];
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_;
};

// 创建文本消息
V2TIMMessage v2TIMMessage = V2TIMManager::GetInstance()->GetMessageManager()->CreateTextMessage("content");
// 发送消息
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(
v2TIMMessage, "userID", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);

群聊文本消息

普通接口

调用 sendGroupTextMessage (Android / iOS & Mac / Windows) 发送群聊文本消息,直接传递消息内容、群聊的 groupID 和消息优先级即可。
消息优先级可参考 V2TIMMessagePriority 定义。
示例代码如下:
Android
iOS & Mac
Windows
// API 返回 msgID,按需使用
String msgID = V2TIMManager.getInstance().sendGroupTextMessage("群聊文本消息", "groupID", V2TIMMessage.V2TIM_PRIORITY_NORMAL, new V2TIMValueCallback<V2TIMMessage>() {
@Override
public void onSuccess(V2TIMMessage message) {
// 发送群聊文本消息成功
}

@Override
public void onError(int code, String desc) {
// 发送群聊文本消息失败
}
});
// API 返回 msgID,按需使用
NSString *msgID = [[V2TIMManager sharedInstance] sendGroupTextMessage:@"群聊文本消息"
to:@"groupID" // 群聊的 groupID
priority:V2TIM_PRIORITY_NORMAL // 消息优先级
succ:^{
// 群聊文本消息发送成功
} fail:^(int code, NSString *msg) {
// 群聊文本消息发送失败
}];
class SendGroupTextMessageCallback 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)>;

SendGroupTextMessageCallback() = default;
~SendGroupTextMessageCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback,
ProgressCallbackprogress_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_;
};

auto callback = new SendGroupTextMessageCallback;
callback->SetCallback(
[=](const V2TIMMessage& message) {
// 发送群聊文本消息成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 发送群聊文本消息失败
delete callback;
},
[=](uint32_t progress) {
// 文本消息不会回调进度
});
// API 返回 msgID,按需使用
V2TIMString msgID = V2TIMManager::GetInstance()->SendGroupTextMessage(
"群聊文本消息", "groupID", V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, callback);

高级接口

调用高级接口发送群聊文本消息分两步:
1. 调用 createTextMessage (Android / iOS & Mac / Windows) 创建文本消息。
2. 调用 sendMessage (Android / iOS & Mac / Windows) 发送消息。
示例代码如下:
Android
iOS & Mac
Windows
// 创建文本消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createTextMessage("content");
// 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, null, "receiver_groupID", V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
// 文本消息不会回调进度
}

@Override
public void onSuccess(V2TIMMessage message) {
// 发送群聊文本消息成功
}

@Override
public void onError(int code, String desc) {
// 发送群聊文本消息失败
}
});
// 创建文本消息
V2TIMMessage *message = [[V2TIMManager sharedInstance] createTextMessage:content];
// 发送消息
[V2TIMManager.sharedInstance sendMessage:message
receiver:nil
groupID:@"receiver_groupID" // 群聊的 groupID
priority:V2TIM_PRIORITY_NORMAL // 消息优先级
onlineUserOnly:NO // 仅在线用户接收
offlinePushInfo:nil // 离线推送自定义信息
progress:nil
succ:^{
// 文本消息发送成功
}
fail:^(int code, NSString *desc) {
// 文本消息发送失败
}];
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_;
};

// 创建文本消息
V2TIMMessage v2TIMMessage = V2TIMManager::GetInstance()->GetMessageManager()->CreateTextMessage("content");
// 发送消息
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(
v2TIMMessage, {}, "receiver_groupID", V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);

发送自定义消息

自定义消息区分单聊和群聊,涉及的接口或者传参有所区别。发送自定义消息可以采用两种接口:普通接口和高级接口。 高级接口即上文中已介绍过的 sendMessage (Android / iOS & Mac / Windows),比普通接口能设置更多的发送参数(例如优先级、离线推送信息等)。

单聊自定义消息

普通接口

调用 sendC2CCustomMessage (Android / iOS & Mac / Windows) 发送单聊自定义消息,直接传递消息二进制内容、单聊接收者 userID 即可。
示例代码如下:
Android
iOS & Mac
Windows

String msgID = V2TIMManager.getInstance().sendC2CCustomMessage("单聊自定义消息".getBytes(), "receiver_userID", new V2TIMValueCallback<V2TIMMessage>() {
@Override
public void onSuccess(V2TIMMessage message) {
// 发送单聊自定义消息成功
}

@Override
public void onError(int code, String desc) {
// 发送单聊自定义消息失败
}
});
NSData *customData = [@"单聊自定义消息" dataUsingEncoding:NSUTF8StringEncoding];
NSString *msgID = [[V2TIMManager sharedInstance] sendC2CCustomMessage:customData
to:@"receiver_userID" // 接收者 userID
succ:^{
// 单聊自定义消息发送成功
}
fail:^(int code, NSString *msg) {
// 单聊自定义消息发送失败
}];
class SendC2CCustomMessageCallback 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)>;

SendC2CCustomMessageCallback() = default;
~SendC2CCustomMessageCallback() 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_;
};

auto callback = new SendCallback{};
callback->SetCallback(
[=](const V2TIMMessage& message) {
// 发送单聊自定义消息成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 发送单聊自定义消息失败
delete callback;
},
[=](uint32_t progress) {
// 自定义消息不会回调进度
});
V2TIMString str = u8"单聊自定义消息";
V2TIMBuffer customData = {reinterpret_cast<const uint8_t*>(str.CString()), str.Size()};
V2TIMString msgID = V2TIMManager::GetInstance()->SendC2CCustomMessage(customData, "receiver_userID", callback);

高级接口

调用高级接口发送单聊自定义消息分两步:
1. 调用 createCustomMessage (Android / iOS & Mac / Windows) 创建自定义消息。
2. 调用 sendMessage (Android / iOS & Mac / Windows) 发送消息。
示例代码如下:
Android
iOS & Mac
Windows
// 创建自定义消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage("单聊自定义消息".getBytes());
// 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "receiver_userID", null, V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
// 自定义消息不会回调进度
}

@Override
public void onSuccess(V2TIMMessage message) {
// 发送单聊自定义消息成功
}

@Override
public void onError(int code, String desc) {
// 发送单聊自定义消息失败
}
});
V2TIMMessage *message = [[V2TIMManager sharedInstance] createCustomMessage:data];
[[V2TIMManager sharedInstance] sendMessage:message
receiver:@"receiver_userID" // 接收者 userID
groupID:nil
priority:V2TIM_PRIORITY_DEFAULT // 消息优先级
onlineUserOnly:NO
offlinePushInfo:nil
progress:nil
succ:^{
// 单聊自定义消息发送成功
} fail:^(int code, NSString *desc) {
// 单聊自定义消息发送失败
}];
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_;
};

// 创建自定义消息
V2TIMString str = u8"单聊自定义消息";
V2TIMBuffer customData = {reinterpret_cast<const uint8_t*>(str.CString()), str.Size()};
V2TIMMessage v2TIMMessage = V2TIMManager::GetInstance()->GetMessageManager()->CreateCustomMessage(customData);
// 发送消息
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(
v2TIMMessage, "receiver_userID", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);

群聊自定义消息

普通接口

调用 sendGroupCustomMessage (Android / iOS & Mac / Windows) 发送群聊自定义消息,直接传递消息二进制内容、群聊 groupID 和优先级即可。 消息优先级可参考 V2TIMMessagePriority 定义。
代码示例如下:
Android
iOS & Mac
Windows
String msgID = V2TIMManager.getInstance().sendGroupCustomMessage("群聊自定义消息".getBytes(), "groupID", V2TIMMessage.V2TIM_PRIORITY_NORMAL, new V2TIMValueCallback<V2TIMMessage>() {
@Override
public void onSuccess(V2TIMMessage message) {
// 发送群聊自定义消息成功
}

@Override
public void onError(int code, String desc) {
// 发送群聊自定义消息失败
}
});
NSData *customData = [@"群聊自定义消息" dataUsingEncoding:NSUTF8StringEncoding];
NSString *msgID = [[V2TIMManager sharedInstance] sendGroupCustomMessage:customData
to:@"receiver_groupID" // 群聊的 groupID
priority:V2TIM_PRIORITY_HIGH // 消息优先级
succ:^{
// 群聊自定义消息发送成功
} fail:^(int code, NSString *msg) {
// 群聊自定义消息发送失败
}];
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_;
};

auto callback = new SendCallback{};
callback->SetCallback(
[=](const V2TIMMessage& message) {
// 发送群聊自定义消息成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 发送群聊自定义消息失败
delete callback;
},
[=](uint32_t progress) {
// 自定义消息不会回调进度
});
V2TIMString str = u8"群聊自定义消息";
V2TIMBuffer customData = {reinterpret_cast<const uint8_t*>(str.CString()), str.Size()};
V2TIMString msgID = V2TIMManager::GetInstance()->SendGroupCustomMessage(
customData, "groupID", V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, callback);

高级接口

调用高级接口发送群聊自定义消息分两步:
1. 调用 createCustomMessage (Android / iOS & Mac / Windows) 创建自定义消息。
2. 调用 sendMessage (Android / iOS & Mac / Windows) 发送消息。
代码示例如下:
Android
iOS & Mac
Windows
// 创建自定义消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage("群聊自定义消息".getBytes());
// 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, null, "receiver_groupID", V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
// 自定义消息不会回调进度
}

@Override
public void onSuccess(V2TIMMessage message) {
// 发送群聊自定义消息成功
}

@Override
public void onError(int code, String desc) {
// 发送群聊自定义消息失败
}
});
V2TIMMessage *message = [[V2TIMManager sharedInstance] createCustomMessage:data];
[[V2TIMManager sharedInstance] sendMessage:message
receiver:nil
groupID:@"receiver_groupID" // 群聊的 groupID
priority:V2TIM_PRIORITY_DEFAULT // 消息优先级
onlineUserOnly:NO
offlinePushInfo:nil
progress:nil
succ:^{
// 群聊自定义消息发送成功
} fail:^(int code, NSString *desc) {
// 群聊自定义消息发送失败
}];
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_;
};

// 创建自定义消息
V2TIMString str = u8"群聊自定义消息";
V2TIMBuffer customData = {reinterpret_cast<const uint8_t*>(str.CString()), str.Size()};
V2TIMMessage v2TIMMessage = V2TIMManager::GetInstance()->GetMessageManager()->CreateCustomMessage(customData);
// 发送消息
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(
v2TIMMessage, {}, "receiver_groupID", V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);

发送富媒体消息

富媒体消息的发送步骤如下:
1. 调用 createXxxMessage 创建指定类型的富媒体消息对象,其中 Xxx 表示具体的消息类型。
2. 调用 sendMessage (Android / iOS & Mac / Windows) 发送消息。
3. 在消息回调中获取消息是否发送成功或失败。

图片消息

创建图片消息需要先获取到本地图片路径。 发送消息过程中,会先将图片文件上传至服务器,同时回调上传进度。上传成功后再发送消息。
示例代码如下:
Android
iOS & Mac
Windows
// 创建图片消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createImageMessage("/sdcard/xxx");
// 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "receiver_userID", null, V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
// 图片上传进度,progress 取值 [0, 100]
}

@Override
public void onSuccess(V2TIMMessage message) {
// 图片消息发送成功
}

@Override
public void onError(int code, String desc) {
// 图片消息发送失败
}
});
// 获取本地图片路径
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"png"];
// 创建图片消息
V2TIMMessage *message = [[V2TIMManager sharedInstance] createImageMessage:imagePath];
// 发送消息
[[V2TIMManager sharedInstance] sendMessage:message
receiver:@"userID"
groupID:nil
priority:V2TIM_PRIORITY_DEFAULT
onlineUserOnly:NO
offlinePushInfo:nil
progress:^(uint32_t progress) {
// 图片上传进度,progress 取值 [0, 100]
} succ:^{
// 图片消息发送成功
} fail:^(int code, NSString *desc) {
// 图片消息发送失败
}];
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_;
};

// 创建图片消息
V2TIMMessage v2TIMMessage =
V2TIMManager::GetInstance()->GetMessageManager()->CreateImageMessage("./File/Xxx.jpg");
// 发送消息
auto callback = new SendCallback{};
callback->SetCallback(
[=](const V2TIMMessage& message) {
// 图片消息发送成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 图片消息发送失败
delete callback;
},
[=](uint32_t progress) {
// 图片上传进度,progress 取值 [0, 100]
});
V2TIMManager::GetInstance()->GetMessageManager()->SendMessage(
v2TIMMessage, "receiver_userID", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);

语音消息

创建语音消息需要先获取到本地语音文件路径和语音时长,其中语音时长可用于接收端 UI 显示。 发送消息过程中,会先将语音文件上传至服务器,同时回调上传进度。上传成功后再发送消息。
示例代码如下:
Android
iOS & Mac
Windows
// 创建语音消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createSoundMessage("/sdcard/xxx", 5);
// 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "receiver_userID", null, V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
// 语音上传进度,progress 取值 [0, 100]
}

@Override
public void onSuccess(V2TIMMessage message) {
// 语音消息发送成功
}

@Override
public void onError(int code, String desc) {
// 语音消息发送失败
}
});
// 获取本地语音文件路径
NSString *soundPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"m4a"];
// 获取语音素材的时长(时长仅用于 UI 显示)
AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:soundPath]];
CMTime time = [asset duration];
int duration = ceil(time.value/time.timescale);
// 创建语音消息
V2TIMMessage *message = [[V2TIMManager sharedInstance] createSoundMessage:soundPath duration:duration];
// 发送消息
[[V2TIMManager sharedInstance] sendMessage:message
receiver:@"userID"
groupID:nil
priority:V2TIM_PRIORITY_DEFAULT
onlineUserOnly:NO
offlinePushInfo:nil
progress:^(uint32_t progress) {
// 语音上传进度,progress 取值 [0, 100]
} succ:^{
// 语音消息发送成功
} fail:^(int code, NSString *desc) {
// 语音消息发送失败
}];
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_;
};

// 创建语音消息
V2TIMMessage v2TIMMessage =
V2TIMManager::GetInstance()->GetMessageManager()->CreateSoundMessage("./File/Xxx.mp3", 5);
// 发送消息
auto callback = new SendCallback{};
callback->SetCallback(
[=](const V2TIMMessage& message) {
// 语音消息发送成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 语音消息发送失败
delete callback;
},
[=](uint32_t progress) {
// 语音上传进度,progress 取值 [0, 100]
});
V2TIMManager::GetInstance()->GetMessageManager()->SendMessage(
v2TIMMessage, "receiver_userID", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);

视频消息

创建视频消息需要先获取到本地视频文件路径、视频时长和视频快照,其中时长和快照可用于接收端 UI 显示。 发送消息过程中,会先将视频上传至服务器,同时回调上传进度。上传成功后再发送消息。
示例代码如下:
Android
iOS & Mac
Windows
// 创建视频消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createVideoMessage("/sdcard/xxx", "mp4", 10, "/sdcard/xxx");
// 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "receiver_userID", null, V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
// 视频上传进度,progress 取值 [0, 100]
}

@Override
public void onSuccess(V2TIMMessage message) {
// 视频消息发送成功
}

@Override
public void onError(int code, String desc) {
// 视频消息发送失败
}
});
// 获取本地视频文件路径
NSString *videoPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"];
// 获取本地视频快照路径
NSString *snapShotPath = [[NSBundle mainBundle] pathForResource:@"testpng" ofType:@""];
// 获取视频时长
AVURLAsset *asset = [AVURLAsset assetWithURL:[NSURL fileURLWithPath:path]];
CMTime time = [asset duration];
int duration = ceil(time.value/time.timescale);
// 创建视频消息
V2TIMMessage *message = [[V2TIMManager sharedInstance] createVideoMessage:videoPath
type:@"mp4"
duration:duration
snapshotPath:snapShotPath];
// 发送消息
[[V2TIMManager sharedInstance] sendMessage:message
receiver:@"userID"
groupID:nil
priority:V2TIM_PRIORITY_DEFAULT
onlineUserOnly:NO
offlinePushInfo:nil
progress:^(uint32_t progress) {
// 视频上传进度,progress 取值 [0, 100]
} succ:^{
// 视频消息发送成功
} fail:^(int code, NSString *desc) {
// 视频消息发送失败
}];
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_;
};

// 创建视频消息
V2TIMMessage v2TIMMessage = V2TIMManager::GetInstance()->GetMessageManager()->CreateVideoMessage(
"./File/Xxx.mp4", "mp4", 10, "./File/Xxx.jpg");
// 发送消息
auto callback = new SendCallback{};
callback->SetCallback(
[=](const V2TIMMessage& message) {
// 视频消息发送成功
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
// 视频消息发送失败
delete callback;
},
[=](uint32_t progress) {
// 视频上传进度,progress 取值 [0, 100]
});
V2TIMManager::GetInstance()->GetMessageManager()->SendMessage(
v2TIMMessage, "receiver_userID", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);

文件消息

创建文件消息需要先获取到本地文件路径。 发送消息过程中,会先将文件上传至服务器,同时回调上传进度。上传成功后再发送消息。
示例代码如下:
Android
iOS & Mac
Windows
// 创建文件消息
V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createFileMessage("/sdcard/xxx", "文件名");
// 发送消息
V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "receiver_userID", null, V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
// 文件上传进度,progress 取值 [0, 100]
}

@Override
public void onSuccess(V2TIMMessage message) {
// 文件消息发送成功
}

@Override
public void onError(int code, String desc) {
// 文件消息发送失败
}
});
// 获取本地文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"];
// 创建文件消息
V2TIMMessage *message = [[V2TIMManager sharedInstance] createFileMessage:filePath fileName:@"发送文件消息"];
// 发送消息
[[V2TIMManager sharedInstance] sendMessage:message
receiver:@"userID"
groupID:nil
priority:V2TIM_PRIORITY_DEFAULT
onlineUserOnly:NO
offlinePushInfo:nil
progress:^(uint32_t progress) {
// 文件上传进度,progress 取值 [0, 100]
} succ:^{
// 文件消息发送成功
} fail:^(int code, NSString *desc) {
// 文件消息发送失败
}];
class SendCallback final : public V2TIMSendCallback {
public:
using SuccessCallback = std::function<void(const V2TIMMessage&)>;
using ErrorCallback = std::function<void(