网易云信 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 的上下线事件) |
- CMake ≥ 3.19
- C 编译器 — GCC、Clang 或 MSVC
- 云信 AppKey — 在 云信控制台 创建应用获取
- 测试账号 — 至少创建两个 IM 账号(account + token),大部分示例需要一个辅助账号
- NIM 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 可能阻止运行未签名的动态库。如遇到「无法验证开发者」提示,对 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/ 目录下。
所有示例使用统一的凭证管理方式,支持以下来源(优先级由高到低):
- 命令行参数:
--appkey,--account,--token - Shell 环境变量:
NIM_APPKEY,NIM_ACCOUNT,NIM_TOKEN .env.local文件(gitignored,本地密钥).env文件(共享默认值)
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。
所有示例共享一套公共工具,封装了 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 异步回调) |