IM,每个人的理解都不同,有些说不就是个即时通讯吗,很简单;也有人说IM对技术要求很高,很不容易。
这两种说法都没错,只是观察角度和要求不同。
持前一种说法的人,要么就是扫地僧水平的高手,要么就是一个新入行的新手,只是开发一个demo而已。持后一种说法的人跟IM系统有个亲密接触,有一些这方面的经验。

我曾经做过一个比喻,IM好比发动机;我国在导弹领域能够独立自主,但是在飞机方面一直受制于人;为什么?
因为要求不同,火箭发动机属于一次性产品,不可重复利用,只要把火箭送上天使命就完成了;飞机则不同,飞机对发动机的要求比火箭高很多。
同样的道理,你研发一款低频使用系统和高频使用的系统对技术的要求也不一样。
生产任何一个东西,要求越高,自然研发门槛就越高,IM自然也不例外。
好的IM客户端要达到好的用户体验,响应速度和流畅度;所以在架构选择上要格外慎重,如果架构选择不正确,后期的优化和用户体验即使花很大精力也很难达到预期效果。
架构方案
目前App的开发主要有如下四个方案:
H5 方案纯原生方案跨平台SDK+原生UI交互跨平台SDK+跨平台UI交互以上4个方案各有千秋,下面逐一进行分析;
方案一:H5 方案
该方案一般采用websocket长连接或者http短链接与IM服务端交互(具体交互细节此处不再赘述)。
此方案优点是开发速度快,跨平台性好,一套代码各个平台都可以使用,升级方便;
缺点也很明显:依赖js引擎和浏览器渲染,H5+js做端链接低频应用勉强可以;对于IM这种高频大数据量的应用,加上js对于存储和本地资源访问的限制,后期对卡顿,加载慢,动画效果差等缺点没有好的方案来优化解决,大多数团队都会转到后面的3个方案上。
方案二:纯原生方案
每个App端独立开发,实现各自的通讯,协议栈,数据存储,业务逻辑和UI交互;
此方案利用每个操作系统的特性,在用户体验上很容易达到用户期望,也是使用较广的一个方案;缺点是ios,android,windows,MacOS,Linux每个操作系统都一个团队来开发,所有业务逻辑和数据处理针对每个平台都需要实现一遍,浪费开发测试资源,从成本上来算不经济。
采用此方案没有技术障碍,如果选择的开发框架提供的组件库不能满足要求,还可以通过访问操作系统底层API来解决问题。
方案三:跨平台SDK+原生UI交互
SDK负责实现通讯,协议栈,数据存储,业务逻辑;每个平台单独实现部分高频UI交互,比如登录,会话列表,单聊会话,群聊会话,会话设置等。
SDK一般用c/c++实现,跨平台性好,效率高,每个操作系统对c/c++的支持都很好,底层直接调用std标准库和操作系统API实现相应的功能需求;通过在各个平台进行交叉编译,实现一次代码,到处编译的状况。
此方案用户体验没问题,解决了方案二的人员浪费问题,底层通讯,协议栈,数据存储,业务逻辑在DK中实现,不用每个平台自己实现,节省不少人力资源,
方案四:跨平台SDK+跨平台UI交互;
此方案是对上一个方案三的局部优化;SDK实现了底层通讯,数据,逻辑的统一化后;
有些同学说了,既然底层通讯数据处理,业务逻辑可以做成跨平台SDK,那UI能不能也做成跨平台的,当然能了。
主要有如下跨平台UI可以选择:
Flutter:
Flutter 是 Google推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart语言开发 App,一套代码同时运行在 iOS 和 Android平台。 Flutter提供了丰富的组件、接口,开发者可以很快地为 Flutter添加 native扩展。同时 Flutter还使用 Native引擎渲染视图,这无疑能为用户提供良好的体验。
Flutter属于新技术,在IM领域目前没有成熟先例,需要预研如下问题:
A.系统原生API的兼容性与支持,一些原生化问题要能解决,比如每个平台UI交互流畅和动画的支持,桌面图标角标,push提醒等
B.高频,大量数据刷新的性能;
C.长时间运行内存和性能是否能达到指标;
Qt:
Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正的组件编程。
针对windows,Mac 平台个人比较推荐使用Qt开发UI,技术成熟,性能好,既能满足Windows,Mac,也能够将来兼容UOS(Linux);一套代码三个平台,爽否?
通过以上分析,方案三和方案四无疑是较好的选择;从投入产出比来看,如果方案四中Flutter能解决ABC问题属于最佳方案;具体情况各位同学可以根据自己团队实际情况来选择。
最后奉上我司的客户端架构图可供参考;
本人在IM领域研发十余年,逐步将这数十年来的积累整理出来,以供后来者借鉴,探讨。
谢谢关注~~