如何理解野火IM设计理念
最近在跟客户交流过程中发现,大家对我们的产品的设计理念不了解,对我们的设计理念不了解将会对使用野火IM造成困难,比如经常会问这么几个问题:
我想要换成用户名密码模式改如何修改?
我想要实现某个功能可不可以直接在IM服务修改一下?
我想要添加一个好友推荐功能怎么去修改?
我想要购买专业版,可是以后我要是二次开发怎么办?
我现在有一套系统,我该如何把野火集成到我们的系统中去?
这里给大家解释一下,野火IM的设计理念是什么,它与别的开源IM有什么不同,以及如何正确的使用野火IM。读完这篇文章,您将会恍然大悟,原来野火IM是这样用的啊!
可以肯定的是绝对不可能存在一个完备的软件完美的实现客户的所有需求,因为这个世界是如此变化多样的,我们唯一能做到的事就是做一个通用的即时通讯组件,客户可以使用这个组件进行各种开发和应用,而不是做一个满足所有人的即时通讯软件。
开源的IM软件有很多,不乏有很优秀的那种,但绝大多数都是做一个“完整一体”的“微信”,如果客户拿来集成使用对接将会是非常麻烦的,而这恰恰是我们的最大的优势,也是最容易被人忽略的优势。
我们对自己的定义就是即时通讯组件,它不是一座大楼,也不是一座大桥,它只是一种材料砖头,你可以使用它来盖个鸡窝,也可以使用它和钢筋水泥一起盖个大楼。定义为是组件就必须有着清晰的功能定义和接口定义,可以被拿来直接使用的一个子系统。组件不能被直接使用,需要嵌入到某个系统之中,具有一定的支撑才可以运转。
可是大家接触到的,都是下载下来直接就可以运行的,直接就可以聊天的应用,跟上面所说的矛盾啊。其实您所看到的应用都是我们的demo,只是为了演示我们即时通讯能力的演示软件,只是凑巧很像微信罢了。虽然这些应用已经很完善,接近于完整的应用,但我们还是不愿意把这些应用称为产品,怕被客户理解为我们的主要产品,这也就是我们为什么坚持称这些应用为demo的原因。即时通讯组件的应用可远远不止是做一个微信这一种可能。请参考我们的文章野火IM的应用。
那么那些是组件,那些是demo呢?如下图:
其中绿色的部分属于野火IM即时通讯组件,它只包含了服务端的IM server和客户端的client及协议栈,UIKit不能算是核心部分,其他部分也都不是。对于核心组件来说,它的任务就是把Payload无差错地送达到某个用户ID或者某些用户或者某个服务,至于Payload是什么内容,做什么事情,绿色的部分就不关心了。另外附加的一些功能就是把数据同步到客户端,比如群组信息、用户信息等。所有的客户业务都不应该在这里涉及,它只是一个搬运工,不会参与您的业务经营,只能按照您的要求把“包裹”送达目的地。
组件就必须有清晰的接口定义,可以通过接口跟它交互。Server端有HTTP接口,通过HTTP接口可以获取Token,可以发送消息,可以撤回消息,可以创建群组,可以销毁群组,可以添加敏感词,可以创建机器人等等。客户端是直接嵌入SDK的,可以直接调用SDK的接口,可以连接,可以发消息,可以创建群组,可以获取会话列表,可以获取到历史消息等等。而且客户端支持自定义消息,可以根据您的业务消息随意定制新的消息类型和消息行为。绝大多数定制化需求只需要对接服务接口和客户端自定义消息就可以完成。
图中黄色部分就是通讯组件嵌入的宿主应用系统。为了演示,我们开发了一套通讯应用Demo,包括appserver,各个端的应用(iOS/Android/PC/Web),机器人服务等。如果您有一套业务系统,可以通过接口跟即时通讯系统进行对接。如果您没有现成的业务系统,也可以直接使用我们的demo应用系统。
图中紫色的部分是跟即时通讯组件关系非常密切,但又不属于即时通讯核心的推送部分,这部分也是通过接口跟即时通讯进行沟通,目前已对接苹果、小米、华为推送,客户可自行对接其他推送服务。
除了绿色的部分,其他部分对于客户来说都是非常容易,可以很容易搞定的事情。由于我们良好的接口定义,客户在使用即时通讯组件过程中唯一需要修改的就是配置文件,其它的都不要改动,也不应该改动。跟我们系统对接的体验非常接近于云通信服务商,如果您对接过环某,融某或云某,您就会发现对接起来非常容易。
即时通讯组件部分虽然功能简单,但需要非常专业的技术能力,一旦用户自己修改过,将与官方的版本产生分裂。一方面无法平滑迁移到专业版,一旦日后客户量暴增,将难以处理。部分功能比如web/公众号/朋友圈等功能依赖专业版,这些功能也将无法使用。另外一方面以后不得不独立维护自己的分支,而维护好IM则需要一只中等规模专业的团队,花费大量的人力物力。而且我们协议栈部分不开源,分裂的版本可能会无以为继,难以维护下去。简单的把我们当成云通讯厂商就好了,通过接口可以很好地实现对接。记住只改配置文件就对了(只改配置文件说的是IM server和im client sdk,其它部分属于客户系统,还是要紧贴业务需求的)。
那么对于客户常问的这几个问题,答案都有了。
如何修改为用户/密码登录?
这是应用的业务职能,在应用和应用Server上去实现就好了。对于即时通讯组件来说,只要给它一个token和用户id就足够了。
如果实现某个功能可不可以直接在IM服务修改一下?
不可以的,业务和即时通讯要分开,在业务系统中实现,有需要可以调用即时通讯的接口(服务器端或者客户端sdk)。
怎么实现一个好友推荐系统?
在应用服务去实现,app读取联系人列表上传到appserver,appserver根据电话号码去检查联系人是不是在系统中,然后返回给客户端。整个过程中不涉及到即时通讯能力
如果购买专业版怎么二次开发?
把业务跟即时通讯隔离开来,通过服务器端接口和客户端SDK接口进行对接。目前作为即时通讯能力的基本功能和对外接口是完备的,一般情况下是足够用的。如果有需求给我们提issue,我们会排期开发。
我现在有一套系统,我该如何把野火集成到我们的系统中去?
把野火IM的demo中的逻辑迁移到您的系统中就可以了。其中在应用服务的逻辑就是换取token,在用户登录时去IM服务换取token返回给客户端,另外就是根据您的业务调用IM服务的接口给用户发消息。在客户端就是把野火IM的SDK集成进app,使用token调用connect,然后调用UI组件展现消息,也可以注册消息监听,监听业务消息内容。