野火IM是专业级即时通讯和实时音视频整体解决方案,由北京野火无限网络科技有限公司维护和支持。
主要特性有:私有部署安全可靠,性能强大,功能齐全,全平台支持,开源率高,部署运维简单,二次开发友好,方便与第三方系统对接或者嵌入现有系统中。详细情况请参考在线文档。
主要包括一下项目:
| GitHub仓库地址(主站) | 码云仓库地址(镜像) | 说明 | 备注 |
|---|---|---|---|
| im-server | im-server | IM Server | |
| 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 | 野火IM Web 端, 体验地址 | |
| wx-chat | wx-chat | 小程序平台的Demo(支持微信、百度、阿里、字节、QQ 等小程序平台) | |
| app server | app server | 应用服务端 | |
| robot_server | robot_server | 机器人服务端 | |
| push_server | push_server | 推送服务器 | |
| docs | docs | 野火IM相关文档,包含设计、概念、开发、使用说明,在线查看 |
本工程为野火IM iOS App。开发过程中,充分考虑了二次开发和集成需求,可作为SDK集成到其他应用中,或者直接进行二次开发。
开发一套IM系统真的很艰辛,请路过的朋友们给点个star,支持我们坚持下去🙏🙏🙏🙏🙏
商务合作请优先采用邮箱和我们联系。技术问题请到野火IM论坛发帖交流。
- heavyrain.lee 邮箱: heavyrain.lee@wildfirechat.cn 微信:wildfirechat
- imndx 邮箱: imndx@wildfirechat.cn 微信:wfchat
- 如果大家发现bug,请在GitHub提issue
- 其他问题,请到野火IM论坛进行交流学习
- 微信公众号
强烈建议关注我们的公众号。我们有新版本发布或者有重大更新会通过公众号通知大家,另外我们也会不定期的发布一些关于野火IM的技术介绍。
我们提供了体验demo,请使用微信扫码下载安装体验
工程中有3个项目,其中1个是应用,另外两个2个是库。chatclient库是IM的通讯能力,是最底层的库,chatuikit是IM的UI控件库,依赖于chatclient。chat是IM的demo,依赖于这两个库,chat需要正确配置服务器地址。
在项目的Config.m文件中,修改IM服务器地址配置。把IM_SERVER_HOST和IM_SERVER_PORT设置成火信的地址和端口。另外需要搭配应用服务器,请按照说明部署好应用服务器,然后把APP_SERVER_HOST和APP_SERVER_PORT设置为应用服务器的地址和端口。
私有化部署时,IM 服务、媒体服务、应用服务等可能会使用自签名证书。客户端默认会以"证书无效"(NSURLErrorServerCertificateUntrusted)拒绝连接,工程内置了统一的证书信任管理,把证书放进 App 即可,不需要改动业务代码。
把证书文件(.cer、.crt、.pem、.der,一个 .pem 里可以包含多张)放到 App 的 Bundle 根目录。客户端启动时会自动遍历 Bundle 根目录下的所有证书文件并加载,代码见 wfclient/WFChatClient/CertificateManager/WFCCCertificateManager.m。
ShareExtension 不链接 chatclient 库,而是文件引用同一份证书管理源文件(
wfclient/WFChatClient/CertificateManager/WFCCCertificateManager.*)直接参与编译,证书文件也要加进 Extension 的 Bundle(wfchat/ShareExtension/已配置好)。
主机绑定完全依赖证书的 SAN(Subject Alternative Name),评估时统一使用 SecPolicyCreateSSL(true, host),所以:
- 证书 SAN 里必须包含客户端实际连接的 IP 或域名;
- 用 IP 直连就要有 IP SAN,用域名连接就要有 DNS SAN(或
*.example.com通配); - SAN 不匹配就是连接失败,没有跳过校验的开关。
比如有一个证书 ip.crt,SAN 是 IP:101.35.103.221, IP:10.0.16.12,就只能用这两个地址直连。
Apple 对 TLS 服务端证书有硬性策略,不满足时即使把证书内置为信任锚,Security.framework 依然会拒绝:
- 有效期不超过 825 天;
- 必须带
extended key usage: serverAuth。
自签证书可以参考下面的命令生成:
openssl req -x509 -newkey rsa:2048 -nodes -days 820 \
-keyout server.key -out server.crt \
-subj "/CN=101.35.103.221" \
-addext "subjectAltName=IP:101.35.103.221,IP:10.0.16.12" \
-addext "basicConstraints=critical,CA:TRUE" \
-addext "keyUsage=critical,digitalSignature,keyEncipherment,keyCertSign" \
-addext "extendedKeyUsage=serverAuth"如果不想重签、证书不满足上面两条,客户端默认的宽松模式可以兼容。
| 策略 | 说明 |
|---|---|
WFCCCertPolicyModePermissive(默认) |
用 SecPolicyCreateBasicX509 只校验证书链和有效期,不套用 Apple 的 825 天有效期、serverAuth EKU 等 TLS 策略;主机匹配由客户端按证书 SAN 自行完成。可以兼容不合规的自签证书 |
WFCCCertPolicyModeTLS |
完全走系统 TLS 策略,要求证书合规 |
// 切换到严格模式
[WFCCCertificateManager sharedManager].policyMode = WFCCCertPolicyModeTLS;
// 只信任内置证书,忽略系统信任库里的其它根证书
[WFCCCertificateManager sharedManager].trustMode = WFCCCertTrustModePinOnly;
// 关闭自签证书支持
[WFCCCertificateManager sharedManager].enabled = NO;
// 手动加载并应用到 IM(一般不需要,启动时会自动做)
[WFCCCertificateManager setupWithMainBundleCertificates];默认是"宽松模式 + 先走系统信任库、失败再用内置证书当锚点",公签证书、用户自己安装并信任的证书、内置自签证书三种情况都能正常工作。
证书信任管理已经接入所有网络通道,不需要逐个改造:
- IM 长连接及协议栈内的媒体上传下载(
WFCCNetworkService的 TLS 配置 + 协议栈证书链校验回调) - 大文件预签名上传(
WFCCIMService) - 头像、图片、表情、朋友圈图片(SDWebImage)
- 应用服务、组织通讯录、接龙、投票、网盘、归档等(AFNetworking)
- 实时语音输入的 WebSocket、语音转文字(
NSURLSession) - 工作台、关于、隐私政策等网页(WKWebView)
证书不匹配或校验失败时会输出 [WFCCCert] 前缀的日志,包含服务端证书的 SAN、有效期、指纹,以及当前连接的 host 是否匹配。也可以直接调用:
NSLog(@"%@", [[WFCCCertificateManager sharedManager] describeCertificatesForHost:@"101.35.103.221"]);内置证书信任是为了兼容私有化部署的自签证书,安全性弱于公签证书,生产环境建议:
- 使用公签证书;或者搭建私有 CA(长期有效)签发服务端证书(不超过 825 天),客户端内置并固定 CA,续期时不用发版;
- 不要为了省事把证书校验全局放开;
- 自签方案仅用于内网或设备可管控的私有化部署。
使用手机号码及验证码登陆,
在没有短信供应商时,可以使用superCode进行测试验证。
在集成到其他应用中时,如果使用了UIKit库,需要在应用的Info.plist文件中添加属性CFBundleAllowMixedLocalizations值为true。项目下的脚本release_libs.sh可以把chatclient和chatuikit打包成动态库,把生成的库和资源添加到工程依赖中,注意库是动态库,需要"Embed"。此外还可以把chatclient和chatuikit项目直接添加到工程依赖中。
UI层使用了它们的动态库,如果需要源码可以去对应地址下载,可以自己编译替换第三方动态库。
如果编译时提示动态库签名"cannot be verified":这是因为动态库使用了官方自签证书,且文件带有隔离属性或符号链接被破坏。请使用git clone获取代码(不要用浏览器下载ZIP),项目不要放在FAT32等非Mac格式的磁盘或网盘同步目录中。如果已正常clone仍提示,执行xattr -dr com.apple.quarantine <项目路径>后重新编译即可。比如:
xattr -dr com.apple.quarantine /User/user/Download/ios-chat
当应用在后台几秒钟后就会被冻结和杀掉,此时收到消息需要APNS通知。请部署推送服务,推送服务代码可以在Github和码云下载。具体使用方式,请参考推送服务项目上的说明。
2022.11.05 iOS SDK修改了kUserInfoUpdated、kGroupInfoUpdated和```kChannelInfoUpdated````通知。把之前的单个通知,改成了批量通知,请注意这个变化。
本工程使用了mars及其它大量优秀的开源项目,对他们的贡献表示感谢。本工程使用的Icon全部来源于icons8,对他们表示感谢。Gif动态图来源于网络,对网友的制作表示感谢。如果有什么地方侵犯了您的权益,请联系我们删除🙏🙏🙏












