tencent cloud

文档反馈

Android&iOS&Windows&Mac

最后更新时间:2024-07-05 15:24:08

    功能描述

    某些场景下,您可能希望发出去的消息只被对端在线时接收,即当接收者不在线时就不会感知到该消息。 您只需在 sendMessage 时,将参数 onlineUserOnly 设置为 true/YES,此时发送出去的消息跟普通消息相比,会有如下差异点:
    1. 不支持离线存储。如果接收方不在线就无法收到。
    2. 不支持多端漫游。如果接收方在一台终端设备上一旦收到过该消息,无论是否已读,都不会在另一台终端上再次收到。
    3. 不支持本地存储。无法在本地的、云端的历史消息中找回。

    经典示例

    实现“对方正在输入”功能

    在 C2C 单聊场景下,您可以通过 sendMessage (Android / iOS & Mac / Windows) 发送指定的自定义在线消息,接收方收到该消息时判断是对端输入状态后,可以在 UI 界面展示 "对方正在输入",
    示例代码如下:
    Android
    iOS & Mac
    Windows
    // 给 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 发送 "自己正在输入" 的提示消息
    NSString *customStr = @"{\\"command\\": \\"textInput\\"}";
    NSData *customData = [customStr dataUsingEncoding:NSUTF8StringEncoding];
    V2TIMMessage *msg = [[V2TIMManager sharedInstance] createCustomMessage:customData];
    [[V2TIMManager sharedInstance] sendMessage:msg receiver:@"userA" groupID:nil
    priority: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);
    实际上,要实现一个完整的 “对方正在输入...” 的提示,利用 SDK 发送在线消息只是一个小环节,还需要很多开发工作,例如:
    用户界面监听及状态更新:在发送消息的输入框中添加事件监听器,检测用户何时开始输入。开始输入时,客户端更新用户的状态,例如“正在输入”。
    向服务器发送状态:在合适的时机将用户的输入状态发送到服务器。
    用户界面更新:根据接收到的输入状态,在接收端的用户界面上显示“对方正在输入”的提示,可以是一个文本提示、图标或动画。
    考虑节流:为了减少不必要的状态更新和通信开销,可以设定一个时间间隔,在此间隔内只发送一次输入状态更新。
    功能效果图如下所示:
    
    
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持