一、功能描述
·发送消息方法在核心类 V2TIMManager 和 V2TIMMessageManager (Java) / V2TIMManager+Message (Swift 、Objective-C) 中。
·支持发送文本、自定义、富媒体消息,消息类型都是 V2TIMMessage。
·V2TIMMessage 中可以携带 V2TIMElem 的不同类型子类,表示不同类型的消息。
二、重点接口说明
注意:说明:
注意:1. 下文中提到的发消息高级接口,指的都是 sendMessage。
注意:2. 不同消息类型限制的文件大小,详细请参见 消息类型说明。
接口说明如下:
JavaSwiftObjective-CC++// V2TIMMessageManagerpublic abstract String sendMessage( V2TIMMessage message, String receiver, String groupID, int priority, boolean onlineUserOnly, V2TIMOfflinePushInfo offlinePushInfo, V2TIMSendCallback<V2TIMMessage> callback);public func sendMessage(message: V2TIMMessage, receiver: String?,groupID: String?, priority: V2TIMMessagePriority, onlineUserOnly: Bool, offlinePushInfo: V2TIMOfflinePushInfo?, progress: V2TIMProgress?, succ: V2TIMSucc?, fail: V2TIMFail?) -> String?// 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;// V2TIMMessageManagervirtual 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 | 如果设置为 YES,接收方历史消息拉取不到,常被用于实现 “对方正在输入” 或群组里的非重要提示等弱提示功能。 |
| offlinePushInfo | 离线推送信息 | YES | YES | 离线推送时携带的标题和内容。 |
| progress | 文件上传进度(iOS) | YES | YES | 文件上传进度。当发送消息中包含图片、语音、视频、文件等富媒体消息时才有效,纯文本、表情、定位消息不会回调。 |
| succ | 消息发送成功回调 | YES | YES | —— |
| fail | 消息发送失败回调 | YES | YES | 回调失败错误码、错误描述。 |
注意:如果 groupID 和 receiver 同时设置,表示给 receiver 发送定向群消息。详情请参考 群定向消息。
三、消息重点字段说明
消息全部字段的详细介绍请参考 消息介绍 文档,这里仅介绍其中的一些重点字段:
| 参数 | 含义 | 说明 |
| needReadReceipt | 消息是否需要已读回执 | 发送方设置。6.1 以上版本有效,需要购买旗舰版企业版套餐。详情可参见 已读回执。 |
| cloudCustomData | 消息自定义数据 | 发送方设置。内容由用户自定义。云端保存,会发送到对端,程序卸载重装后还能拉取到。 |
| isExcludedFromUnreadCount | 消息是否不计入会话未读数 | 发送方设置。默认为需要计入会话未读数。5.3.425 及以上版本支持。详情可参见 会话未读数。 |
| isExcludedFromLastMessage | 消息是否不计入会话 lastMsg | 发送方设置。默认为需要计入会话 lastMsg。5.4.666 及以上版本支持。详情可参见 会话列表。 |
| isExcludedFromContentModeration | 消息是否不过内容审核(云端审核) | 发送方设置。默认为需要过内容审核。7.1 及以上版本支持。只有在开通 云端审核功能 后设置才有效。 |
| disableCloudMessagePreHook | 是否禁用消息发送前云端回调 | 发送方设置。默认不禁用消息发送前云端回调。8.1 及以上版本支持。 |
| disableCloudMessagePostHook | 是否禁用消息发送后云端回调 | 发送方设置。默认不禁用消息发送后云端回调。8.1 及以上版本支持。 |
| localCustomData | 消息自定义数据 | 发送方和接收方都可以设置。本地保存,不会发送到对端,程序卸载重装后失效。 |
| localCustomInt | 消息自定义数据 | 发送方和接收方都可以设置。本地保存,不会发送到对端,程序卸载重装后失效。可以用来标记语音、视频消息是否已经播放。 |
四、发送文本消息
文本消息区分单聊和群聊,涉及的接口、传参有所区别。
发送文本消息可以采用两种接口:普通接口和高级接口。高级接口比普通接口能设置更多的发送参数(例如优先级、离线推送信息等)。
普通接口参考下文具体描述,高级接口就是上文中提到的 sendMessage。
六、普通接口
调用 sendC2CTextMessage (Java / Swift / Objective-C / C++) 发送单聊文本消息,直接传入消息内容和接收者的 userID 即可。
示例代码如下:
JavaSwiftObjective-CC++// 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,按需使用let msgID = V2TIMManager.shared.sendC2CTextMessage(text: "this is c2c message", to: "receiver_userID") { // 发送单聊文本消息成功 print("send c2c text message succ.") } fail: { code, desc in // 发送单聊文本消息失败 print("send c2c text message fail, code: \\(code), desc: \\(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 (Java / Swift / Objective-C / C++) 创建文本消息。
2. 调用 sendMessage (Java / Swift / Objective-C / C++) 发送消息。
示例代码如下:
JavaSwiftObjective-CC++// 创建文本消息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) { // 文本消息发送失败 }});// 创建文本消息let msg = V2TIMManager.shared.createTextMessage(text: "content") { // 发送消息 _ = V2TIMManager.shared.sendMessage(message: msg, receiver: "userID", groupID: nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in } succ: { print("createTextMessage & send succ.") } fail: { code, desc in print("createTextMessage &send c2c text message fail, code: \\(code), desc: \\(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 (Java / Swift / Objective-C / C++) 发送群聊文本消息,直接传递消息内容、群聊的 groupID 和消息优先级即可。
消息优先级可参考 V2TIMMessagePriority 定义。
示例代码如下:
JavaSwiftObjective-CC++// 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,按需使用let msgID = V2TIMManager.shared.sendGroupTextMessage(text: "this is group text message", to: "groupID", priority: .V2TIM_PRIORITY_DEFAULT, succ: nil, fail: nil)// 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 (Java / Swift / Objective-C / C++) 创建文本消息。
2. 调用 sendMessage (Java / Swift / Objective-C / C++) 发送消息。
示例代码如下:
JavaSwiftObjective-CC++// 创建文本消息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) { // 发送群聊文本消息失败 }});// 创建文本消息let msg = V2TIMManager.shared.createTextMessage(text: "content") { // 发送消息 _ = V2TIMManager.shared.sendMessage(message: msg, receiver: nil, groupID: "receiver_groupID", priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in } succ: { print("createTextMessage & send succ.") } fail: { code, desc in print("createTextMessage &send c2c text message fail, code: \\(code), desc: \\(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 (Java / Swift / Objective-C / C++),比普通接口能设置更多的发送参数(例如优先级、离线推送信息等)。
十三、普通接口
调用 sendC2CCustomMessage (Java / Swift / Objective-C / C++) 发送单聊自定义消息,直接传递消息二进制内容、单聊接收者 userID 即可。
示例代码如下:
JavaSwiftObjective-CC++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) { // 发送单聊自定义消息失败 }});let customData = "单聊自定义消息".data(using: .utf8) ?? Data()let msgID = V2TIMManager.shared.sendC2CCustomMessage(customData: customData, to: "receiver_userID", succ: { // 单聊自定义消息发送成功}) { code, desc in // 单聊自定义消息发送失败}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 (Java / Swift / Objective-C / C++) 创建自定义消息。
2. 调用 sendMessage (Java / Swift / Objective-C / C++) 发送消息。
示例代码如下:
JavaSwiftObjective-CC++// 创建自定义消息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) { // 发送单聊自定义消息失败 }});if let msg = V2TIMManager.shared.createCustomMessage(data: "单聊自定义消息".data(using: .utf8) ?? Data()) { _ = V2TIMManager.shared.sendMessage(message: msg, receiver: "receiver_userID", groupID: nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in } succ: { // 单聊自定义消息发送成功 } fail: { code, desc in // 单聊自定义消息发送失败 }}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 (Java / Swift / Objective-C / C++) 发送群聊自定义消息,直接传递消息二进制内容、群聊 groupID 和优先级即可。
消息优先级可参考 V2TIMMessagePriority 定义。
代码示例如下:
JavaSwiftObjective-CC++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) { // 发送群聊自定义消息失败 }});let customData = "群聊自定义消息".data(using: .utf8) ?? Data()let msgID = V2TIMManager.shared.sendGroupCustomMessage(customData: customData, to: "receiver_groupID", priority: .V2TIM_PRIORITY_DEFAULT, succ: { // 单聊自定义消息发送成功}) { code, desc in // 单聊自定义消息发送失败}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 (Java / Swift / Objective-C / C++) 创建自定义消息。
2. 调用 sendMessage (Java / Swift / Objective-C / C++) 发送消息。
代码示例如下:
JavaSwiftObjective-CC++// 创建自定义消息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) { // 发送群聊自定义消息失败 }});if let msg = V2TIMManager.shared.createCustomMessage(data: "自定义消息".data(using: .utf8) ?? Data()) { _ = V2TIMManager.shared.sendMessage(message: msg, receiver: nil, groupID: "receiver_groupID", priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in } succ: { // 群聊自定义消息发送成功 } fail: { code, desc in // 群聊自定义消息发送失败 }}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 (Java / Swift / Objective-C / C++) 发送消息。
3. 在消息回调中获取消息是否发送成功或失败。
十九、图片消息
创建图片消息需要先获取到本地图片路径。
发送消息过程中,会先将图片文件上传至服务器,同时回调上传进度。上传成功后再发送消息。
发送图片消息时,SDK 最大支持发送单个图片大小为28MB。
示例代码如下:
JavaSwiftObjective-CC++// 创建图片消息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) { // 图片消息发送失败 }});if let path = Bundle.main.path(forResource: "test", ofType: "png"), // 创建图片消息 let msg = V2TIMManager.shared.createImageMessage(imagePath: path) { // 发送消息 _ = V2TIMManager.shared.sendMessage(message: msg, receiver: "userID", groupID: nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in // 图片上传进度,progress 取值 [0, 100] } succ: { // 图片消息发送成功 } fail: { code, desc in // 图片消息发送失败 }}// 获取本地图片路径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);
20、语音消息
创建语音消息需要先获取到本地语音文件路径和语音时长,其中语音时长可用于接收端 UI 显示。
发送消息过程中,会先将语音文件上传至服务器,同时回调上传进度。上传成功后再发送消息。
示例代码如下:
JavaSwiftObjective-CC++// 创建语音消息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) { // 语音消息发送失败 }});//获取音频文件的路径func createSound() -> String? { let numberOne: Int = Int(arc4random()) if let path = Bundle.main.path(forResource: "00", ofType: "caf"), let url = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first?.appending("/\\(Date().timeIntervalSince1970)_\\(numberOne).caf"), let data = try? Data(contentsOf: URL(fileURLWithPath: path)) { try? data.write(to: URL(fileURLWithPath: url)) return url } return nil}func createAndSendSoundMessage() { if let path = self?.createSound(), //创建音频消息 let msg = V2TIMManager.shared.createSoundMessage(audioFilePath: path, duration: 30) { //发送音频消息 _ = V2TIMManager.shared.sendMessage(message: msg, receiver: "userID", groupID: nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in // 语音上传进度,progress 取值 [0, 100] } succ: { print("createSoundMessage & send succ") } fail: { code, desc in print("createSoundMessage &send c2c text message fail, code: \\(code), desc: \\(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);
21、视频消息
创建视频消息需要先获取到本地视频文件路径、视频时长和视频快照,其中时长和快照可用于接收端 UI 显示。
发送消息过程中,会先将视频上传至服务器,同时回调上传进度。上传成功后再发送消息。
示例代码如下:
JavaSwiftObjective-CC++// 创建视频消息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) { // 视频消息发送失败 }}); // 获取本地视频快照路径if let snappath = Bundle.main.path(forResource: "testpng", ofType: nil), // 获取本地视频文件路径 let path = Bundle.main.path(forResource: "test", ofType: "mp4"), // 创建视频消息 let msg = V2TIMManager.shared.createVideoMessage(videoFilePath: path, type: "mp4", duration: 30, snapshotPath: snappath) { // 发送消息 _ = V2TIMManager.shared.sendMessage(message: msg, receiver: "userID", groupID:nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in } succ: { print("createVideoMessage & send succ") } fail: { code, desc in print("createVideoMessage & send fail, \\(code), \\(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);
22、文件消息
创建文件消息需要先获取到本地文件路径。
发送消息过程中,会先将文件上传至服务器,同时回调上传进度。上传成功后再发送消息。
示例代码如下:
JavaSwiftObjective-CC++// 创建文件消息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) { // 文件消息发送失败 }});if let path = Bundle.main.path(forResource: "test", ofType: "mp4") , let msg = V2TIMManager.shared.createFileMessage(filePath: path, fileName: "name") { _ = V2TIMManager.shared.sendMessage(message: msg, receiver: "userID", groupID: nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in } succ: { // 文件消息发送成功 } fail: { code, desc in // 文件消息发送失败 }}// 获取本地文件路径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(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()->CreateFileMessage("./File/Xxx.zip", "文件名");// 发送消息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);
23、超大文件消息
创建文件消息传入的本地文件最大只支持 100 MB,如果你需要发送超过 100MB 的文件,可以先把文件上传到自己的业务服务器生成下载地址 URL,然后通过自定义消息把下载地址 URL 后发送出去,对端收到消息后解析 URL 并从自己的业务服务器下载文件。
示例代码如下:
JavaSwiftObjective-CC++// 获取本地文件路径String filePath = "/sdcard/test.zip";// 文件上传到自己的业务服务器生成下载地址 file_download_url,比如:https:…test.zip// 创建自定义消息,发送 file_download_url 信息JSONObject jsonObject = new JSONObject();try { jsonObject.put("file_download_url", "https:…test.zip");} catch (JSONException e) { e.printStackTrace();}String msgID = V2TIMManager.getInstance().sendC2CCustomMessage(jsonStr..toString().getBytes(), "receiver_userID", new V2TIMValueCallback<V2TIMMessage>() { @Override public void onSuccess(V2TIMMessage message) { // 发送单聊自定义消息成功 } @Override public void onError(int code, String desc) { // 发送单聊自定义消息失败 }});// 获取本地文件路径if let filePath = Bundle.main.path(forResource: "test", ofType: "zip") { print("File path: \\(filePath)") // 文件上传到自己的业务服务器生成下载地址 let fileDownloadURL = "https://…/test.zip" // 创建自定义消息,发送 file_download_url 信息 let param: [String: Any] = ["file_download_url": fileDownloadURL] do { let customData = try JSONSerialization.data(withJSONObject: param, options: []) print("Custom data: \\(String(data: customData, encoding: .utf8) ?? "")") let msgID = V2TIMManager.shared.sendC2CCustomMessage(customData: customData, to: "receiver_userID", succ: { // 单聊自定义消息发送成功 }) { code, desc in // 单聊自定义消息发送失败 } } catch { print("Error serializing JSON: \\(error)") }} else { print("File not found.")}// 获取本地文件路径NSString *filePath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"zip"];// 文件上传到自己的业务服务器生成下载地址 file_download_url, 比如 https:…test.zip// 创建自定义消息,发送 file_download_url 信息NSDictionary *param = @{@"file_download_url" : @"https:…test.zip"};NSError *error = nil;NSData *customData = [NSJSONSerialization dataWithJSONObject:param options:0 error:&error];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) { // 自定义消息不会回调进度 });// 文件上传到自己的业务服务器生成下载地址 file_download_url, 比如:https:…test.zip// 创建自定义消息,发送 file_download_url 信息V2TIMString str = u8"{\\"file_download_url\\" : \\"https:…test.zip\\"}";V2TIMBuffer customData = {reinterpret_cast<const uint8_t*>(str.CString()), str.Size()};V2TIMString msgID = V2TIMManager::GetInstance()->SendC2CCustomMessage(customData, "receiver_userID", callback);
24、定位消息
定位消息会直接发送经纬度,一般需要配合地图控件显示。
示例代码如下:
JavaSwiftObjective-CC++// 创建定位消息V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createLocationMessage("地理位置", 0.5, 0.5);// 发送消息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) { // 定位消息发送失败 }});if let msg = V2TIMManager.shared.createLocationMessage(desc: "发送地理位置消息", longitude: 2020, latitude: 2020) { _ = V2TIMManager.shared.sendMessage(message: msg, receiver: "userID", groupID: nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in } succ: { print("createLocationMessage & send succ") } fail: { code, desc in print("createLocationMessage & send fail, \\(code), \\(desc)") }}// 创建定位消息V2TIMMessage *message = [[V2TIMManager sharedInstance] createLocationMessage:@"发送地理位置消息" longitude:0.5 latitude:0.5];// 发送消息[[V2TIMManager sharedInstance] sendMessage:message receiver:@"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_;};// 创建定位消息V2TIMMessage v2TIMMessage = V2TIMManager::GetInstance()->GetMessageManager()->CreateLocationMessage("地理位置", 0.5, 0.5);// 发送消息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);
25、表情消息
表情消息会直接发送表情编码,通常接收端需要将其转换成对应的表情 icon。
示例代码如下:
JavaSwiftObjective-CC++// 创建表情消息V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createFaceMessage(1, "tt00".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) { // 表情消息发送失败 }});// 创建表情消息if let msg = V2TIMManager.shared.createFaceMessage(index: 0, data: nil) { // 发送消息 _ = V2TIMManager.shared.sendMessage(message: msg, receiver: "userID", groupID: nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in } succ: { // 表情消息发送成功 } fail: { code, desc in // 表情消息发送失败 }}// 创建表情消息V2TIMMessage *message = [[V2TIMManager sharedInstance] createFaceMessage:1 data:[@"tt00" dataUsingEncoding:NSUTF8StringEncoding]];// 发送消息[[V2TIMManager sharedInstance] sendMessage:message receiver:@"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"tt00";V2TIMBuffer data = {reinterpret_cast<const uint8_t*>(str.CString()), str.Size()};V2TIMMessage v2TIMMessage = V2TIMManager::GetInstance()->GetMessageManager()->CreateFaceMessage(1, data);// 发送消息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);
26、发送多个 Elem 的消息
如果你的消息需要多个 elem,可以在创建 Message 对象后,通过 Message 对象的 Elem 成员调用 appendElem (Java / Swift / Objective-C / C++) 方法添加下一个 elem 成员。
appendElem 仅支持在原有的 V2TIMElem(此 Elem 类型不限)后面追加 V2TIMTextElem、V2TIMCustomElem、V2TIMFaceElem 和 V2TIMLocationElem 四种类型的元素。
因此 “图片 + 文本”、“视频 + 文本”、“位置 + 文本” 这几种形式均可支持,但是 “图片 + 图片”、“文本 + 图片” 等不支持。
以文本消息 + 自定义消息为例,示例代码如下:
JavaSwiftObjective-CC++// 创建文本消息V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createTextMessage("test");// 创建自定义 elemV2TIMCustomElem customElem = new V2TIMCustomElem();customElem.setData("自定义消息".getBytes());// 将自定义 elem 添加到 message.textElem 中v2TIMMessage.getTextElem().appendElem(customElem);// 发送消息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) { // 多 elem 消息发送成功 } @Override public void onError(int code, String desc) { // 多 elem 消息发送失败 }});// 创建文本消息guard let message = V2TIMManager.shared.createTextMessage(text: "text") else { print("Failed to create text message.") return}// 创建自定义 elemlet customElem = V2TIMCustomElem()customElem.data = "自定义消息".data(using: .utf8)// 将自定义 elem 添加到 message.textElem 中message.textElem?.appendElem(element: customElem)// 发送消息V2TIMManager.shared.sendMessage(message: message, receiver: "userID", groupID: nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in // 处理发送进度} succ: { // 单聊自定义消息发送成功 print("Custom message sent successfully.")} fail: { code, desc in // 单聊自定义消息发送失败 print("Failed to send custom message: \\(code), \\(desc)")}// 创建文本消息V2TIMMessage *message = [[V2TIMManager sharedInstance] createTextMessage:@"text"];// 创建自定义 elemV2TIMCustomElem *customElem = [[V2TIMCustomElem alloc] init];customElem.data = [@"自定义消息" dataUsingEncoding:NSUTF8StringEncoding];// 将自定义 elem 添加到 message.textElem 中[message.textElem appendElem:customElem];// 发送消息[[V2TIMManager sharedInstance] sendMessage:message receiver:@"userID" groupID:nil priority:V2TIM_PRIORITY_DEFAULT onlineUserOnly:NO offlinePushInfo:nil progress:nil succ:^{ // 多 elem 消息发送成功} fail:^(int code, NSString *desc) { // 多 elem 消息发送失败}];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("test");// 创建自定义 elemV2TIMCustomElem customElem;V2TIMString str = u8"tt00";customElem.data = {reinterpret_cast<const uint8_t*>(str.CString()), str.Size()};// 将自定义 elem 添加到 message.elemList 中v2TIMMessage.elemList.PushBack(&customElem);// 发送消息auto callback = new SendCallback{};callback->SetCallback( [=](const V2TIMMessage& message) { // 多 elem 消息发送成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 多 elem 消息发送失败 delete callback; }, [=](uint32_t progress) { // 不回调进度 });V2TIMManager::GetInstance()->GetMessageManager()->SendMessage( v2TIMMessage, "receiver_userID", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);
27、接口限制
| 功能特性 | 限制项 | 限制说明 |
| 单聊/群聊/公众号消息 | 内容长度 | 单聊、群聊消息,单条消息最大长度限制为 12K。 |
| | 发送频率 | 单聊消息:客户端发送单聊消息无限制;REST API 发送有频率限制,可查看相应接口的文档。群聊消息:每个群限 40 条/秒(针对所有群类型、所有平台接口)。不同群内发消息,限频互不影响。 |
| | 接收频率 | 单聊和群聊均无限制。 |
| | 单个文件大小 | 发送文件消息时,SDK 最大支持发送单个文件大小为 100MB。 |
注意:说明:
更多限制请参见文档 使用限制。