集成方式

网易云通信以提供客户端SDK和服务端OPEN API 的形式提供即时通讯云服务。开发者只需想好APP 的创意及UI 展现方案,根据APP 业务需求选择网易云通信的相应功能接入即可。

注:跨平台 SDK 支持x86/x86-x64/ARM/MIPS架构。

SDK内容

目录结构:

nim
  |
  |-- include
    |
    |-- api
    |-- export_headers
    |-- util
  |-- libs
    |
    |-- x86
    |-- x86-x64

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

SDK数据目录

当收到多媒体消息后,SDK 会负责下载这些多媒体文件,同时SDK 还要记录一些log,因此SDK 需要一个数据缓存目录。该目录通过nim_client_init 初始化接口传入,默认为存放到当前用户的home目录。App 传入一个目录名即可,SDK 会自动生成用户数据缓存目录。数据缓存目录默认为"~/[传入的目录名]/NIM/[云信账号Md5]”,具体某个用户对应的缓存目录下面包含如下子目录:

SDK 提供了接口nim_tool_get_user_specific_appdata_dir 获取某个用户对应的具体类型的App data 目录(如图片消息文件存放目录,语音消息文件存放目录等)(注意:需要调用nim_global_free_buf 接口释放其返回的内存)。

接口调用与约定

SDK 提供的所有API 都是 C接口 ,根据模块划分为不同的API 文件。开发者在链接网易云通信动态库时可以使用隐式链接和显式链接两种方式,显式链接时,开发者可以在程序进行到任何时间点按需加载动态库,功能完成后如果不需要继续使用NIM可以卸载,更加灵活和节省内存,该模式下开发者只需要将SDK包里 include 目录下的模块定义头文件(命名方式如nim_xxx_def.h)加入到工程项目中;隐式链接下,需要将SDK包里ninclude 目录里的API 头文件(命名方式如nim_xxx.h)以及相关常量定义的头文件等其他头文件一并加入到工程项目中,程序编译时链接云信动态库。一般来说,每个模块都有对应的API 头文件和相关常量的定义头文件,命名上一一对应。下面以nim_client_init接口说明两种调用方式(后面文档中接口示例假定采用隐式链接)。

显式链接

typedef bool(*nim_client_init)(const char *app_data_dir, const char *app_install_dir, const char *json_extension);

nim_client_init init_func_ptr;
void* handle = dlopen("libnim.so", RTLD_LAZY);
if(handle)
{
    init_func_ptr = (nim_client_init)dlsym(handle, "nim_client_init");
    init_func_ptr(app_data_dir, app_install_dir, config_json);
}

隐式链接

#include "nim_client.h"

nim_client_init(app_data_dir, app_install_dir, config_json);

示例

  1. 隐式链接

     #include <stdio.h>
     #include <stdlib.h>
     #include <string.h>
     #include "api/nim_client.h"
     #include "api/nim_tools.h"
    
     void nim_login_cb_func(const char *json_params, const void *user_data)
     {
         printf("login callback:%s \n",json_params);
     }
    
     void nim_logout_cb_func(const char *json_params, const void *user_data)
     {
         printf("logout completed,begin to run cleanup ......\n");
         nim_client_cleanup(NULL);
     }
    
     int main()
     {
         //初始化SDK
         if(nim_client_init("nim_test",NULL,NULL))
         {
             //登录
             nim_client_login("YOUR-APP-KEY","ACCOUNT","PASSWROD",NULL,nim_login_cb_func,NULL);
             getchar();
             //注销
             nim_client_logout(kNIMLogoutAppExit,NULL,nim_logout_cb_func,NULL);
             printf("wait for logout ...... \n");
             getchar();
         }
         else
         {
             printf("nim init failed \n");
         }
         return 0;
     }

    编译:

     隐式链接动态库时需要设置环境变量LD_LIBRARY_PATH,在运行时系统才能正确加载动态库。
    
     export LD_LIBRARY_PATH=./libs/x86-x64:$LD_LIBRARY_PATH
    
     gcc main.c -I./include -I./include/export_headers -L./libs -lnim
  2. 显式链接

     #include <stdio.h>
     #include <dlfcn.h>
     #include "nim_client_def.h"
    
     //初始化和卸载
     typedef bool (*nim_client_init)(const char *app_data_dir, const char *app_install_dir, const char *json_extension);
     typedef void (*nim_client_cleanup)(const char *json_extension);
    
     //登录和退出
     typedef void (*nim_client_login)(const char *app_key, const char *account, const char *password,
                                     const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);
     typedef void (*nim_client_logout)(enum NIMLogoutType logout_type, const char *json_extension, nim_json_transport_cb_func cb, const void *user_data);
    
     //获取函数入口地址
     #define GET_FUNC(function_ptr) \
         (function_ptr)(dlsym(handle, #function_ptr) != NULL ? dlsym(handle, #function_ptr) : NULL)
    
     nim_client_init init_func_ptr;
     nim_client_cleanup cleanup_func_ptr;
     nim_client_login login_func_ptr;
     nim_client_logout logout_func_ptr;
    
     int load_nim_lib()
     {
         //从LD_LIBDARY_PATH路径中读取,或者使用完整路径
         void *handle = dlopen("libnim.so", RTLD_LAZY);
         if (!handle)
             return 0;
         init_func_ptr = GET_FUNC(nim_client_init);
         cleanup_func_ptr = GET_FUNC(nim_client_cleanup);
         login_func_ptr = GET_FUNC(nim_client_login);
         logout_func_ptr = GET_FUNC(nim_client_logout);
         return 1;
     }
    
     void nim_login_cb_func(const char *json_params, const void *user_data)
     {
         printf("login callback:%s \n", json_params);
     }
    
     void nim_logout_cb_func(const char *json_params, const void *user_data)
     {
         printf("logout completed,begin to run cleanup ......\n");
         cleanup_func_ptr(NULL);
     }
    
     int main()
     {
         if (load_nim_lib())
         {
             init_func_ptr("nim_test", NULL, NULL);
             login_func_ptr("YOUR-APP-KEY","ACCOUNT","PASSWROD",NULL,nim_login_cb_func,NULL);
             getchar();
             logout_func_ptr(kNIMLogoutAppExit, NULL, nim_logout_cb_func, NULL);
             printf("wait for logout ...... \n");
             getchar();
         }
         return 0;
     }

    编译:

     gcc main.c -I./include/export_headers -ldl