Windows(PC) SDK 开发手册(C++ 封装层)

IM开发

概述

Windows(PC) SDK对外暴露的是C接口,为了让桌面开发者更加方便快捷的接入SDK,我们基于C接口封装了C++ SDK,既可以让开发者方便直观的调用接口使用云信的服务,也可以供基于C接口开发的的开发者作为参考。

开发准备

可以通过官网下载SDK以及Demo源码,SDK包含C接口API文件和C++封装层的API文件及项目文件。

SDK内容

SDK不提供debug版本的动态链接库供开发者调试,如果遇到问题请联系技术支持或在线客服。

快速接入SDK

前往Windows(PC) SDK Getting Started

SDK C++封装层类讲解

SDK C++封装层代码在nim_cpp_sdk\下,主要封装了以下核心类:

此外,每个类都包含一个对应Helper文件,如nim_cpp_client.h对应nim_client_helper.h,主要包含接口需要的辅助方法和数据结构的定义。

接入SDK C++封装层

导入后注意调整平台工作集(属性-配置属性-常规),运行库(属性-配置属性-C/C++),附加包含目录(属性-配置属性-C/C++-常规),附加依赖项/附加库目录(属性-配置属性-库管理器)等。

初始化SDK

代码示例摘抄自DEMO源码,main.cpp。

static void InitNim()
{
    std::wstring server_conf_path = QPath::GetAppPath();
    server_conf_path.append(L"server_conf.txt");
    nim::SDKConfig config;
    TiXmlDocument document;
    if (shared::LoadXmlFromFile(document, server_conf_path))
    {
        TiXmlElement* root = document.RootElement();
        if (root)
        {
            bool use_private_server = false;
            Json::Value srv_config;
            if (auto pchar = root->Attribute("kNIMLbsAddress")) {
                config.lbs_address_ = pchar;
                use_private_server = true;
            }
            if (auto pchar = root->Attribute("kNIMNosLbsAddress")) {
                config.nos_lbs_address_ = pchar;
                use_private_server = true;
            }
            if (auto pchar = root->Attribute("kNIMDefaultLinkAddress")) {
                config.default_link_address_.push_back(pchar);
                use_private_server = true;
            }
            if (auto pchar = root->Attribute("kNIMDefaultNosUploadAddress")) {
                config.default_nos_upload_address_.push_back(pchar);
                use_private_server = true;
            }
            if (auto pchar = root->Attribute("kNIMDefaultNosDownloadAddress")) {
                config.default_nos_download_address_.push_back(pchar);
            }
            if (auto pchar = root->Attribute("kNIMDefaultNosAccessAddress")) {
                config.default_nos_access_address_.push_back(pchar);
                use_private_server = true;
            }
            if (auto pchar = root->Attribute("kNIMRsaPublicKeyModule")) {
                config.rsa_public_key_module_ = pchar;
                use_private_server = true;
            }
            if (auto pchar = root->Attribute("kNIMRsaVersion")) {
                nbase::StringToInt((std::string)pchar, &config.rsa_version_);
                use_private_server = true;
            }
            config.use_private_server_ = use_private_server;
        }
    }

    std::string app_key="xxxxx";
    //sdk能力参数(必填)
    config.database_encrypt_key_ = "Netease"; //string(db key必填,目前只支持最多32个字符的加密密钥!建议使用32个字符)

    bool ret = nim::Client::Init(app_key, "Netease", "", config); // 载入云信sdk,初始化安装目录和用户目录
    assert(ret);

    nim_ui::InitManager::GetInstance()->InitUiKit();
}

在程序退出前,调用接口:

代码摘抄自DEMO源码,nim_ui_init_manager.cpp。

void InitManager::CleanupUiKit()
{
    nim::Client::Cleanup();
}

登录与登出

基础消息功能

聊天室开发

概述

Windows(PC) 聊天室 SDK(以下简称SDK)对外暴露的是C接口,为了让桌面开发者更加方便快捷的接入SDK,我们基于C接口封装了C++ SDK,既可以让开发者方便直观的调用接口使用云信的服务,也可以供基于C接口开发的的开发者作为参考。

开发准备

可以通过官网下载SDK以及Demo源码,SDK包含C接口API文件和C++封装层的API文件及项目文件。

SDK内容

SDK C++封装层类讲解

SDK C++封装层代码在nim_cpp_sdk\下,主要封装了以下核心类:

此外,每个类都包含一个对应Helper文件,如nim_chatroom_helper.h,主要包含接口需要的辅助方法和数据结构的定义。

接入SDK C++封装层

当然,开发者也可以使用自己熟悉的json有关的第三方库,如果使用其他第三方库,需要手工调整C++ SDK源码中引用到jsoncpp对象的代码。

添加完第三方库后,还需要设置工程属性中,C/C++-常规中,附加包含目录添加第三方库的头文件路径(nim_chatroom_cpp_sdk\nim_chatroom_sdk_cpp_vs2010\third_party\jsoncpp\include),这样方便在代码中包含json所需的头文件。

导入后注意调整平台工作集(属性-配置属性-常规),运行库(属性-配置属性-C/C++),附加包含目录(属性-配置属性-C/C++-常规),附加依赖项/附加库目录(属性-配置属性-库管理器)等。

初始化SDK

代码示例摘抄自DEMO源码,main.cpp。

static void InitNim()
{
    ...
    bool ret = nim_chatroom::ChatRoom::Init();
}

在程序退出前,调用接口:

代码摘抄自DEMO源码,main.cpp。

void MainThread::Cleanup()
{
    nim_chatroom::ChatRoom::Cleanup();
}

进入和离开聊天室

进入聊天室回调函数:

*代码摘抄自DEMO源码,chatroom\_callback.cpp。*

    void ChatroomCallback::OnEnterCallback(__int64 room_id, const NIMChatRoomEnterStep step, int error_code, const ChatRoomInfo& info, const ChatRoomMemberInfo& my_info)
    {
        QLOG_APP(L"Chatroom:OnEnterCallback: id={0} step={1} code={2}") << room_id << step << error_code;

        if (step != kNIMChatRoomEnterStepRoomAuthOver)
            return;

        StdClosure cb = [=](){
            ChatroomForm* chat_form = static_cast<ChatroomForm*>(nim_ui::WindowsManager::GetInstance()->GetWindow(ChatroomForm::kClassName, nbase::Int64ToString16(room_id)));
            if (chat_form != NULL)
            {
                chat_form->OnEnterCallback(error_code, info, my_info);
            }
        };
        Post2UI(cb);
    }


**注意:**

SDK的回调函数并不会切换到用户调用接口时的线程,所以用户需要自行切换线程,例如上面源码中,通过调用Post2UI方法,将回调实际处理函数抛到主线程(UI线程)中运行。

基础消息功能

以发送文本消息为例。

*代码摘抄自DEMO源码,chatroom\_form\_msg.cpp。*

    void ChatroomForm::SendText(const std::string &text)
    {
        std::string my_id = nim_ui::LoginManager::GetInstance()->GetAccount();
        std::string send_msg = ChatRoom::CreateTextMessage(my_id, kNIMChatRoomMsgTypeText, QString::GetGUID(), text);
        ChatRoom::SendMsg(room_id_, send_msg);
    }