Objective-C

ios-chat

即时通讯,聊天,野火IM iOS客户端

W

wildfirechat

Dernière activité 28 sept. 2026
wildfirechat/ios-chat

1,2 k

étoiles

531

forks

19

issues ouvertes

chatchat-roomiminstant-messagemessagingmqttvoipwechatweixin

Ce README est souvent en anglais.

野火IM解决方案

野火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论坛发帖交流。

  1. heavyrain.lee 邮箱: heavyrain.lee@wildfirechat.cn 微信:wildfirechat
  2. imndx 邮箱: imndx@wildfirechat.cn 微信:wfchat

问题交流

  1. 如果大家发现bug,请在GitHub提issue
  2. 其他问题,请到野火IM论坛进行交流学习
  3. 微信公众号

强烈建议关注我们的公众号。我们有新版本发布或者有重大更新会通过公众号通知大家,另外我们也会不定期的发布一些关于野火IM的技术介绍。

体验Demo

我们提供了体验demo,请使用微信扫码下载安装体验

野火IM

应用截图

ios-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 即可,不需要改动业务代码。

1. 放证书

把证书文件(.cer、.crt、.pem、.der,一个 .pem 里可以包含多张)放到 App 的 Bundle 根目录。客户端启动时会自动遍历 Bundle 根目录下的所有证书文件并加载,代码见 wfclient/WFChatClient/CertificateManager/WFCCCertificateManager.m。

ShareExtension 不链接 chatclient 库,而是文件引用同一份证书管理源文件(wfclient/WFChatClient/CertificateManager/WFCCCertificateManager.*)直接参与编译,证书文件也要加进 Extension 的 Bundle(wfchat/ShareExtension/ 已配置好)。

2. 证书里的地址必须和实际拨号的地址一致

主机绑定完全依赖证书的 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,就只能用这两个地址直连。

3. 证书建议做成"合规"证书

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"

如果不想重签、证书不满足上面两条,客户端默认的宽松模式可以兼容。

4. 两种校验策略

策略 说明
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];

默认是"宽松模式 + 先走系统信任库、失败再用内置证书当锚点",公签证书、用户自己安装并信任的证书、内置自签证书三种情况都能正常工作。

5. 覆盖范围

证书信任管理已经接入所有网络通道,不需要逐个改造:

  • IM 长连接及协议栈内的媒体上传下载(WFCCNetworkService 的 TLS 配置 + 协议栈证书链校验回调)
  • 大文件预签名上传(WFCCIMService)
  • 头像、图片、表情、朋友圈图片(SDWebImage)
  • 应用服务、组织通讯录、接龙、投票、网盘、归档等(AFNetworking)
  • 实时语音输入的 WebSocket、语音转文字(NSURLSession)
  • 工作台、关于、隐私政策等网页(WKWebView)

6. 排障

证书不匹配或校验失败时会输出 [WFCCCert] 前缀的日志,包含服务端证书的 SAN、有效期、指纹,以及当前连接的 host 是否匹配。也可以直接调用:

NSLog(@"%@", [[WFCCCertificateManager sharedManager] describeCertificatesForHost:@"101.35.103.221"]);

7. 安全建议

内置证书信任是为了兼容私有化部署的自签证书,安全性弱于公签证书,生产环境建议:

  • 使用公签证书;或者搭建私有 CA(长期有效)签发服务端证书(不超过 825 天),客户端内置并固定 CA,续期时不用发版;
  • 不要为了省事把证书校验全局放开;
  • 自签方案仅用于内网或设备可管控的私有化部署。

登陆

使用手机号码及验证码登陆,

在没有短信供应商时,可以使用superCode进行测试验证。

集成

在集成到其他应用中时,如果使用了UIKit库,需要在应用的Info.plist文件中添加属性CFBundleAllowMixedLocalizations值为true。项目下的脚本release_libs.sh可以把chatclient和chatuikit打包成动态库,把生成的库和资源添加到工程依赖中,注意库是动态库,需要"Embed"。此外还可以把chatclient和chatuikit项目直接添加到工程依赖中。

第三方动态库

  1. SDWebImage
  2. ZLPhotoBrowser

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动态图来源于网络,对网友的制作表示感谢。如果有什么地方侵犯了您的权益,请联系我们删除🙏🙏🙏

License

  1. Under the Creative Commons Attribution-NoDerivs 3.0 Unported license. See the LICENSE file for details.
  2. Under the 996ICU License. See the LICENSE file for details.

Projets similaires

即时通讯(IM)系统

Javaimvoip
Wwildfirechat
8,6 k étoiles1,9 k

即时通讯,聊天,野火IM Android客户端,支持Android 4.x —— 最新

Javachatimvoip
Wwildfirechat
2,7 k étoiles1 k

IM Chat OpenClaw

Gochatimmessaging
Oopenimsdk
16,7 k étoiles3 k