Skip to content

Repository files navigation

NIM SDK Samples

网易云信 IM C SDK 示例集,演示如何使用 find_package(NIM) 集成 SDK 并调用各模块接口。

目录结构

├── common/                          # 公共工具库(所有示例共用)
│   ├── nim_sample_util.{c,h}        #   SDK 初始化、登录/登出、CLI 参数解析
│   ├── event_loop.{c,h}             #   libuv 事件循环封装(主线程调度)
│   └── env_loader.{c,h}             #   .env / .env.local 文件加载器
├── auth/login/                      # 登录示例
├── message/send_receive/            # 发送/接收 P2P 文本消息
├── message/recall_msg/              # 发送后撤回消息
├── message/send_media/              # 发送图片/视频消息(自动上传)
├── friend/add_delete/               # 添加/删除好友
├── friend/get_friends/              # 获取好友列表、更新备注、查询好友关系
├── session/query_sessions/          # 最近会话管理(查询、未读数、删除)
├── team/create_team/                # 群组生命周期(创建、查询、更新、解散)
├── team/manage_members/             # 群成员管理(邀请、踢出)
├── user/name_card/                  # 用户名片管理(查询、更新)
├── user/blacklist_mute/             # 黑名单/静音名单管理
├── nos/upload_download/             # NOS 云存储文件上传/下载
├── signaling/call/                  # 独立信令呼叫/接听(双端协同)
├── subscribe_event/publish_subscribe/ # 事件发布与订阅
├── subscribe_event/subscribe_online/  # 在线状态订阅(双端协同)
├── .env.example                     # 凭证配置模板
├── .env.local                       # 本地凭证(gitignored)
└── CMakeLists.txt                   # 示例构建配置

示例一览

示例 可执行文件 说明
auth/login login_sample SDK 初始化、登录、查询登录状态、登出
message/send_receive send_receive_sample 发送 P2P 文本消息,注册接收回调等待回复
message/recall_msg recall_msg_sample 发送消息后撤回,注册撤回通知回调
message/send_media send_media_sample 发送 P2P 图片/视频消息,自动上传至 NOS 云端
friend/add_delete add_delete_sample 直接添加好友 → 获取好友资料 → 删除好友
friend/get_friends get_friends_sample 获取缓存好友列表、更新备注名、查询好友关系
session/query_sessions query_sessions_sample 查询所有最近会话、未读数管理、删除会话
team/create_team create_team_sample 创建群组 → 查询群信息 → 更新群名称 → 查询成员 → 解散
team/manage_members manage_members_sample 创建群组 → 查询群详细信息 → 邀请成员 → 踢出成员 → 解散
user/name_card name_card_sample 获取本地名片 → 更新名片 → 在线查询验证
user/blacklist_mute blacklist_mute_sample 添加/查询/移除黑名单和静音名单
nos/upload_download upload_download_sample 上传本地文件至 NOS 云端,下载到本地
signaling/call signaling_call_sample / signaling_callee_sample 独立信令呼叫/接听双端协同示例
subscribe_event/publish_subscribe publish_subscribe_sample 事件发布、订阅、查询、取消订阅
subscribe_event/subscribe_online subscribe_online_sample / online_publisher_sample 在线状态订阅双端协同示例(A 订阅 B 的上下线事件)

前置条件

  1. CMake ≥ 3.19
  2. C 编译器 — GCC、Clang 或 MSVC
  3. 云信 AppKey — 在 云信控制台 创建应用获取
  4. 测试账号 — 至少创建两个 IM 账号(account + token),大部分示例需要一个辅助账号
  5. NIM SDK — 见下方获取方式

获取 SDK

云信官网下载页 下载对应平台的 NIM C SDK 预编译包,解压到任意目录。解压后的典型结构如下:

nim-sdk/
├── include/                       # 头文件
│   └── nim/
└── lib/
    ├── libnim.dylib               # 动态库(macOS),Windows 为 nim.dll,Linux 为 libnim.so
    └── cmake/                     # ⬅ CMake 配置文件目录
        └── NIM/
            ├── NIMConfig.cmake
            ├── NIMConfigVersion.cmake
            └── NIMTargets.cmake

目录结构可能因平台/版本略有不同,关键是找到包含 NIMConfig.cmake 的目录(上例中为 nim-sdk/lib/cmake/NIM/)。

macOS 注意事项

macOS 可能阻止运行未签名的动态库。如遇到「无法验证开发者」提示,对 SDK 中的 dylib 执行签名:

codesign --force --sign - /path/to/nim-sdk/lib/libnim.dylib

构建示例

示例的 CMakeLists.txt 通过 find_package(NIM) 查找 SDK。CMake 的 find_package 机制会在 CMAKE_PREFIX_PATH 指定的路径下搜索 NIMConfig.cmake 配置文件,从中获取 SDK 的头文件路径、库文件路径及链接目标等信息。因此构建时必须通过 -DCMAKE_PREFIX_PATH 告知 CMake SDK 的安装位置。

CMAKE_PREFIX_PATH 应指向 NIMConfig.cmake 所在目录的上三级,即 SDK 解压后的根目录。以上方目录结构为例,NIMConfig.cmake 位于 nim-sdk/lib/cmake/NIM/,则 CMAKE_PREFIX_PATH 应设置为 nim-sdk/

# 配置 — 将 /path/to/nim-sdk 替换为你的 SDK 解压路径
cmake -B build -DCMAKE_PREFIX_PATH=/path/to/nim-sdk

# 编译所有示例
cmake --build build

# 或只编译某个示例
cmake --build build --target login_sample

找不到 SDK? 如果 CMake 报 Could not find a package configuration file provided by "NIM",说明 CMAKE_PREFIX_PATH 路径不正确。请确认该路径下存在 lib/cmake/NIM/NIMConfig.cmake

构建完成后,可执行文件在 build/ 目录下。

配置凭证

所有示例使用统一的凭证管理方式,支持以下来源(优先级由高到低):

  1. 命令行参数--appkey, --account, --token
  2. Shell 环境变量NIM_APPKEY, NIM_ACCOUNT, NIM_TOKEN
  3. .env.local 文件(gitignored,本地密钥)
  4. .env 文件(共享默认值)

推荐方式:使用 .env.local

cp .env.example .env.local

编辑 .env.local

NIM_APPKEY=your_app_key_here
NIM_ACCOUNT=your_account_here
NIM_TOKEN=your_token_here

# 辅助测试账号 — 大部分示例需要一个不同的目标账号
NIM_ASSIST_ACCOUNT=assist_account_here
NIM_ASSIST_TOKEN=assist_token_here

运行示例

# 使用 .env.local 配置(默认从当前目录加载)
./build/login_sample

# 或通过命令行参数
./build/login_sample --appkey YOUR_APPKEY --account YOUR_ACCOUNT --token YOUR_TOKEN

# 查看某个示例的帮助信息
./build/login_sample --help

公共参数

所有示例支持以下通用参数:

参数 说明 环境变量
--appkey <APPKEY> 应用 AppKey NIM_APPKEY
--account <ACCOUNT> 登录账号 NIM_ACCOUNT
--token <TOKEN> 登录 Token NIM_TOKEN
--env-dir <DIR> .env / .env.local 文件所在目录
--help 显示帮助信息

部分示例还需要额外参数(如 --assist-account--file 等),详见各示例 README。

公共工具库 (common/)

所有示例共享一套公共工具,封装了 SDK 初始化、登录、事件循环等样板代码:

  • nim_sample_util — 一站式 SDK 初始化 (nim_sample_init)、登录并运行事件循环 (nim_sample_login_and_run)、登出退出 (nim_sample_logout_and_exit)
  • event_loop — 基于 libuv 的事件循环,提供 nim_loop_post (线程安全回主线程) 和 nim_loop_post_delayed (延迟回调)
  • env_loader — 加载 .env / .env.local 文件中的环境变量

每个示例的 main 函数遵循统一范式:

int main(int argc, char* argv[]) {
    nim_sample_args_t args;
    nim_sample_parse_args(argc, argv, &args);       // 1. 解析参数 + 加载 .env

    if (nim_sample_init(&args, "sample_name", "db_key") != 0)  // 2. 初始化 SDK
        return 1;

    return nim_sample_login_and_run(&args, do_business, 30000); // 3. 登录 → 业务 → 登出
}

第三方依赖

示例通过 CMake FetchContent 自动下载,无需手动安装:

依赖 版本 用途
cJSON v1.7.18 JSON 序列化/反序列化(构造请求、解析回调)
libuv v1.50.0 跨平台事件循环(驱动 SDK 异步回调)

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages