Android 和 iOS 可以免费使用,其中iOS可以直接配置 IM_SERVER_HOST来设定服务地址。Android需要联系我们免费获取SDK。
因反诈合规要求,本项目协议栈默认仅支持连接野火官方服务,不能连接到自行部署的服务。如需获取不受限版本,请联系官方微信(wfchat 或 wildfirechat)免费申请。
联系官方获取到不受限版本后,请替换
./imclient/android/android_client_aars/mars-core-release.aar文件,并重新编译。
其他平台,包括Windows/Mac/Linux/Harmony平台是付费的,需要联系我们申请试用或者购买,请联系官方微信(wfchat 或 wildfirechat)申请试用。
野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。
主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。详细情况请参考在线文档。
主要包括一下项目:
| GitHub仓库地址(主站) | 码云仓库地址(镜像) | 说明 | 备注 |
|---|---|---|---|
| android-chat | android-chat | 野火IM Android SDK源码和App源码 | 可以很方便地进行二次开发,或集成到现有应用当中 |
| ios-chat | ios-chat | 野火IM iOS SDK源码和App源码 | 可以很方便地进行二次开发,或集成到现有应用当中 |
| pc-chat | pc-chat | 基于Electron开发的PC平台应用 | |
| web-chat | web-chat | Web平台的Demo, 体验地址 | |
| wx-chat | wx-chat | 微信小程序平台的Demo | |
| server | server | IM server | |
| app server | app server | 应用服务端 | |
| robot_server | robot_server | 机器人服务端 | |
| push_server | push_server | 推送服务器 | |
| docs | docs | 野火IM相关文档,包含设计、概念、开发、使用说明,在线查看 |
- 如果大家发现bug,请在GitHub或码云提issue;如果有需求也请给我们提issue。
- 其他问题,请到野火IM论坛进行交流学习
- 关注我们的公众号。我们有新版本发布或者有重大更新会通过公众号通知大家,另外我们也会不定期的发布一些关于野火IM的技术介绍。
我们有核心研发工程师轮流值班处理issue和论坛,会及时处理的,疑难Bug的修改和新需求的开发我们也会尽快解决。
野火Flutter版 客户端, 支持 Android、iOS、原生鸿蒙和桌面端(Windows、macOS、Linux),包含即时通讯插件和实时音视频插件。不支持龙芯和申威CPU(因为flutter不支持),其他国产操作系统和CPU都支持。
- 一套代码全平台覆盖:Android、iOS、原生鸿蒙、Windows、macOS、Linux 共用同一套 Dart UI 与业务逻辑;IM 底层按平台分流——移动端走原生插件(iOS/Android),桌面端走 dart:ffi 直连 libMarsWrapper,鸿蒙走 HAR,对上层暴露统一的
imclientDart API。 - PC 桌面端深度适配(对齐常见即时通讯 PC 体验):三栏式桌面 Shell、系统托盘、微信式沉浸标题栏;完整的桌面多窗口体系——音视频通话、图片视频预览、朋友圈、会话内搜索均为独立窗口,并有统一的多窗口公共层(窗口基类/管理器/事件通道/IM 调用代理)。
- 音视频通话:单人/多人/会议全支持;移动端可最小化为可拖动悬浮窗(语音显示图标+时长,视频显示远端画面或对方头像,未接通也可最小化);PC 端通话在独立窗口进行;iOS 已集成 CallKit 系统来电界面。
- 会话内消息查找:关键字搜索(分页、高亮、搜索历史)、按文件/图片与视频/链接/日期(日历)分类查找、点结果精确定位到消息上下文、定位后可一键"回到最新";PC 端为独立的"聊天记录"窗口。
- 朋友圈:自研
moment包(SDK + UI 一体),支持发布图文/视频、评论、点赞、可见范围、背景图设置、按用户查看;移动端发现页进入,PC 端为独立窗口(封面全宽 + 内容居中)。 - 消息体验细节:消息时间分隔(2 分钟规则、星期几格式)、双击"消息"tab 滚动到第一个未读会话、通话消息卡片(状态+时长+类型图标,点击重拨)、收藏、消息多选转发。
- 系统能力集成:iOS CallKit 与 Share Extension(从系统分享面板直接分享到会话)、PC 三平台开机自启动(设置-通用内开关)、桌面端 flameshot 截图发送。
本项目桌面端截图:macOS 使用苹果原生 ScreenCaptureKit(自研覆盖窗 + 标注编辑器,见 chat/macos/Runner/Screenshot/);Windows/Linux 使用 flameshot 作为独立截图工具,通过 Process.run 调起。详细的构建、打包、权限与许可证说明请参考 SCREENSHOT.md。
macOS 沙盒:截图使用 ScreenCaptureKit,沙盒兼容(首次使用需在 系统设置 → 隐私与安全性 → 屏幕录制 授权)。
Release.entitlements已开启com.apple.security.app-sandbox,对外分发(Developer ID + 公证)或上架 Mac App Store 均可,流程见 MACOS_DISTRIBUTION.md。
- Android Studio 会跟随官方更新,一直使用最新版本
- 由于 gradle 版本和 flutter 版本有依赖关系,会使用对应的 gradle 版本,目前是
8.7 - Flutter 版本:鸿蒙开发必须使用鸿蒙适配版 Flutter,其他平台使用官方版本,详见下方「鸿蒙(OHOS)开发指南」
鸿蒙相关的注意事项集中在本节:SDK 费用、Flutter 版本、镜像配置、依赖切换与常见问题。
鸿蒙版所依赖的野火IM鸿蒙 SDK 是付费的,可申请试用(联系方式见顶部「重要声明」)。
- 开发鸿蒙必须使用鸿蒙适配版 Flutter,当前开发版本为
3.35.8-ohos(Dart 3.9.x);其他平台使用官方 Flutter。 - 请参考 这儿 安装和配置 Flutter,使用该仓库 3.35.x 系列的鸿蒙适配分支。安装和配置很简单,下载下来解压,然后配置一下环境变量就好了。
- IDE 开发运行时,需要确保使用的是鸿蒙适配版。
由于目标是能兼容原生鸿蒙,有的包只能从镜像下载,不配置镜像的话,可能下载不到:
# Linux、macOS
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
# windows
setx PUB_HOSTED_URL "https://pub.flutter-io.cn"
setx FLUTTER_STORAGE_BASE_URL "https://storage.flutter-io.cn"
项目内所有包的 dependencies 均使用 pub.dev 标准版;鸿蒙适配版(gitcode 上的 openharmony-sig / openharmony-tpc fork)统一集中在根工程 chat/pubspec.yaml 的 dependency_overrides 中,由 [ohos-begin] 和 [ohos-end] 注释标记围成一个区块。
- 构建鸿蒙版本:启用该区块(取消区块内各条目的注释;仓库当前默认该区块处于注释状态,即标准版依赖)。注意同时要把区块上方的
flutter_webrtc本地补丁 override 注释掉,否则dependency_overrides中flutter_webrtc出现两次,pub 会报重复 key。然后执行flutter pub get。 - 构建标准版本(Android/iOS/Windows/macOS/Linux):把
[ohos-begin]到[ohos-end]之间的内容整体注释掉,然后执行flutter pub get,所有依赖即回退到 pub.dev 标准版。
注意事项:
- 切换后必须重新执行
flutter pub get,并建议提交代码前确认chat/pubspec.lock的变更符合预期。 - 区块内包含仅鸿蒙需要的
permission_handler_ohos插件,注释区块时会一并移除,无需单独处理。 file_picker的鸿蒙 fork 依赖web ^0.5.1,与flutter_localization鸿蒙版依赖的web ^1.1.1冲突,因此它和fluttertoast、flutter_local_notifications、mobile_scanner、flutter_webrtc的鸿蒙 fork 默认未启用(保持标准版),在区块内以注释形式保留,确有需要时可单独启用。- 切换时若遇到 gitcode 拉取失败(exit 128),重试
flutter pub get即可。 - iOS/mac 平台切换后需同步更新 pod 依赖,否则
Podfile.lock中锁定的旧版本会与新解析的插件版本冲突(典型报错:CocoaPods could not find compatible versions for pod "xxx"):例如cd chat/ios 或 cd chat/macos pod install --repo-update # 或者针对报错的 pod 单独执行:pod update <pod名>
flutter_sound当前在标准版固定为 9.28.0,若Podfile.lock中锁定的是其他版本,需执行pod update flutter_sound_core。
- 鸿蒙上提示包找不到,请从 flutter_packages 查询已适配鸿蒙平台的版本,并固定为该版本。
- MSVC 2022(其他版本测试都有问题,有些依赖编译不过去)
进入到项目工程目录下,依次执行下述命令:
cd chat && flutter packages get && cd ..cd chat/ios/ && pod install && cd ..(仅iOS平台需要)cd chat/macos/ && pod install && cd ..(仅Mac平台需要)cd chat && flutter run --debug -d ${设备 id}
- 确保使用对应平台的官方 Flutter SDK。
- 进入
chat目录执行flutter packages get。 - 运行对应命令:
- macOS:
flutter run -d macos或flutter build macos - Windows:
flutter run -d windows或flutter build windows需安装 Visual Studio 2022,完整环境配置说明,请参考 Set up Windows development
- Linux:
flutter run -d linux或flutter build linuxLinux 环境配置说明,请参考 Setup Linux development
- macOS:
- 桌面端已支持音视频通话(在独立窗口进行)、图片/视频预览、朋友圈、会话内搜索("聊天记录"窗口)等功能;拍照等移动端特有的功能在桌面端不显示。
- macOS 版对外分发(Developer ID 签名 + 公证 + 打包 DMG)的完整流程,请参考 MACOS_DISTRIBUTION.md。
-
在项目的
pubspec.yaml文件依赖配置中,添加如下内容。其中${path_to_imclient}和${path_to_avenginekit}为 本项目的imclient和avenginekit目录。dependencies: flutter: sdk: flutter imclient: path: ${path_to_imclient} avenginekit: path: ${path_to_avenginekit} -
在项目
android/app/build.gradle文件中配置混淆规则,并添加依赖buildTypes { release { // Signing with the debug keys for now, so `flutter run --release` works. signingConfig signingConfigs.debug shrinkResources true // 是否开启混淆,如果开启了混淆,需要在proguard-rules.pro中添加规则,可参考build.gradle同目录中的混淆棍子,避免混淆掉野火IM相关类。 // 如果开启混淆,但混淆规则配置错误,应用可能无法启动,或不能正常连接到IM服务。 minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug{ signingConfig signingConfigs.debug shrinkResources true // 是否开启混淆,如果开发调试阶段,不想开启混淆,需要显示配置为false。 minifyEnabled false } } dependencies { // 将path_to_android_xxx_aars 替换成实际路径,可以使用相对路径,但一定要保证路径是正确的;路径不对的话,会报 ClassNotFoundException // moment 对应的是朋友圈SDK,ptt对应的是对接SDK。仅当购买或者试用这两个功能的用户打开这两个包的引入。 // wfc dep start implementation fileTree(dir: "${path_to_android_client_aars}", include: ["*.aar"]) implementation fileTree(dir: "${path_to_android_avclient_aars}", include: ["*.aar"]) //implementation fileTree(dir: "${path_to_android_moment_aars}", include: ["*.aar"]) //implementation fileTree(dir: "${path_android_ptt_aars}", include: ["*.aar"]) // wfc dep end } -
项目目录下执行
flutter packages get命令。 -
如果有iOS平台,执行
cd chat/ios/ && pod install命令。 -
分别运行 iOS、Android、鸿蒙或桌面端(Windows / macOS / Linux)平台。桌面端需要使用对应平台的官方 Flutter SDK 编译。
-
Android 平台,集成音视频的时候,需要在
AndroidManifest.xml入口activity的配置里面添加如下intent-filter<!-- 音视频通话,需要加入下面的 intent-filter--> <intent-filter> <action android:name="${applicationId}.main" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
- 升级插件时,一定要记得同步升级
android_client_aars和android_avclient_aars等aars目录
实现推送需要客户端和服务端研发配合实现,首先需要掌握野火推送的流程才可以,关于野火推送的知识,在野火推送服务的项目说明上有详细描述,请客户端研发和服务端研发详细阅读。
目前有多种推送方案可选,可以选取手机厂商的推送,也可以选取第三方推送。需要根据您的需求来选取适合您的方案。
客户端集成选取的推送平台的flutter插件,每个推送插件注册成功后,都会返回一个注册ID(或者是其他名称,能够唯一代表当前推送设备的ID),然后调用imclient的下面接口
Imclient.setDeviceToken(pushType, deviceToken);
下载野火推送服务,在此基础上进行二次开发。推送服务会收到IM服务的推送请求,推送请求中有这个pushType和deviceToken及要推送的内容,推送服务根据这些信息找到对应厂商进行推送。
实际上可以选用任意一个或者多个推送服务商,这里给出一个使用个推的介绍。 对接个推
本项目 iOS 端已实现 CallKit 来电与系统级 Share Extension 分享,相关文档如下:
注意:CallKit 需要真机、VoIP Push 证书及服务器端配合才能完整验证;Share Extension 需要主应用与扩展配置同一个 App Group。
会话列表
消息界面
联系人列表
发现界面
设置界面
单人视频通话
多人视频通话
Execution failed for task ':video_player_android:compileDebugJavaWithJavac'.- 查看
chat/.flutter-plugins找到video_player_android的位置,macos 时,位置如下:video_player_android=/Users/your-user-name/.pub-cache/hosted/pub.flutter-io.cn/video_player_android-2.8.4/ - 参考Remove -Werror from Android build 修改
android/build.gradle
- 查看
- 鸿蒙相关的常见问题(包找不到、gitcode 拉取失败、切换后 pod 冲突等),见上方「鸿蒙(OHOS)开发指南」。
- 获取token的过程一定是先从客户端获取clientId,然后应用服务使用clientId和userId参数获取token,返回给当前客户端使用。即token是和客户端绑定的,该token仅能在当前客户端使用。
- 获取用户/群组/频道信息时,都是直接返回本地数据,如果本地没有会返回null且去服务器更新,更新成功后会有eventbus通知。编写UI代码时需要考虑到获取信息为空的可能,并做好监听,以便信息更新能更新UI。
- 展示消息是分批获取的,先获取最新的一部分,然后列表滚动式再加载下一批,以此类推。
- 免费版本音视频需要用到turn服务,上线前请部署自己的turn服务,野火提供开发的带宽比较小无法支持商用。
- IM服务init时可以传入各种事件的回调,另外基本上每个事件都会同时触发EventBus事件通知,当需要某个通知时也可以用EventBus事件,所有事件定义在
imclient.dart文件中,比如ConnectionStatusChangedEvent是连接状态变化事件。其他事件可以在这附近找到。







