消息收发

发送消息

SDK(PC) 支持文本、图片、音频、视频、地理位置、通知消息、提醒消息、文件消息、机器人消息和自定义消息等多种种类型消息。

参数 类型 说明
json_msg(C/C++) string 消息体Json字符串,C接口需要自行组装Json数据结构并序列化为无格式的Json字符串,
C++接口可以通过Talk::CreateXXXMessage方法生成(具体见本章辅助API介绍)
message(C#) object 消息对象,见NIMIMMessage
prg_cb/pcb/action function 上传进度的回调函数, 如果发送的消息里包含了文件资源,
则通过此回调函数通知上传进度
json_extension(C) string json扩展参数(备用,目前不需要)
user_data(C) void* APP的自定义用户数据,SDK只负责传回给回调函数cb,
不做任何处理
参数 类型 必须 说明
client_msg_id(C++) string 停止发送的消息对象的client_msg_id
message(C#) object 停止发送的消息对象,见NIMIMMessage
json_msg(C) string 停止发送的消息对象Json string
json_extension(C) string json扩展参数(备用,目前不需要)

文字消息

图片消息

文件消息

语音消息

短视频消息

位置消息

提醒消息

机器人消息

自定义消息

除了内建消息类型外,SDK 也支持收发自定义消息类型。和透传消息一样,SDK 也不会解析自定义消息的具体内容,解释工作由开发者完成。

消息属性设置

发送消息还提供了以下消息属性设置:

针对群组消息,提供强推属性设置(可以用于实现@功能等)和群消息已读回执属性:

配合群消息已读回执业务,当接收到群消息后,可以根据以下字段来实现已读回执业务:

反垃圾字段:

多端推送开关

C++

void OnMultiportPushConfigChange(int rescode, bool switch_on)
{
    if (rescode == nim::kNIMResSuccess)
    {
        ···
    }
}

void OnInit()
{
    //登录前注册的全局回调获取当前多端推送开关状态
    nim::Client::RegSyncMultiportPushConfigCb(&OnMultiportPushConfigChange);
}

void SetMultiportConfig(bool switch_on)
{
    //当PC/Web端在线时,可以配置消息是否推送给移动端
    nim::Client::SetMultiportPushConfigAsync(switch_on, &OnMultiportPushConfigChange);
}

void GetMultiportConfig()
{
    //主动获取当前多端推送开关状态
    nim::Client::GetMultiportPushConfigAsync(&OnMultiportPushConfigChange);
}

C#

public delegate void ConfigMultiportPushDelegate(ResponseCode response,ConfigMultiportPushParam param)
{
     if (response == ResponseCode.kNIMResSuccess)
    {
        ···
    }
}

/// <summary>
/// 开启多端推送
/// </summary>
/// <param name="cb">操作结果委托</param>
public static void EnableMultiportPush(ConfigMultiportPushDelegate cb)
{
    ConfigMultiportPushParam param = new ConfigMultiportPushParam();
    param.Enabled = true;
    var ptr = DelegateConverter.ConvertToIntPtr(cb);
    ClientNativeMethods.nim_client_set_multiport_push_config(param.Serialize(), null, ConfigMultiportPushCb, ptr);
}

/// <summary>
/// 禁止多端推送
/// </summary>
/// <param name="cb">操作结果委托</param>
public static void DisableMultiportPush(ConfigMultiportPushDelegate cb)
{
    ConfigMultiportPushParam param = new ConfigMultiportPushParam();
    param.Enabled = false;
    var ptr = DelegateConverter.ConvertToIntPtr(cb);
    ClientNativeMethods.nim_client_set_multiport_push_config(param.Serialize(), null, ConfigMultiportPushCb, ptr);
}

/// <summary>
/// 获取多端推送控制开关
/// </summary>
/// <param name="cb"></param>
public static void IsMultiportPushEnabled(ConfigMultiportPushDelegate cb)
{
    var ptr = DelegateConverter.ConvertToIntPtr(cb);
    ClientNativeMethods.nim_client_get_multiport_push_config(null, ConfigMultiportPushCb, ptr);
}

/// <summary>
/// 注册多端推送设置同步回调
/// </summary>
/// <param name="cb"></param>
public static void RegMulitiportPushEnableChangedCb(ConfigMultiportPushDelegate cb)
{
    var ptr = DelegateConverter.ConvertToIntPtr(cb);
    ClientNativeMethods.nim_client_reg_sync_multiport_push_config_cb(null, OnMultiportPushEnableChanged, ptr);
}

C

static void CallbackMultiportPushConfig(int rescode, const char *content, const char *json_extension, const void *user_data)
{
    Json::Value values;
    Json::Reader reader;
    if (rescode == nim::kNIMResSuccess && reader.parse(content, values) && values.isObject())
    {
        bool open = values[kNIMMultiportPushConfigContentKeyOpen].asInt() == 1;
        ···
    }
}

typedef void(*nim_client_reg_sync_multiport_push_config_cb)(const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);
typedef void(*nim_client_set_multiport_push_config)(const char *switch_content, const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);
typedef void(*nim_client_get_multiport_push_config)(const char *json_extension, nim_client_multiport_push_config_cb_func cb, const void *user_data);

void OnInit()
{
    //登录前注册的全局回调获取当前多端推送开关状态
    nim_client_reg_sync_multiport_push_config_cb func = (nim_client_reg_sync_multiport_push_config_cb) GetProcAddress(hInst, "nim_client_reg_sync_multiport_push_config_cb");
    func("", &CallbackMultiportPushConfig, nullptr);
}

void SetMultiportConfig(bool switch_on)
{
    //当PC/Web端在线时,可以配置消息是否推送给移动端
    nim_client_set_multiport_push_config func = (nim_client_set_multiport_push_config) GetProcAddress(hInst, "nim_client_set_multiport_push_config");
    func(switch_on, "", &CallbackMultiportPushConfig, nullptr);
}

void GetMultiportConfig()
{
    //主动获取当前多端推送开关状态
    nim_client_get_multiport_push_config func = (nim_client_get_multiport_push_config) GetProcAddress(hInst, "nim_client_get_multiport_push_config");
    func("", &CallbackMultiportPushConfig, nullptr);
}

消息接收

开发者在登陆SDK之前需要提前注册消息接收的全局广播通知。

API介绍

示例

转发消息

用户通过构造API获取新的消息对象,然后调用发送消息接口。

构造API介绍

示例

消息撤回

用户通过发送消息发的消息或者群主、管理员可以通过该接口执行撤回操作(不支持聊天室消息),撤回操作一般有时限限制(该限制为全局的APP设置),超过限制返回508。 开发者通过注册撤回消息通知回调,接收其他端的撤回消息的通知,收到通知后SDK会标记主动在消息历史中标记该条消息为删除状态,同时开发者根据自身需求,删除界面上显示的消息,甚至插入一条提示,IM Demo有开发示例。

API介绍

参数说明

参数 类型 说明
msg(C++) struct 撤回消息的对象,见IMMessage
msgId(C#) string 撤回消息的客户端消息ID
json_msg(C) string 撤回消息的Json string
notify string 自定义通知
cb function 回调函数
json_extension string json扩展参数(备用,目前不需要)
user_data void* APP的自定义用户数据,SDK只负责传回给回调函数cb,不做任何处理

示例

已读回执

在会话界面中调用发送已读回执的接口并传入最后一条消息,即表示这之前的消息都已读,对端将收到此回执。在5.0.0版本开始,SDK支持群消息已读业务。

API介绍

参数说明

参数 类型 说明
msg(C#) struct 已读消息的对象,见NIMIMMessage
json_msg(C/C++) string 标记已读消息的Json string
cb function 回调函数
json_extension string json扩展参数(备用,目前不需要)
user_data void* APP的自定义用户数据,SDK只负责传回给回调函数cb,不做任何处理
参数 类型 说明
tid string 群id
msgs(C++) std::list 标记已读消息的对象,见NIMIMMessage
msgs(C) json array string 标记已读消息的Json string
cb function 回调函数
json_extension string json扩展参数(备用,目前不需要)
user_data void* APP的自定义用户数据,SDK只负责传回给回调函数cb,不做任何处理

示例

多媒体消息

语音转文字

SDK 提供语音转文字接口。

void nim_tool_get_audio_text_async(const char *json_audio_info, const char *json_extension, nim_tool_get_audio_text_cb_func cb, const void *user_data);

例:

C++

void foo(nim::IMMessage &msg_data)
{
    nim::IMAudio audio;
    nim::Talk::ParseAudioMessageAttach(msg_data, audio);
    nim::AudioInfo audio_info;
    audio_info.samplerate_ = "16000";
    audio_info.url_ = audio.url_;
    audio_info.duration_ = audio.duration_;
    audio_info.mime_type_ = audio.file_extension_;

    nim::Tool::GetAudioTextAsync(audio_info, ToWeakCallback([this](int rescode, const std::string& text) {
        if (rescode == nim::kNIMResSuccess) {
            ···
        }
        else {
            ···
        }
    }));
}

C#

private void foo(NIM.NIMIMMessage msg)
{
    NIM.NIMAudioInfo info = new NIMAudioInfo();
    info.Duration = 1000;
    info.SampleRate = "16000";
    info.URL = "···";
    info.MimeType = "aac";
    NIM.ToolsAPI.GetAudioTextAsync(info, "", OnGetText);
}
private void OnGetText(int rescode, string text, string json_extension, IntPtr user_data)
{
}

C

void CallbackGetAudioText(int rescode, const char *text, const char *json_extension, const void *user_data)
{
    ...
}

typedef void(*nim_tool_get_audio_text_async)(const char *json_audio_info, const char *json_extension, nim_tool_get_audio_text_cb_func cb, const void *user_data);

void foo()
{
    Json::Value json_value;
    json_value[nim::kNIMTransAudioKeyMime] = ; //mime类型
    json_value[nim::kNIMTransAudioKeySample] = ; //采样率
    json_value[nim::kNIMTransAudioKeyAudioUrl] = ; //下载地址
    json_value[nim::kNIMTransAudioKeyDuration] = ; //时长(毫秒)

    nim_tool_get_audio_text_async func = (nim_tool_get_audio_text_async) GetProcAddress(hInst, "nim_tool_get_audio_text_async");
    func(json_value.toStyledString().c_str(), nullptr, &CallbackGetAudioText, nullptr);
}

获取图片缩略图

网易云通信PC SDK目前默认收到图片消息后会提前下载原图缓存到本地,如果开发者想控制下载图片的质量,可以通过初始化SDK时设置kNIMPreloadImageQuality来控制图片质量,设置kNIMPreloadImageResize来控制图片长宽, IM Demo开发范例中默认下载原图,所以开发者如果想基于IM Demo工程源码开发,需要在图片预览环节或者其他需要显示原图的地方自行下载原图。

以下但不限于以下场景下开发者可以自行下载缩略图:

目前SDK提供两种获取缩略图方案:

目前IM Demo工程在消息显示图片的时候对图片进行了压缩处理,开发者可以参考bubble_image.cpp

获取视频封面

网易云通信PC SDK目前默认收到视频消息后会提前下载视频封面(视频第1秒的截图)缓存到本地。如开发者有其它应用场景可以参考以下方法进行视频指定帧数下载:

请求链接格式如下:
http(s)://xxx?vframe&offset=1&resize=300x300&type=jpg;
参数说明

名称 描述 是否必须
vframe 视频截图的操作标记
offset 从第几秒开始截,缺省为0
resize widthxheight,宽和高
crop crop=x_y_width_height 表示从原坐标(x, y)处截取width*height的子图片
type 图片格式,默认为jpg

开发者可以参考 IM Demo的bubble_video.cpp