一、功能描述
1. 不支持离线存储。如果接收方不在线就无法收到。
2. 不支持多端漫游。如果接收方在一台终端设备上一旦收到过该消息,无论是否已读,都不会在另一台终端上再次收到。
3. 不支持本地存储。无法在本地的、云端的历史消息中找回。
二、实现“对方正在输入”功能
在 C2C 单聊场景下,你可以通过 sendMessage (Java / Swift / Objective-C / C++) 发送指定的自定义在线消息,接收方收到该消息时判断是对端输入状态后,可以在 UI 界面展示 "对方正在输入"。
示例代码片段如下:
JavaSwiftObjective-CC++// 给 userA 发送 "正在输入" 的提示消息JSONObject jsonObject = new JSONObject();try { jsonObject.put("command", "textInput");} catch (JSONException e) { e.printStackTrace();}V2TIMMessage v2TIMMessage = V2TIMManager.getMessageManager().createCustomMessage(jsonObject.toString().getBytes());V2TIMManager.getMessageManager().sendMessage(v2TIMMessage, "userA", null, V2TIMMessage.V2TIM_PRIORITY_DEFAULT, true, v2TIMOfflinePushInfo, new V2TIMSendCallback<V2TIMMessage>() { @Override public void onError(int code, String desc) {} @Override public void onSuccess(V2TIMMessage v2TIMMessage) {} @Override public void onProgress(int progress) {}});// 给 userA 发送 "自己正在输入" 的提示消息let customStr = "{\\"command\\": \\"textInput\\"}"if let customData = customStr.data(using: .utf8) { if let message = V2TIMManager.shared.createCustomMessage(data: customData) { // 发送消息 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)") } }}// 给 userA 发送 "自己正在输入" 的提示消息NSString *customStr = @"{\\"command\\": \\"textInput\\"}";NSData *customData = [customStr dataUsingEncoding:NSUTF8StringEncoding];V2TIMMessage *msg = [[V2TIMManager sharedInstance] createCustomMessage:customData];[[V2TIMManager sharedInstance] sendMessage:msg receiver:@"userA" groupID:nilpriority:V2TIM_PRIORITY_DEFAULT onlineUserOnly:YES offlinePushInfo:nil progress:^(uint32_t progress) {} 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_;};// 给 userA 发送 "正在输入" 的提示消息std::string str{u8"{\\"command\\": \\"textInput\\"}"};V2TIMBuffer data = {reinterpret_cast<const uint8_t*>(str.data()), str.size()};V2TIMMessage message = V2TIMManager::GetInstance()->GetMessageManager()->CreateCustomMessage(data, description, extension);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( message, "userA", {}, V2TIMMessagePriority::V2TIM_PRIORITY_DEFAULT, true, {}, callback);
实际上,要实现一个完整的 “对方正在输入…” 的提示,利用 IM SDK 发送在线消息只是一个小环节,还需要很多开发工作,例如:
·用户界面监听及状态更新:在发送消息的输入框中添加事件监听器,检测用户何时开始输入。开始输入时,客户端更新用户的状态,例如“正在输入”。
·向服务器发送状态:在合适的时机将用户的输入状态发送到服务器。
·用户界面更新:根据接收到的输入状态,在接收端的用户界面上显示“对方正在输入”的提示,可以是一个文本提示、图标或动画。
·考虑节流:为了减少不必要的状态更新和通信开销,可以设定一个时间间隔,在此间隔内只发送一次输入状态更新。
我们的 TUIKit 库已经实现了上述功能,你只需要集成 TUIKit 组件并开启该功能,即可立即获得“对方正在输入”,实际功能效果图如下所示:
详情可参见聊天互动文档《对方正在输入》(Android / iOS)。