开发者中心
IM 即时通讯
IM 即时通讯
全部产品
中文
Windows
新手接入指南
产品介绍
简介
主要功能
接口及业务限制
功能介绍
帐号集成与登录
基础消息功能
群组功能
聊天室功能
聊天室标签功能
消息抄送服务
第三方回调功能
多端登录与互踢策略
质量数据监控台
更新日志
Demo 更新日志
SDK 更新日志
开发指南
概要介绍
集成方式
初始化
登录登出
消息收发
最近会话
历史记录
用户资料托管
好友关系托管
群组功能
超大群功能
聊天室
系统通知
事件订阅
语音录制与播放
NOS云存储服务
文档转换
API 参考
SDK API 文档
状态码
参考文档
升级指引
开发示例
UI库指南
Demo源码导读
IM平滑迁移方案
打包发布
类与常量定义说明
常见问题

升级指引

更新时间: 2021/07/22 20:18:41

sdk升级6.6.6及以上版本引导

当前使用SDK的痛点

1.SDK引入包含目录比较多,项目配置起来不方便

2.SDK C++封装层 nim与nim_chatroom中包含了许多重复代码

3.C++封装层静态库只提供了运行时库为md的项目

4.nim_demo引入的SDK与从官网上下载的SDK在代码层面上略有出入,升级SDK时需要进行代码对比

出于解决以上几个痛点的目的我们对6.6.6的SDK进行了目录调整,以使用户接入SDK更加快捷方便, 保持SDK与nim demo引入SDK的一致性, 满足不同用户对C++封装层的不同要求,例如以静态库(mt/md)或者动态库的方式引入,并对三方库的引入做了一些改变

SDK 目录结构变化

SDK 目录结构及主要文件介绍

nim_sdk ..................................................... SDK目录
    include ................................................. SDK 引入包含目录
        depend_lib .......................................... SDK C++封装层依赖库目录
            include ......................................... SDK C++封装层依赖库包含目录
                json ........................................ Json工具包含目录
                nim_json_util.h ............................. JSON工具辅助方法
                nim_sdk_util.h .............................. 提供加载/卸载SDK以及获取接口的方法
        nim_c_api.h ......................................... c im api引入文件
        nim_chatroom_c_api.h ................................ c chatroom api引入文件
        nim_cpp_api.h ....................................... c++ im api 引入文件
        nim_chatroom_cpp_api.h .............................. c++ chatroom api 引入文件
        nim_cpp_tools_api.h ................................. nim 工具类api 引入文件
    public_define ........................................... SDK 共公类型定义目录 c/c++都会引用到数据结构定义
        defines ............................................. im/chatroom/nim_tools数据类型定义目录
        util ................................................ 编译开关及基础类型定义目录
        nim_sdk_define_include.h ............................ im 公共数据类型定义引入文件
        nim_chatroom_define_include.h ....................... chatroom 公共数据类型定义引入文件
        nim_tool_define_include.h ........................... nim_tools 公共数据类型定义引入文件
        nim_util_include.h .................................. 基础类型定义引入文件
    src ..................................................... c api/c++封装层实现代码目录
        c_sdk ............................................... c api 定义代码目录                
        cpp_sdk ............................................. c++封装层代码目录
            depend_lib ...................................... c++封装层依赖库的实现代码目录
                cpp_wrapper_util_md.sln ..................... c++封装层依赖库 md/mdd 运行时库工程的解决方案文件
                cpp_wrapper_util_mt.sln ..................... c++封装层依赖库 mt/mtd 运行时库工程的解决方案文件
            nim ............................................. im c++封装层实现代码目录
                nim_sdk_cpp_wrapper_dll.vcxproj ............. im c++封装层动态库工程文件 
                nim_sdk_cpp_wrapper_lib_md.vcxproj .......... im c++封装层静态库 md/mdd 运行时库工程文件
                nim_sdk_cpp_wrapper_lib_mt.vcxproj .......... im c++封装层静态库 mt/mtd 运行时库工程文件
            nim_chatroom .................................... chatrooom c++封装层实现代码目录
                nim_chatroom_sdk_cpp_wrapper_dll.vcxproj .... chatrooom c++封装层动态库工程文件
                nim_chatroom_sdk_cpp_wrapper_lib_md.vcxproj . chatrooom c++封装层静态库 md/mdd 运行时库工程文件
                nim_chatroom_sdk_cpp_wrapper_lib_mt.vcxproj . chatrooom c++封装层静态库 mt/mtd 运行时库工程文件
            nim_tools ....................................... nim tools c++封装层实现代码目录
                audio ....................................... audio模块 c++封装层实现代码目录
                http ........................................ http模块 c++封装层实现代码目录
    libs .................................................... c++封装层(静态库)、依赖库输出目录
        win ................................................. windows平台库目录
            x86 ............................................. x86平台输出目录
            x64 ............................................. x64平台输出目录
        iOS ................................................. iOS平台库目录
        Mac ................................................. Mac平台库目录

升级注意事项

SDK 引入

文件包含目录

引入SDK时包含目录包含到nim_sdk目录即可,以im demo 的custom_app_sdk工程为例,如下图

c++封装层引入解决方案

C++封装层的工程文件在nim_sdk/src/nim/、nim_sdk/src/nim_chatroom/目录下,可以直接添加到解决方案中,以im demo为例如下图

静态库引入

C++封装层(静态库方式)缺省的输出目录为nim_sdk/libs/x86/md(mt)/、nim_sdk/libs/x64/md(mt)/,在库管理器中可以根据选择的运行时库指定附加依库目录到libs相应的目录并指定相应的静态库到附加依赖项中,以im demo 的custom_app_sdk工程为例,如下图

C++动态库的使用方式

C++封装层(静态库方式)缺省的输出目录为nim_sdk/bin/x86_dlls/、nim_sdk/bin/x64_dlls/,当以动态库的方式使用c++封装层时,可以将生成后的nim_sdk_cpp_wrapper_dll.dll/nim_sdk_cpp_wrapper_dll_d.dll、nim_chatroom_sdk_cpp_wrapper_dll.dll/nim_chatroom_sdk_cpp_wrapper_dll_d.dll拷贝到指定目录(例如exe的输出目录),以im demo的custom_app_sdk工程为例,如下图

C++封装层依赖库编译

C++封装层依赖库(depend_lib)预先生成了vs2013运行时库为md(mdd)/mt(mtd),debug/release版本的静态库,如果开发者需要不同vs版本(不同的平台工具集)的可静态库,以打开nim_sdk/src/cpp_sdk/depend_lib/cpp_wrapper_util_md.sln(cpp_wrapper_util_mt.sln),修改cpp_wrapper工程的平台工具集来生成相应的版本.

SDK回调应用层的异步实现

SDK在回调应用层时,如果应用层没有进行异步处理,可能会阻塞SDK内部线程,发生SDK没有响应、断线等问题,为了避免这种情况的发生,应用层在接收到SDK的回调时最好转为异步。SDK实现了指定异步回调的接口

/** @fn void SetCallbackFunction(const ChatRoom::SDKClosure& callback)
* 当以动态库使用SDK时 设置SDK回调方法,为了不阻塞SDK线程,在回调中应该把任务抛到应用层的线程中
* @param[in] callback	  回调方法
* @return void 无返回值
*/
static void SetCallbackFunction(const SDKClosure& callback);

以 im demo为例,其使用方法如下

nim::Client::SetCallbackFunction([](const StdClosure & task) {
	nbase::ThreadManager::PostTask(ThreadId::kThreadUI, task);
});

关于 nim_cpp_wrapper_util::Json

nim_cpp_wrapper_util::Json是把jsoncpp封装到了cpp_wrapper_util中,nim_cpp_wrapper_util::Json与json(jsoncpp)的转换可以参考以下代码(im demo中 nim_demo\tool_kits\shared\cpp_wrapper_util.h)

Json::Value NimCppWrapperJsonValueToJsonValue(const nim_cpp_wrapper_util::Json::Value& param)
{
    Json::Value ret;
    Json::Reader().parse(nim_cpp_wrapper_util::Json::FastWriter().write(param), ret);
    return ret;
}
nim_cpp_wrapper_util::Json::Value JsonValueToNimCppWrapperJsonValue(const Json::Value& param)
{
    nim_cpp_wrapper_util::Json::Value ret;
    nim_cpp_wrapper_util::Json::Reader().parse(Json::FastWriter().write(param), ret);
    return ret;
}
此文档是否对你有帮助?
有帮助
我要吐槽
文档反馈
  • sdk升级6.6.6及以上版本引导
  • 当前使用SDK的痛点
  • SDK 目录结构变化
  • SDK 目录结构及主要文件介绍
  • 升级注意事项
  • SDK 引入
  • 文件包含目录
  • c++封装层引入解决方案
  • 静态库引入
  • C++动态库的使用方式
  • C++封装层依赖库编译
  • SDK回调应用层的异步实现
  • 关于 nim_cpp_wrapper_util::Json