1 Star 0 Fork 49

alex/docs

forked from 野火IM/docs 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
search_plus_index.json 90.65 KB
一键复制 编辑 原始数据 按行查看 历史
heavyrain lee 提交于 2019-04-24 20:42 . update
{"./":{"url":"./","title":"产品介绍","keywords":"","body":"野火IM 什么是野火IM 野火IM是一套开源通用的即时通讯组件,能够更加容易地赋予客户IM能力,使客户可以快速的在自有产品上添加聊天功能。使用野火可以替代云通讯产品或减少自研IM的工作量。降低客户使用IM的成本和难度。 野火IM的目标是什么 一直以来给自己的产品加上IM能力都是一件比较困难的事情,要么是架构落后性能不好(XMPP),要么是费用贵业务受制于人安全有隐忧(云通讯公司)。我们的目标是提供一个免费可控高效易用的IM组件,让拥有IM能力不再是一种奢望,让沟通不再是难事。 我们提供的产品 野火IM提开源的社区版服务,移动客户端开源全部源码(音视频SDK不开源,买的商业源码,无法二次分发)。客户需要把服务器软件到自己服务器,然后集成SDK到客户APP。我们提供的Demo应用也可以直接使用。另外提供功能更为强大的商业版服务及PC SDK。 野火IM的技术特点 野火IM使用了微信Mars连接库,序列化使用protobuf,协议使用MQTT修改的私有协议,借鉴了微软ActiveSync的思路。做到不丢消息,不重复,完美地支持多端。另外针对安全性做了仔细的设计,链路层全程加密,本地数据库加密。提供了UI库,大大减少开发者的工作量。野火IM可能是世界上内核最像微信的一个IM(使用了微信的连接库,使用了微信类似的协议)。 野火IM都有什么功能 野火IM提供能力库和UI库,支持单聊、群聊、聊天室、频道(类似与微信的公众号)和机器人。支持Server API。提供用户信息、好友关系和群组信息托管。支持常见消息类型和自定义消息。提供单人的音视频通话能力。 费用 社区版服务器开源,移动客户端SDK和demo使用MIT协议开源,音视频SDK提供发布包,您可以免费使用这些组件。有4项收费服务,商业版本授权费用,PC SDK授权费用,音视频源码授权费用,服务支持费用。客户可以组合选择0-4项收费服务。详细价格如下: 项目 包含内容 价格 促销价格 商业版IM服务 商业版IM服务的授权使用费用 5.9W/套 2.9W/套 PC SDK授权 PC SDK的授权费用 5.9W/套 2.9W/套 音视频源码 音视频源码 9.9W元 N/A 服务支持 上门解决部署打包安装等问题 5000元/天 N/A 开业促销,2019年商业版和PC SDK 五折促销。商业版和PC SDK会绑定机器码和域名。 社区版与商业版区别 社区版与商业版所有IM功能都是一样的。区别有如下几点 社区版是开源的,问题的修复需要客户自主解决或等待我们解决,但时间不能保障。商业版闭源,我们会快速修复问题。 社区版是单机版,商业版支持集群。从性能上来讲,社区版性能很高,使用高性能服务器,足够满足上百万用户;社区版除了能够支撑更多用户外,还能够提供高可靠性。 社区版使用的数据库是mysql,我们已经做了分表处理,但还是需要按月删除旧消息。商业版使用了mysql+mongodb,消息能保存更久,场景搭配也更合理。 商业版的闭源是不是会限制客户的业务发展需求? 这是客户最常见的疑问,这里给出我们的答案:不会。从系统架构上来说,IM服务器就应该是一个职责单一的功能,是一个消息管道,负责消息在人和人之间及人和服务器之间传递。任何希望往IM服务器添加具体业务的想法都是违反架构基本原则的。客户应该把IM服务当作一个系统组件来使用,在业务服务中实现业务,而不是希望在里面进行二次开发加上自己的业务。 当客户确实发现有应该归属于IM的功能没有实现时,可以给我们提出需求,我们确认后会在社区版上及商业版上都加上。 常见的开源软件都是有一套开源的社区版,然后有一套闭源的商业版。eg. MySQL, MongoDB, InfluxDB, Docker, GitLab, QT等等非常多的流行软件。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-23 07:12:04 "},"quick_start/":{"url":"quick_start/","title":"快速开始","keywords":"","body":"快速开始 体验我们的应用 您可以直接下载安装野火IM的Android或iOS平台的DEMO来体验野火IM,或者微信扫码下面二维码。 您需要使用两个账户互加为好友聊天,也可以添加作者(FireChat)或者机器人(小火)进行互动。 体验您自己的应用 您也可以自己部署服务器软件和客户端Demo源码打包来体验野火IM功能。 服务器快速部署 Android编译 iOS编译 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"quick_start/server.html":{"url":"quick_start/server.html","title":"服务器部署","keywords":"","body":"服务器部署 服务器提供社区版和Demo服务软件。社区版是IM通讯服务器,负责发送消息等IM业务;Demo服务是模拟客户的应用服务,提供登陆等功能。 环境需求 Windows/Linux/MacOS都可以,需要JRE1.8以上,需要网络环境。如果没有公网IP,也可以在局域网内体验。需要开通1883、80和8888端口。 野火IM服务器的部署 配置修改 wildfirechat软件下载解压后,修改/config/wildfirechat.conf文件,修改http_port为80,修改server.ip为服务器ip地址。 这里有个限制http_port必须为80端口,如果使用其它端口,在使用七牛文件服务器时,发送媒体消息会失败 运行 在mac/linux系统下,执行sh ./bin/wildfirechat.sh;在windows系统下,执行bin\\wildfirechat.bat。等待10秒钟后,在浏览器中输入http://${服务器的IP}/api/version,查看版本信息。注意一定到在bin的同级目录下执行,不要到bin内执行 Demo应用服务器的部署 配置修改 app软件下载解压后,修改/config/sms.properties文件,设置superCode为66666 发送短信需要购买短信服务,在没有短信服务的情况下,使用superCode作为验证码来登陆。 运行 执行java -jar app-0.0.1-SNAPSHOT.jar。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"quick_start/android.html":{"url":"quick_start/android.html","title":"安卓编译","keywords":"","body":"Android编译 部署完服务后就可以开始客户端的编译。客户端提供源码,从这里下载最新的源码。 修改配置 找到Config.java文件,修改IM_SERVER_HOST和IM_SERVER_HOST为你的服务器地址,比如192.168.1.100。修改IM_SERVER_PORT为80, 修改APP_SERVER_PORT为8888。 运行 编译运行,填入您的手机号码,验证码填写服务器部署时指定的superCode 66666。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"quick_start/iOS.html":{"url":"quick_start/iOS.html","title":"iOS编译","keywords":"","body":"iOS编译 部署完服务后就可以开始客户端的编译。客户端提供源码,从这里下载最新的源码。 修改配置 找到config.m文件,修改IM_SERVER_HOST和IM_SERVER_HOST为你的服务器地址,比如192.168.1.100。修改IM_SERVER_PORT为80, 修改APP_SERVER_PORT为8888。 运行 编译运行,填入您的手机号码,验证码填写服务器部署时指定的superCode 66666。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"architecture/":{"url":"architecture/","title":"系统架构","keywords":"","body":"系统架构 野火IM除了提供基础IM功能外,还提供群组托管/用户信息托管/好友关系托管等功能,其中用户信息托管和好友关系托管为可选功能,客户可以自己处理用户信息和好友关系,仅仅使用im和群组托管能力。也可以把用户信息和好友关系导入到野火IM中去,SDK和UI更容易使用。 SDK SDK分为2部分,一部分是功能SDK,负责所有能力的实现,后文中简称ChatClient,只需要调用connect,传入用户Id和token,ChatClient会自动做好连接/重连、消息同步、群组关系同步、用户信息同步、好友关系同步等。移动客户端和PC客户端使用微信Mars和自定义协议实现,使用C++实现具有跨平台功能。Web客户端使用自定义协议和websocket实现。另外一部分是UI的SDK,实现了常用的UI界面,方便客户集成使用,后文中使用简称ChatUI。 目前仅实现了PC端仅实现了mac和windows,linux平台暂未实现。web平台也暂未实现,可能需要更长的时间。 应用服务器 应用服务器需要处理用户注册/用户登陆等业务。应用服务器在用户登陆时去野火IM服务器换取token,然后返回给客户端。我们提供有Demo供参考。 野火IM服务器 负责IM业务的处理,负责群组业务的处理,负责用户信息于好友关系的处理。 应用客户端 应用客户端,使用sdk,负责im的UI展示。野火IM提供一个简单的demo,可以作为一个聊天客户端直接使用,也可以移植聊天相关的UI到客户应用中去。 推送 野火IM会把需要推送的信息发送到推送服务器,推送服务器推送信息到APNS/华为推送/小米推送等。其中android平台有推送SDK。推送服务是开源的,点击推送服务查看 机器人服务 可以在野火IM服务中添加机器人角色,然后所有发给机器人的消息都会发送到指定的服务,处理后可以用过IM服务发回去。在我们的demo中有个“小火”的机器人,可以单聊或在群里@。我们提供有Demo供参考。 频道服务(未完成) 频道是有点类似与微信中的公众号功能,用户可以订阅,然后频道主可以发送消息给所有订阅用户。可以部署频道服务来处理类似微信公众号的功能。 流程图 登陆 登陆 注册用户 托管用户信息 不托管用户信息 注册时不用同步用户信息到野火IM服务器,获取token不依赖必须存在用户信息。 开源代码列表 server IM服务源码 android-chat Android SDK及demo应用源码 ios-chat iOS SDK及demo应用源码 pc-chat PC客户端源码 proto 协议栈(mars)源码 app_server 应用服务源码 push_server 推送服务源码 robot_server 机器人服务源码 docs 文档源码 其中IM服务成熟稳定,是可用于商业化的,如果有问题,请提issue或者PR。push需要集成更多的手机厂商的推送服务。其它的两个服务app/robot是配合IM服务的,往往跟您的业务关系比较大,所以是demo级别的,你可以参考来集成您的业务。 客户端中sdk(imclient/imuikit)稳定性比较高,建议您直接使用,有问题提issue或PR。应用部分往往跟您的业务密切相关,因此应用是demo级别的,您可以参考demo进行集成。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-27 22:36:16 "},"base_knowledge/":{"url":"base_knowledge/","title":"基础知识","keywords":"","body":"基础知识 SDK与Demo 用户 SDK的功能 连接 会话 消息 消息内容 消息负载 存储与同步 离线消息 群组 聊天室 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/sdk_demo.html":{"url":"base_knowledge/sdk_demo.html","title":"SDK与Demo的关系","keywords":"","body":"SDK与Demo的关系 SDK SDK分为ChatClient和ChatUIKit,其中ChatClient提供IM能力,另外附加群组关系托管,用户信息托管和好友关系托管,只提供能力,不包括UI界面。ChatUIKit提供常用的UI界面,客户可以直接使用ChatUIKit的UI来进行二次开发,也可以只使用ChatClient自己来开发UI。 Demo Demo是使用了ChatUIKit的演示。演示如何集成我们的SDK 我们提供的支持 SDK和Demo全部开源,都采用MIT版权。但我们对SDK和Demo提供不同的技术支持。 对于SDK的ChatClient,我们提供完全的维护工作,建议客户不要修改这个SDK,如果有bug请提交issue,如果缺少IM的某些功能导致应用无法完成某项功能,也可以提issue给我们。 对于ChatUIKit和Demo,建议用户自己修改,如果有issue可以给我们提Pull Request。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/user.html":{"url":"base_knowledge/user.html","title":"用户","keywords":"","body":"用户 用户的基本属性 用户拥有如下三个属性,userId、name、displayName。 userId 用户在系统中的唯一ID,一般是一个字符串,具有系统中唯一性,用户在使用过程中无法看到,不可以修改。野火IM中用户ID最大长度是64字节。 name 有人也称为loginName或accountName,一般是用来登陆时填写的用户名,具有系统中的唯一性,一般不可以修改。野火IM中name最大长度也是64字节 displayName 有人也称为nickName,一般情况下用户可以随意修改,不要求唯一性。displayName最大长度也是64字节。 其它的一些属性,比如头像,号码,地址等,不容易引起误解这里就不做解释了。另外用户提供有extra字段,客户可以自定义使用。 登陆与连接 登陆与连接是两个不同的概念。登陆是指应用认证用户的一个过程,登陆成功后,应用可以识别当前用户,并授权用户对应的权限。连接这里指的是IM的长链接建立,是发生在登陆之后,需要保持与IM服务器长链接,以便发送消息或者接收消息推送。 用户Token 用户Token,在不引起歧义的情况下称为token。token是用户身份验证的凭证,在IM连接之前,需要先换取token,一般是在登陆成功时,由应用服务器返回token,使用token连接IM服务器,IM服务器会对token的有效性进行检查。token作为客户的连接凭证,需要严格保密。 连接 SDK仅需要用户ID和token进行连接,在IM系统核心处理部分,只用到用户ID,不需要系统中一定有这个用户,这样客户就可以选择是否托管用户信息。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/sdk_abilities.html":{"url":"base_knowledge/sdk_abilities.html","title":"SDK的功能","keywords":"","body":"SDK的功能 ChatClient 连接/断开连接/连接状态回调 文本/图片/语音/视频/文件/地理位置/动态表情等常见消息类型及自定义消息类型 发送消息/接收消息回调 获取会话列表/获取会话/清除会话未读数等会话操作 获取消息列表/获取消息/更新消息/删除消息等消息操作 获取用户信息/搜索用户等用户操作 添加好友请求/接收好友请求/获取好友列表/删除好友等好友操作 创建群组/添加成员/移除成员/解散群组等群组操作 个人属性设置相关 加入聊天室/退出聊天室/获取聊天室信息等聊天室相关操作 频道的创建/频道订阅/频道取消订阅/频道的销毁/频道信息更改等频道操作 ChatUIKit 会话列表界面 会话界面 消息展示 联系人展示 好友关系处理 个人用户信息修改 群组信息展示 ... 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/connect.html":{"url":"base_knowledge/connect.html","title":"连接","keywords":"","body":"连接 连接 连接之前需要先获取token。调用connect之后,SDK会自动处理断网重连/网络切换/前后台切换等逻辑。应用只需要实现网络状态的回调,反映出当前的状态即可。断开连接需要clearSession参数,true会清理掉session,应用不会收到推送,并删除掉本地存储。false会保留当前session,应用会收到推送。 连接流程请参考登陆 异步调用与回调 connect函数没有回调函数,只能通过连接回调来判断连接状态。调用connect后,数据库立即可用。连接状态一般情况下只需要展示给用户即可,但有部分状态需要干预,比如token过期或者错误,用户被封禁等。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/conversation.html":{"url":"base_knowledge/conversation.html","title":"会话","keywords":"","body":"会话 会话 会话(Conversation)是指与特定对象聊天消息(Message)的集合,概念与微信中的会话一致,一条一条显示在消息界面中。会话具有如下三个属性 会话类型(Conversation_Type): Single类型,一对一的会话类型。聊天双方分别为两个用户和个体。 Group类型,群组会话类型,发送在这个会话的消息会分发到所有的群成员。 Chatroom类型,聊天室会话类型,发送到这个会话的消息会分发到所有的聊天室成员。与群组的区别在于群组是有离线消息和推送,聊天室的关系是临时的,退出来就不会收到消息。 频道类型,一对多的会话类型。频道主可以广播消息,也可以跟受众单独私聊。功能接近于Telegram的频道功能,有点类似于微信公众号。 会话目标(Target): 跟会话类型不同而不同,Single类型时,目标为用户Id;Group类型时,目标为群Id;Chatroom类型时,目标为聊天室Id;Channel类型时 目标为Channel ID。 会话线路(Line): 会话线路可以更加方便的过滤会话。比如同一个app中不同部门可以使用不同的line区分。或者可以设计不同的场景使用不同的line等。 除此之外,还有别的一些属性比如未读数/最后一条消息/更新时间/是否置顶等属性。详情请在客户端源码中查看Conversation和ConversationInfo对象 会话/消息/消息内容的关系 一个会话会拥有多个消息,每个消息都属于一个会话;每个消息都拥有一个消息内容,消息内容可以有多种形式,比如文本消息内容、图片消息内容等内置消息类型,另外支持自定义消息内容;消息内容在存储或者网络传输中要Encode为消息负载,从数据库中读取或者网络收到消息负载需要Decode为具体的消息内容。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/message.html":{"url":"base_knowledge/message.html","title":"消息","keywords":"","body":"消息 消息定义为message对象。消息与会话的关系是一对多,一条消息对应于一个会话,一个会话可以有多条消息。它具有如下属性: messageId 消息ID,如果消息内容是存储类型的,messageId对应于本地数据库中的自增id,同一条消息在发送方和接收方都可能是不同的,甚至在多端的情况下也不能保证相同。如果消息内容是非存储的,messageId为0. messageUid 消息唯一ID,由服务器分配的全局唯一ID。消息只有发送成功才会拥有唯一ID。 conversation 所属的会话 fromUser 发送者 direction 消息方向,是发送的还是接收的。 status 消息状态,分为如下值 * Sending * Sent * Send_Failure * Mentioned * AllMentioned * Unread * Readed * Played serverTime 消息在服务器处理的时间戳 content 消息的内容,消息内容可以是多种格式,比如图片/文本/语音/地理位置等。野火IM支持自定义消息内容类型,可以任意定义消息内容来服务您的业务需求。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/message_content.html":{"url":"base_knowledge/message_content.html","title":"消息内容","keywords":"","body":"消息内容 消息内容(Message Content)是消息中最重要的部分,在网络传输中,消息内容会转化为消息负载(Message Payload),接收到消息负载后会转化为消息内容。消息内容有一个共同的抽象基类MessageContent。各种消息类型都派生与此基类。此外客户也可以自定义消息内容,继承基类,然后调用sdk的注册消息函数即可(注意必须在连接之前注册)。 Android: public abstract class MessageContent implements Parcelable { public abstract MessagePayload encode(); public abstract void decode(MessagePayload payload); public abstract String digest(); public int getType() { ContentTag tag = getClass().getAnnotation(ContentTag.class); if(tag != null) { return tag.type(); } return -1; } public PersistFlag getPersistFlag() { ContentTag tag = getClass().getAnnotation(ContentTag.class); if(tag != null) { return tag.flag(); } return PersistFlag.No_Persist; } } iOS: @protocol WFCCMessageContent /** 消息编码 @return 消息的持久化内容 */ - (WFCCMessagePayload *)encode; /** 消息解码 @param payload 消息的持久化内容 */ - (void)decode:(WFCCMessagePayload *)payload; /** 消息类型,必须全局唯一。1000及以下为系统内置类型,自定义消息需要使用1000以上。 @return 消息类型的唯一值 */ + (int)getContentType; /** 消息的存储策略 @return 存储策略 */ + (int)getContentFlags; /** 消息的简短信息 @return 消息的简短信息,主要用于通知提示和会话列表等需要简略信息的地方。 */ - (NSString *)digest; @end 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/message_payload.html":{"url":"base_knowledge/message_payload.html","title":"消息负载","keywords":"","body":"消息负载 消息内容需要在网络上传输或本地存储,而消息内容是复杂多变的。因此消息发送过程中先encode为消息负载;消息接收后由消息负载decode为对应的消息内容。在数据库从存取也是如此。 public class MessagePayload { public int contentType; public String searchableContent; public String pushContent; public String content; public byte[] binaryContent; public int mentionedType; public List mentionedTargets; public MessageContentMediaType mediaType; public String remoteMediaUrl; //前面的属性都会在网络发送,下面的属性只在本地存储 public String localMediaPath; //前面的属性都会在网络发送,下面的属性只在本地存储 public String localContent; } contentType 消息内容类型,根据该类型decode成对应的消息内容 searchableContent 可搜索内容,用于本地搜索或者在服务器搜索 pushContent 对于自定义消息,如果需要推送需要encode此字段。推送内容会使用此字段。 mentionedType 提醒类型。0 不提醒;1 对mentionedTargets里的user进行提醒;2 对群内所有人提醒。 mediaType 媒体类型,媒体消息内容使用,用来区别在服务器端文件对应的bucket。 local** 本地使用内容,不会在网络发送。比如媒体文件下载下来需要记录路径,或者本地处理过需要标记一些内容等。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/storage_and_sync.html":{"url":"base_knowledge/storage_and_sync.html","title":"存储与同步","keywords":"","body":"存储与同步 除了Web端以外的客户端内置有Sqlite数据库,基本上所有的信息都会有缓存。不同类型的数据缓存是有所区别的。 消息 消息是IM中最主要的数据,消息的收取是协议栈自动处理,消息收取后自动存储在数据库中。因此从数据库中读取消息和会话是当时最新的状态。此外需要监听新消息回调,收到新消息后重新从数据库中读取或者更新之前读取的数据即可。 其它类型信息 群组信息,群成员信息,用户信息,好友信息等,这类信息变更没有推送功能,因此需要在合适的时机去服务器刷新。这类信息的获取一般都是带有一个从服务器强制刷新参数refresh。数据不存在或者refresh为true时,协议栈会强制去网络刷新,如果数据有变动会发出通知。在应用中需要考虑信息取回来是空的可能,另外需要监听对应信息刷新事件。 获取用户信息接口: public UserInfo getUserInfo(String userId, boolean refresh); 用户信息刷新通知: public static final String ACTION_ON_USERINFO_UPDATED = \"cn.wildfirechat.client.on_userinfo_updated\"; 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/offline_message.html":{"url":"base_knowledge/offline_message.html","title":"离线消息","keywords":"","body":"离线消息 离线消息是指当用户设备不在线,发送给该用户的消息被缓存到服务器,当设备上线后,消息再推送给用户。 野火IM会缓存每个用户1000条消息ID,因此如果用户有超过1000条消息没有接收,那么就只能收下来最后1000条消息,之前的消息将不会收取下来。 所有的消息都会储存下来,客户端有接口可以获取服务器端当前用户指定会话的某些消息唯一ID某些范围的消息。比如可以获取某个MessageUid之前的50条消息。 为了支持多端,消息收下来后服务器端也不会删除,因此应用卸载重装或者登陆新用户,可以收到最多1000条旧消息。多端也可以做到任意多的设备登陆收发消息。 为了防止离线消息数据包太大,因此必须注意减少消息的尺寸。图片消息内容或视频消息内容需要携带一张缩略图,缩略图的尺寸不能大于5K字节。大尺寸的消息内容要定义成媒体消息内容类型,先上传到媒体服务器,再放媒体地址到消息内容中。建议消息内容的大小不要大于5K。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/group.html":{"url":"base_knowledge/group.html","title":"群组","keywords":"","body":"群组 群组功能上与微信和QQ的群组功能接近,发送到群里的消息每个群成员都可以收到。 群组通知 所有对群的写操作都会带有一个messagecontent参数,如果写操作服务器处理成功,会发送该消息到群里。 群组成员角色 普通成员/管理员/群主 群成员限制 架构上支持群成员人数无上限,但实际应用时会收到物理条件的限制。如果10000人的群,每秒钟发到群内100条消息,就将造成一百万的秒并发数,需要极高的性能配置和带宽。一般建议不要超过1000人每个群。 功能 功能 普通成员 群管理员 群主 创建群组 N/A N/A 创建者即为群主 修改群组名 NO YES YES 修改群头像 NO YES YES 修改群成员角色 NO NO YES 撤回群消息 NO YES(不能撤回群主和其它群管理员消息) YES 修改群成员名片 YES(仅能修改自己的) YES(不能修改群主和其它群管理员的名片) YES 转让群主 NO NO YES 解散群组 NO NO YES 退出群组 YES YES NO(先转让才能退出) 拉人进入群组 NO YES YES 移出群组 NO YES(不可移出其它管理员和群主) YES @部分群成员 YES YES YES @全部成员 NO YES YES 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"base_knowledge/chatroom.html":{"url":"base_knowledge/chatroom.html","title":"聊天室","keywords":"","body":"聊天室 类似于群组,但成员构成更倾向于临时状态,用户可以进入聊天室收发消息,离开聊天室就不再收消息,聊天室消息在本地不存储,聊天室消息也没有推送。聊天室人数没有限制。 功能 功能 描述 创建聊天室 仅能通过服务器接口创建 加入聊天室 离开聊天室 获取聊天室信息 获取聊天室成员信息 聊天室控制功能没有加入,因为牵扯到很多业务场景,建议客户自己来实现,比如禁言和踢出等。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/":{"url":"server/","title":"服务器说明","keywords":"","body":"服务器说明 野火IM社区版是开源的。社区版安装部署简单,能够满足大部分的需求。社区版与专业版只有2点区别:社区版只能单机部署,而商业版可以集群部署;商业版提供更快的问题修复速度,社区版需要等待我们处理或者用户的代码贡献。 服务器的性能 野火IM具有非常高的性能,单机2C4G能支撑10W以上长链接,1000条/秒以上的消息发送压力。使用大量内存缓存能够极大地提高用户体验,建议每10W在线用户使用4C16G服务资源,可以根据自己的业务特点估算最大的可能在线人数,部署对应的服务器资源即可。专业版拥有水平扩展和高可用能力,建议低配置多台部署,以便均匀地分散压力和做到有故障自动容错。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/server_port.html":{"url":"server/server_port.html","title":"服务器端口说明","keywords":"","body":"服务器端口说明 服务器使用了多个端口:1883用户tcp长链接,8083用于websocket长链接(暂未实现),80用户http连接。18080用于Server API使用。 野火IM的SDK基于微信mars,使用长短结合的办法最优化服务的连接处理。关于长短连接的详细信息可以参考mars的官方文档。 长链接 1883和8083都是长链接,运行野火IM的私有协议,野火IM的私有协议来源于对mqtt的二次开发。用于连接鉴权、发送消息、接收通知等。 短链接 80是http短连接端口,客户端设置的端口,客户端会通过短连接端口获取到长连接端口。服务器需要开通80/1883/8083的入访权限。 Server API 18080是Server API的端口。server api用户创建用户,获取token,发送消息,撤回消息等一系列由其它服务操作的功能。 安全防护 应用登陆到应用服务器时,需要返回用户Token给IM SDK,该token为用户凭证,十分重要,需要应用使用https链接登陆,并在本地安全存储。 长链接和IM短链接,用户发送协议包,协议包经过AES加密,加密的密钥在token中。mars直接在tcp层上实现的http协议,对于系统来说就是普通的tcp连接。iOS的ATS可以不用加例外。密钥是一个会话一个密钥,可以有效的保护用户安全。 Admin API是供应用服务进行调用的,接口有签名保护,建议和应用服务器放到同一内网中。 另外媒体文件的上传是在mars中进行,无法使用https。这里是有缺陷的,如果您需要对媒体文件进行安全防护,就需要自己上传媒体文件,然后调用SDK来发送文件。 综上,您需求确认您的媒体文件上传的安全性,如果要使用https,那就需要自己来上传。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/db_config.html":{"url":"server/db_config.html","title":"数据库配置","keywords":"","body":"服务器数据库配置 为了让用户快速体验,野火IM使用了嵌入式数据库h2 database,这样让用户可以不用安装配置数据库就能快速体验到野火IM的功能。但嵌入式数据库相对性能差,也无法做主从备份。客户在用户数100人以下或者体验时可以使用h2db,免去配置的麻烦,本文档可以跳过。其它客户建议在正式使用时使用mysql数据库,商业版客户建议使用mysql+mongodb。 mysql数据库版本 mysql5.7以上,支持utf8mb4.(对表情的支持需要utf8mb4) 建库建表 进入到sql目录,执行 ./initial_db.sh -u{user} -p{password}\" 修改服务配置 进入到config目录下,修改c3p0-config.xml,正确配置 db地址,用户名 和 密码。 com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/wfchat?useSSL=false&serverTimezone=GMT&allowPublicKeyRetrieval=true root xxxxxx 使用mysql 修改wildfirechat.conf中的下面属性改为0。服务器不再使用内置数据库。 embed.db 0 注意事项 野火IM服务器使用大量的内存缓存,一般情况下,数据库的数据仅用来备份以备系统重启。如果数据库出现瓶颈,可以从这几项入手解决,提高野火IM服务器缓存使用减少db的读取次数,db单独部署,提高db服务器的性能,尤其是换SSD,优化默认配置等。 使用mongodb 商业版本组合使用mysql和mongodb,需要按照mysql的配置说明再正确配置mongodb。在商业版的使用手册里有mongodb的配置方式。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-24 20:40:56 "},"server/server_memory.html":{"url":"server/server_memory.html","title":"机器内存的选择","keywords":"","body":"机器内存的选择 野火IM使用了hazelcast作为内存缓存。在内存越来越便宜的情况下,合理地使用缓存,会带来性能的大幅提升。野火IM针对不同的数据使用不同的缓存策略。 消息数据 消息对内存的占用 野火IM采用了先进的设计,对于消息只保存一条原始数据。也就是说1对1聊天和群聊每发一条消息,野火IM只保存一条消息。另外野火IM的消息尺寸比较小,对于图片视频语音都是作为媒体文件上传到媒体服务器,消息体内只保存一个url,消息使用pb格式存储,平均下来不会大于1K字节。 缓存的配置 消息数据会随着时间线性积累,而且旧的消息可能再也用不到,因此对于消息,野火IM的建议每个用户缓存最新100条7天以内消息。预估一下,假如每条消息1K,10W活跃用户,10W 100 1K = 10G。当用户接收消息缓存没有命中时,会从数据库加载该消息,不会丢失消息。修改配置config/hazelcast.xml, max-size修改为您的用户数*100。如果您使用商业版和mongodb,缓存条数可以减半。 604800 LRU 10000000 10 io.wildfirechat.persistence.MessageLoader 0 注:活跃用户数指7天以内登陆的用户数。 其它数据 其它数据比如用户,好友,群组,设置。基本与用户数成比例,每人不会超过30K数据,为了提高访问速度,因此全部放到内存缓存中。预计有10W活跃用户, 10W * 30K = 3G。 总结 如果您的用户需求较高且用户比较活跃,建议您每10W活跃用户配置16G内存。也可以适当降低缓存数减少内存消耗。商业版建议每10W用户12G内存。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/benchmark.html":{"url":"server/benchmark.html","title":"性能测试","keywords":"","body":"性能测试 修改最大文件打开数(ulimit),修改方法请用百度查。 单独部署db,并对配置进行优化。 下载jmeter3.3版本。把发布包中的tools/jmeter/*.jar放到\\pathtojmeter\\lib\\ext。也可以编译社区版源码中的插件代码。 使用jmeter打开tools/jmeter/目录下的连接数和发送消息脚本进行测试。注意进行连接数测试时需要使用jmeter集群模式,或者多台测试机器同时开始,以便能够达到理想的测试结果。打压机也不要和火信服务器放到一起,以免结果出现偏差。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/server_config.html":{"url":"server/server_config.html","title":"服务器配置","keywords":"","body":"服务器配置 config 目录下放有所有服务器的配置,部署时需要对配置进行修改 服务器的地址 修改wildfirechat.conf文件,把下面四个0替换成您的公网IP地址,并且开通这3个端口。端口要保持不变并开通公网访问,不要用其它端口! server.ip 0.0.0.0 port 1883 http_port 80 websocket_port 8083 客户端需要设置服务器地址,请使用域名指向这个ip,然后使用http://${domain} 地址(当然如果没有域名直接使用ip也行)。如果您的域名为www.wildfirechat.cn,那么客户端的服务器地址为http://www.wildfirechat.cn。 由于mars的限制,需要使用http(不用担心,都经过AES加密的)。 修改数据库 请参考数据库配置 修改服务器API密钥 把下面这个值换一个随机数,注意您调用这些接口的地方都要相应修改。 http.admin.secret_key 123456 修改token密钥 服务器用此密钥生产token,客户端连接时会带上这个token,然后服务器去解token,来验证用户的有消息。此token非常重要,一定要在上线时修改,防止泄漏 ##用来生产im token的私钥,只在服务器使用,客户端不用。正式使用时为了安全一定要修改这个值,切记切记 token.key hellomyimsecret 配置媒体服务器 请参考媒体服务器选择 推送配置 请参考推送说明 敏感词配置 #********************************************************************* # Sensitive configuration #********************************************************************* ##文本敏感词过滤处理方法,0 发送失败;1 发送成功但消息被服务器直接丢弃;2 命中的敏感词被替换成*** sensitive.filter.type 0 消息转发 #********************************************************************* # Message forward configuration #********************************************************************* ##消息转发地址 message.forward.url http://localhost:8087/message/forward 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-27 22:42:19 "},"server/admin_api/":{"url":"server/admin_api/","title":"Admin API接口","keywords":"","body":"Admin API接口 Admin API是供客户服务器调用的。所有的请求都是POST请求,请求body使用json格式。所有接口的调用都必须经过签名。所有的响应数据都是JSON格式。 签名规则 以下参数需要放在Http Request Header中 参数 参数说明 nonce 随机数 timestamp 当前的时间戳,为了防止重放攻击,时间戳与野火IM服务器时间戳差2个小时的请求会被拒绝 sign 签名 签名的计算方法: sign = sha1(nonce + \"|\" + SECRET_KEY + \"|\" + timestamp)。其中SECRET_KEY定义在wildfirechat.conf中。为了安全一定要修改默认的SECRET_KEY。 Content-Type \"Content-Type\": \"application/json; charset=utf-8\" 响应 所有响应都是如下这个格式。成功时code为0,result为请求返回对于的数据;失败时code为错误码,msg为失败提示。 { \"code\":0, \"msg\":\"success\", \"result\":{ \"userId\":\"a\", \"imToken\":\"hN0AF2XX6+pOWqMS7iQiZnCFfGA53r1r\" } } 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/admin_api/user_api.html":{"url":"server/admin_api/user_api.html","title":"用户","keywords":"","body":"用户 获取用户token 地址 http://domain/admin/user/token body 参数 类型 必需 描述 userId string 是 用户ID clientId string 是 客户端ID clientId为客户端ID,客户端SDK有获取clientId的接口 响应 参数 类型 必需 描述 userId string 是 用户ID imToken string 是 用户token 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"userId\\\":\\\"a\\\",\\\"clientId\\\":\\\"xxxxx\\\"}\" http://localhost/admin/user/token { \"code\":0, \"msg\":\"success\", \"result\":{ \"userId\":\"a\", \"imToken\":\"hN0AF2XX6+pOWqMS7iQiZnCFfGA53r1r\" } } 注册/更新用户 地址 http://domain/admin/user/create body 参数 类型 必需 描述 userId string 否 用户ID,如果传空,系统会自动生成一个用户id name string 是 登陆名 password string 否 用户密码,可以为空,如果为空,用户不可以在野火IM服务器登陆 displayName string 是 显示名字 portrait string 否 用户头像 mobile string 否 用户手机号码 email string 否 用户邮箱 address string 否 用户地址 company string 否 用户公司 extra string 否 附加信息 响应 参数 类型 必需 描述 userId string 是 用户ID 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"name\\\":\\\"a\\\",\\\"displayName\\\":\\\"A\\\",\\\"password\\\":\\\"123456\\\"}\" http://localhost/admin/user/create { \"code\":0, \"msg\":\"success\", \"result\":{ \"userId\":\"a\", } } 获取用户信息 地址 http://domain/admin/user/info body 参数 类型 必需 描述 userId string 是 用户ID 响应 参数 类型 必需 描述 userId string 否 用户ID name string 是 登陆名 displayName string 是 显示名字 portrait string 否 用户头像 mobile string 否 用户手机号码 email string 否 用户邮箱 address string 否 用户地址 company string 否 用户公司 extra string 否 附加信息 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"userId\\\":\\\"a\\\"}\" http://localhost/admin/user/info { \"code\":0, \"msg\":\"success\", \"result\":{ \"userId\":\"a\", \"name\":\"usera\" } } 更新用户状态 封禁/禁言用户 地址 http://domain/admin/user/status body 参数 类型 必需 描述 userId string 是 用户ID status int 是 用户状态,0 正常;1 被禁言,2 被封禁 响应 N/A 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"userId\\\":\\\"a\\\", \\\"status\\\":1}\" http://localhost/admin/user/status { \"code\":0, \"msg\":\"success\" } 查询用户状态 地址 http://domain/admin/user/checkstatus body 参数 类型 必需 描述 userId string 是 用户ID 响应 参数 类型 必需 描述 status int 是 用户状态,0 正常;1 被禁言,2 被封禁 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"userId\\\":\\\"a\\\"}\" http://localhost/admin/user/checkstatus { \"code\":0, \"msg\":\"success\", \"result\":{ \"status\":0 } } 获取封禁/禁言用户列表 地址 http://domain/admin/user/statuslist body 参数 类型 必需 描述 userId string 是 用户ID 响应 参数 类型 必需 描述 userId string 是 用户ID imToken string 是 用户token 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"userId\\\":\\\"a\\\"}\" http://localhost/admin/user/statuslist { \"code\":0, \"msg\":\"success\", \"result\":[ { \"userId\":\"a\", \"status\":1, }, { \"userId\":\"b\", \"status\":2, }, { \"userId\":\"c\", \"status\":3, }, ] } 获取用户在线状态 地址 http://domain/admin/user/onlinestatus body 参数 类型 必需 描述 userId string 是 用户ID 响应 参数 类型 必需 描述 status int 是 0 online, 1 have session offline, 2 no session 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"userId\\\":\\\"a\\\"}\" http://localhost/admin/user/onlinestatus { \"code\":0, \"msg\":\"success\", \"result\":{ \"status\":0 } } 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-19 21:41:57 "},"server/admin_api/user_relation.html":{"url":"server/admin_api/user_relation.html","title":"用户关系","keywords":"","body":"用户关系 建立好友关系 解除好友关系 获取用户的好友列表 添加黑名单 移除黑名单 获取黑名单列表 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/admin_api/robot_api.html":{"url":"server/admin_api/robot_api.html","title":"机器人","keywords":"","body":"机器人API 机器人是一种特殊的用户角色,跟普通用户在用一个空间中,需要避免机器人用户id跟普通用户id冲突的可能。使用admin api来创建机器人,然后机器人服务使用robot api来发送消息。 注册/更新机器人 地址 http://domain/admin/robot/create body 参数 类型 必需 描述 userId string 否 用户ID,如果传空,系统会自动生成一个用户id name string 是 登陆名 password string 否 用户密码,可以为空,如果为空,用户不可以在野火IM服务器登陆 displayName string 是 显示名字 portrait string 否 用户头像 mobile string 否 用户手机号码 email string 否 用户邮箱 address string 否 用户地址 company string 否 用户公司 extra string 否 附加信息 owner string 是 机器人拥有者 secret string 否 机器人密钥 callback string 否 机器人消息回掉地址 robotExtra string 否 机器人附加信息 响应 参数 类型 必需 描述 userId string 是 机器人用户ID secret string 是 机器人密钥 如果创建时不填写secret,会自动生成一个 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"name\\\":\\\"a\\\",\\\"displayName\\\":\\\"A\\\",\\\"callback\\\":\\\"http://localhost/robot\\\",\\\"owner\\\":\\\"b\\\"}\" http://localhost/admin/robot/create { \"code\":0, \"msg\":\"success\", \"result\":{ \"userId\":\"a\", \"secret\":\"xxxxx\" } } 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/admin_api/message_api.html":{"url":"server/admin_api/message_api.html","title":"消息","keywords":"","body":"消息 发送消息 地址 http://domain/admin/message/send body 参数 类型 必需 描述 sender string 是 发送者ID conv json 是 会话 conv.type int 是 会话类型 conv.target string 是 会话目标 conv.line int 否 会话线路,缺省为0 payload json 是 消息负载 payload.type int 是 消息类型 payload.searchableContent string 否 消息可搜索内容 payload.pushContent string 否 消息推送内容 payload.content string 否 消息内容 payload.base64edData string 否 消息二进制内容,base64编码 payload.mediaType int 否 媒体消息类型 payload.remoteMediaUrl string 否 媒体内容链接 payload.expireDuration long 否 消息过期时间 payload.mentionedType int 否 消息提醒类型 payload.mentionedTarget string list 否 消息提醒对象列表 响应 参数 类型 必需 描述 messageUid long 是 消息唯一ID timestamp long 是 服务器处理时间 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \\ \"{ \\ \\\"sender\\\":\\\"a\\\", \\ \\\"conv\\\": { \\ \\\"type\\\":1, \\ \\\"target\\\":\\\"a\\\", \\ \\\"line\\\":0, \\ }, \\ \\\"payload\\\":{ \\ \\\"type\\\":1, \\ \\\"searchableContent\\\":\\\"hello\\\" \\ } \\ }\" \\ http://localhost/admin/message/send { \"code\":0, \"msg\":\"success\", \"result\":{ \"messageUid\":5323423532, \"timestamp\":13123423234324, } } 撤回消息 地址 http://domain/admin/message/recall body 参数 类型 必需 描述 operator string 是 撤回者 messageUid long 是 消息唯一ID 响应 N/A 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"operator\\\":\\\"a\\\",\\\"messageUid\\\":5323423532}\" http://localhost/admin/message/recall { \"code\":0, \"msg\":\"success\", } 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/admin_api/group_api.html":{"url":"server/admin_api/group_api.html","title":"群组","keywords":"","body":"群组 创建群组 添加群组成员 移除群组成员 解散群组 获取群组信息 修改群组信息 获取群成员信息 转移群主 修改群名片 群组禁言 群组解除禁言 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/admin_api/chatroom_api.html":{"url":"server/admin_api/chatroom_api.html","title":"聊天室","keywords":"","body":"聊天室 创建聊天室 销毁聊天室 撤回聊天室信息 获取聊天室封禁用户列表 聊天室封禁用户 聊天室解除封禁用户 获取聊天室成员 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/admin_api/sensitive_word_api.html":{"url":"server/admin_api/sensitive_word_api.html","title":"敏感词","keywords":"","body":"敏感词 野火IM内置有敏感词过滤功能,对文本消息的内容进行过滤。为了不影响性能,请保持敏感词在1000个以内。 添加敏感词 地址 http://domain/admin/sensitive/add body 参数 类型 必需 描述 words list 是 敏感词数组 响应 N/A 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"words\\\":[\\\"a\\\",\\\"b\\\",\\\"c\\\"]}\" http://localhost/admin/sensitive/add { \"code\":0, \"msg\":\"success\" } 删除敏感词 地址 http://domain/admin/sensitive/del body 参数 类型 必需 描述 words list 是 敏感词数组 响应 N/A 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -d \"{\\\"words\\\":[\\\"a\\\",\\\"b\\\",\\\"c\\\"]}\" http://localhost/admin/sensitive/del { \"code\":0, \"msg\":\"success\" } 获取敏感词列表 地址 http://domain/admin/sensitive/query body 参数 类型 必需 描述 words list 是 敏感词数组 响应 N/A 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" http://localhost/admin/sensitive/query { \"code\":0, \"msg\":\"success\" \"result\": { \"words\":[\\\"a\\\",\\\"b\\\",\\\"c\"] } } 敏感词的高级处理方法 内置敏感词过滤功能只能对文本消息进行敏感词匹配。如果您有高级需求,比如对图片消息/语音消息或其它消息进行过滤。请使用消息转发功能,把每一条消息都转发过去,异步处理,如果命中敏感词,再调用撤回方法对消息进行撤回。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/admin_api/error_code.html":{"url":"server/admin_api/error_code.html","title":"code状态码","keywords":"","body":"code状态码 错误码 描述 对应处理 0 成功 n/a 1 服务器客户端密钥不匹配 检查客户端和服务器的密钥是否一致 2 无效的数据 数据解析错误,要么是PB出现了问题,要么是客户端与服务器的密钥不匹配 4 服务器出现未知错误 需要提交服务器日志给我们 5 数据未修改 一般是用来数据同步的,数据同步时会带有时间戳,这表示这个时间戳之后没有发送变化 6 token错误 使用了错误的token,检查token是否正确 8 用户被禁止 用户被禁止登陆 9 用户不在群组中 10 无效的消息内容 消息格式错误 11 群组已经存在 创建群组时,如果对应id已经存在 12 密码错误 16 已经发送过好友请求 7天之内已经发过好友请求了,不能再发送 18 已被对方拒绝好友请求 发送好友请求后,被拒绝,不能再此发送好友请求 19 好友请求已过期 当接受好友请求时,如果请求已经超过7天,则过期 20 不在聊天室 242 命中敏感词 243 签名过期 244 鉴权失败 用在Server API鉴权 245 授权客户端数目超过限制 仅在高级版版出现这个错误,社区版不限制客户端数目 246 用户被拉黑 247 用户被全局禁言 248 没有权限操作 249 服务器超时 250 调用次数超频 服务器对用户级别进行限拼,1000次/秒。 251 无效的参数 参数不合法,需要检查参数 253 对象不存在 254 功能没有实现 上述这些errorcode既有与客户端交互的,也有server api交互的。 server api签名错误会返回http code 401. 其它的都返回http code 200. 限频是针对用户级别的。有些server api需要使用某个用户操作,会计算到这个用户上。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/robot_api/":{"url":"server/robot_api/","title":"Robot API接口","keywords":"","body":"Robot API接口 Robot API是供机器人服务器调用的。所有的请求都是POST请求,请求body使用json格式。所有接口的调用都必须经过签名。所有的响应数据都是JSON格式。 签名规则 以下参数需要放在Http Request Header中 参数 参数说明 nonce 随机数 timestamp 当前的时间戳,为了防止重放攻击,时间戳与野火IM服务器时间戳差2个小时的请求会被拒绝 sign 签名 rid 机器人用户id 签名的计算方法: sign = sha1(nonce + \"|\" + SECRET_KEY + \"|\" + timestamp)。其中SECRET_KEY在创建机器人时指定。 Content-Type \"Content-Type\": \"application/json; charset=utf-8\" 响应 所有响应都是如下这个格式。成功时code为0,result为请求返回对于的数据;失败时code为错误码,msg为失败提示。 { \"code\":0, \"msg\":\"success\", \"result\":{ \"userId\":\"a\" } } 发送消息 地址 http://domain/robot/message/send body 参数 类型 必需 描述 sender string 是 发送者ID conv json 是 会话 conv.type int 是 会话类型 conv.target string 是 会话目标 conv.line int 否 会话线路,缺省为0 payload json 是 消息负载 payload.type int 是 消息类型 payload.searchableContent string 否 消息可搜索内容 payload.pushContent string 否 消息推送内容 payload.content string 否 消息内容 payload.base64edData string 否 消息二进制内容,base64编码 payload.mediaType int 否 媒体消息类型 payload.remoteMediaUrl string 否 媒体内容链接 payload.expireDuration long 否 消息过期时间 payload.mentionedType int 否 消息提醒类型 payload.mentionedTarget string list 否 消息提醒对象列表 响应 参数 类型 必需 描述 messageUid long 是 消息唯一ID timestamp long 是 服务器处理时间 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -H \"rid\":\"robota\" -d \\ \"{ \\ \\\"sender\\\":\\\"robota\\\", \\ \\\"conv\\\": { \\ \\\"type\\\":1, \\ \\\"target\\\":\\\"a\\\", \\ \\\"line\\\":0, \\ }, \\ \\\"payload\\\":{ \\ \\\"type\\\":1, \\ \\\"searchableContent\\\":\\\"hello\\\" \\ } \\ }\" \\ http://localhost/robot/message/send { \"code\":0, \"msg\":\"success\", \"result\":{ \"messageUid\":5323423532, \"timestamp\":13123423234324, } } 获取用户信息 地址 http://domain/robot/user_info body 参数 类型 必需 描述 userId string 是 用户ID 响应 参数 类型 必需 描述 userId string 是 用户ID name string 是 登陆名 displayName string 是 显示名字 portrait string 否 用户头像 mobile string 否 用户手机号码 email string 否 用户邮箱 address string 否 用户地址 company string 否 用户公司 extra string 否 附加信息 示例 curl -X POST -H \"nonce:14723\" -H \"timestamp\":\"1539698981861\" -H \"sign\":\"9e9f98672f466a81e6dd61570689528cf38e6418\" -H \"Content-Type:application/json\" -H \"rid\":\"robota\" -d \"{\\\"userId\\\":\\\"a\\\"}\" http://localhost/robot/user_info { \"code\":0, \"msg\":\"success\", \"result\":{ \"userId\":\"a\", \"name\":\"usera\" } } 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/event_callback.html":{"url":"server/event_callback.html","title":"事件回调","keywords":"","body":"事件回调 设置事件回调 请参考配置说明 接收消息回调 当服务收到发送消息请求后,把消息推送到配置指定的服务去。 body 参数 类型 必需 描述 sender string 是 发送者ID conv json 是 会话 conv.type int 是 会话类型 conv.target string 是 会话目标 conv.line int 否 会话线路,缺省为0 payload json 是 消息负载 payload.type int 是 消息类型 payload.searchableContent string 否 消息可搜索内容 payload.pushContent string 否 消息推送内容 payload.content string 否 消息内容 payload.base64edData string 否 消息二进制内容,base64编码 payload.mediaType int 否 媒体消息类型 payload.remoteMediaUrl string 否 媒体内容链接 payload.expireDuration long 否 消息过期时间 payload.mentionedType int 否 消息提醒类型 payload.mentionedTarget string list 否 消息提醒对象列表 messageUid long 是 消息唯一ID timestamp long 是 服务器处理时间 响应 成功http code 200;失败非200 事件回调 用户在线状态回调 群组成员变动回调 好友关系变动回调 用户信息变更回调 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/push_config.html":{"url":"server/push_config.html","title":"推送说明","keywords":"","body":"推送说明 推送设计及原则 Android和/iOS系统需要推送服务,但由于推送厂家太多,而且还在不断变化中,因此推送服务从IM服务中独立出来。当某用户需要推送时,IM服务会调用推送服务进行推送。 这样做的好处就是IM系统与推送系统独立,当推送发生变化时,不用修改IM服务。 推送没有选择第三方推送,都是直接根据型号,推送到各个厂家的推送服务去,这样就大大提高了推送成功率,但难度也提高很多,需要对接众多厂家。好消息是目前手机的头部市场已经形成,Android排名前5的厂家已经占据市场的90%以上,并且还在不断集中,能够减少对接的工作量。 有推送服务的厂家使用厂家的推送服务,没有推送服务的厂家,使用小米推送。在实际使用中小米推送与第三方推送在非小米手机上的表现差不多。 配置 在wildfirechat.conf配置文件中修改推送服务器地址 #********************************************************************* # Push server configuration #********************************************************************* ##安卓推送服务器地址 push.android.server.address http://localhost:8085/android/push ##苹果推送服务器地址 push.ios.server.address http://localhost:8085/ios/push 调用参数 使用post方式,内容为json,参数如下 body 参数 类型 必需 描述 sender string 是 发送者ID senderName string 是 发送者姓名 convType int 是 会话类型 target string 是 接收用户ID targetName string 是 接收用户名称 line int 否 会话线路,缺省为0 serverTime long 是 消息时间 pushMessageType int 是 0 普通消息;1 voip消息。在支持透传的系统上,voip消息用透传 pushType int 是 推送类型,android推送分为小米/华为/魅族等。ios分别为开发和发布。 pushContent string 是 消息推送内容 unReceivedMsg int 是 服务器端没有接收下来的消息数(只计算计数消息) mentionedType int 否 消息提醒类型,0,没提醒;1,提醒了当前用户;2,提醒了所有人 packageName string 否 应用包名 deviceToken int 否 设备token isHiddenDetail bool 否 是否要隐藏推送详情 language string 否 接收者的手机语言 demo推送服务 我们开发了推送服务,客户可以拿来直接使用。目前demo推送服务已经对接了iOS/华为/小米/魅族,其中魅族还需要调试。另外客户可以自行对接OPPO和VIVO。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/media_server.html":{"url":"server/media_server.html","title":"媒体服务","keywords":"","body":"媒体服务 野火IM的消息分为普通消息和媒体消息。媒体消息一般比较大,发送时需要先上传媒体文件到媒体服务器,得到一个url地址,然后再把包含这个url地址的消息发出去。野火IM同时支持内置媒体服务器和七牛媒体服务器。客户端不用修改。 使用内置媒体服务器。 修改如下配置,media.server.use_qiniu配置为0,这样所有媒体文件都将上传到fs目录,按照日期和类型存放。 media.server.use_qiniu 0 local.media.storage.root ../fs 内置文件服务器不是一个商业化的媒体服务器,有很大的限制。受限于linux的inode数,文件不能太多,需要定时清理,另外媒体文件提交较大,没有cdn加速下载会很慢,强烈建议客户在正式商用时使用七牛媒体服务器。 七牛服务器 去七牛官网申请存储服务,修改如下配置,media.server.use_qiniu配置为1,填写access_key和secret_key,server_url为上传地址,跟您选择的区有关,请选择正确的地址。然后为不同类型的媒体文件创建不同的bucket,并配置正确。主要要区分长期保存的bucket和会清理的bucket。 media.server.use_qiniu 1 qiniu.server_url http://up.qbox.me qiniu.access_key tU3vdBK5BL5j4N7jI5N5uZgq_HQDo170w5C9Amnn qiniu.secret_key YfQIJdgp5YGhwEw14vGpaD2HJZsuJldWtqens7i5 qiniu.bucket_general_name media qiniu.bucket_general_domain http://pghnpyzos.bkt.clouddn.com qiniu.bucket_image_name media qiniu.bucket_image_domain http://pghnpyzos.bkt.clouddn.com qiniu.bucket_voice_name media qiniu.bucket_voice_domain http://pghnpyzos.bkt.clouddn.com qiniu.bucket_video_name media qiniu.bucket_video_domain http://pghnpyzos.bkt.clouddn.com qiniu.bucket_file_name media qiniu.bucket_file_domain http://pghnpyzos.bkt.clouddn.com qiniu.bucket_portrait_name media qiniu.bucket_portrait_domain http://pghnpyzos.bkt.clouddn.com qiniu.bucket_favorite_name media qiniu.bucket_favorite_domain http://pghnpyzos.bkt.clouddn.com 一定要使用不同的bucket,至少要区分长期保存和短期保存。头像/收藏等需要长期保存,其它根据情况可能会定期清除。 使用其它服务器 上述两种服务服务器的url中都带有32位的uuid,基本上不会被穷举。但生成的url没有访问控制,传输过程中也没有加密,因此如果客户需要传输非常敏感的媒体文件,请在客户端上传文件到自己的应用服务器,然后再调用sdk发送消息。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/server_clean.html":{"url":"server/server_clean.html","title":"服务的维护","keywords":"","body":"服务器的维护工作 任何资源都是有限的,服务器需要定时清理来释放不用的资源。 日志的清理 在config目录下的wildfirechat-log.properties是日志配置文件,默认的配置是最多有5个日志循环备份,最大为10M。日志文件最多占用50M的空间,如果需要更多的日志,需要改动日志配置。 数据库的清理 消息是按照月份存储在36个message表只中,分别为t_message_${month},可以按照月份来删除消息。集群版使用mongodb保存消息,可以不删除消息,给用户更好的体验。 媒体文件的清理 媒体文件如果使用七牛,可以定时清理媒体消息内容的bucket,而头像和收藏等bucket要注意保留。 使用自带的媒体服务器,受限于inode的节点数,一定要注意不能接近inode的节点数,使用df -i命令查看。文件存储在fs目录下,目录为${type}/${year}/${month}/${day}/${hour}/${uuid}。其中type分别表示如下类型 Media_Type_GENERAL = 0, Media_Type_IMAGE = 1, Media_Type_VOICE = 2, Media_Type_VIDEO = 3, Media_Type_File = 4, Media_Type_PORTRAIT = 5, Media_Type_FAVORITE = 6 头像和收藏等bucket要注意保留。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"server/mysql_tune.html":{"url":"server/mysql_tune.html","title":"MySQL调优","keywords":"","body":"MySQL 调优 1,所有的表都必须有primary key. 因为需要用primary key来表示每一行,最好用自增的整形 2, 使用in代替or SELECT * FROM t WHERE LOC_IN IN (10,20,30); 3, 不使用子查询 使用join 4. 足够大的 innodb_buffer_pool_size 最大内存数在总的innoDB内存数据160%就行,比如数据大小5G,buffer size设置为8G就行,有个命令来获取应当设置的大小 SELECT CEILING(Total_InnoDB_Bytes*1.6/POWER(1024,3)) RIBPS FROM (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes FROM information_schema.tables WHERE engine='InnoDB') A; 需要注意这个系统刚开始允许,无法计算出实际使用量。一般需要系统实际允许几个月,或者设置成机器物理内存的一半。 5. 配置 innodb_log_file_size 使用足够大的写入缓存 innodb_log_file_size 可是须要注意假设用 1G 的 innodb_log_file_size 。假如server当机。须要 10 分钟来恢复。 推荐 innodb_log_file_size 设置为 0.25 * innodb_buffer_pool_size 6. 配置 innodb_flush_log_at_trx_commit innodb_flush_log_at_trx_commit = 1 则每次改动写入磁盘 innodb_flush_log_at_trx_commit = 0/2 每秒写入磁盘 假设你的应用不涉及非常高的安全性 (金融系统),或者基础架构足够安全,或者 事务都非常小,都能够用 0 或者 2 来减少磁盘操作。 7. 避免双写入缓冲 innodb_flush_method=O_DIRECT 8. innodb_write_io_threads 写IO线程,默认4,最大可设置成64.每个线程可以处理256个pending io request.需要根据您的cpu数和读写比例调整,在当前项目中可设置为物理核数的2倍 9. innodb_read_io_threads 读IO线程,默认4,最大可设置成64.每个线程可以处理256个pending io request.需要根据您的cpu数和读写比例调整,在当前项目中保持4就可以了 10. innodb_thread_concurrency 线程并发数,0是不限制。如果设置最大是1000,可以设置成cpu核数的8倍 11. 关闭swap 对于单独的数据库服务器,在内存足够大的情况下,可以关闭swap sync # 先执行下同步 swapoff -a # 关闭swap分区 swapon -a # 开启swap分区 swapoff -a && swapon -a # 刷新swap空间,即将SWAP里的数据转储回内存,并清空SWAP里的数据。刷新原理就是把swap关闭后再重启。 12. DB连接数 show global variables like \"max_connections\"; 显示最大连接数 SET GLOBAL max_connections = 2000; 设置最大连接数 13. c3p0连接池 修改最大连接数,注意需要确保DB能撑得起集群的最大连接数 14. 示例 mysqld.cnf配置 [mysqld] # Uncomment the following if you are using InnoDB tables #innodb_data_home_dir = /usr/local/mysql/data #innodb_data_file_path = ibdata1:10M:autoextend #innodb_log_group_home_dir = /usr/local/mysql/data # You can set .._buffer_pool_size up to 50 - 80 % # of RAM but beware of setting memory usage too high innodb_buffer_pool_size = 2G # Set .._log_file_size to 25 % of buffer pool size innodb_log_file_size = 512M innodb_log_buffer_size = 64M innodb_flush_log_at_trx_commit = 2 innodb_flush_method=O_DIRECT #innodb_lock_wait_timeout = 50 以上信息来源于 https://www.cnblogs.com/jxldjsn/p/6010720.html https://www.percona.com/blog/2016/10/12/mysql-5-7-performance-tuning-immediately-after-installation/ https://www.cnblogs.com/claireyuancy/p/7258314.html http://www.codingpedia.org/ama/optimizing-mysql-server-settings/ 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-27 22:19:41 "},"android/":{"url":"android/","title":"Android开发","keywords":"","body":"Android开发 代码编译与工程说明 ChatClient简介 ChatUIKit简介 WildfireChat简介 推送集成 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"android/compile.html":{"url":"android/compile.html","title":"代码编译与工程说明","keywords":"","body":"代码编译于工程说明 工程说明 本工程下面包含如下一些子module module名称 说明 备注 avenginekit 音视频相关 目前只支持1对1音视频 chat 野火IM的演示App,包含野火IM UIKit 如果想复用野火IM提供的UI组件,可基于UIKit进行开发 client 野火IM Lib部分,不包含UI 如果不需要野火IM提供的UI部分,可基于此进行开发 emojilibrary 表情相关 imagepicker 图片选择相关 mars-core-release 协议栈wrapper 编译 如果服务器是私有部署,则需对应修改服务器地址,然后编译。 // cn.wildfire.chat.app.Config.java // IM server相关地址及端口 String IM_SERVER_HOST = \"wildfirechat.cn\"; int IM_SERVER_PORT = 80; // App server相关地址及端口 String APP_SERVER_HOST = \"wildfirechat.cn\"; int APP_SERVER_PORT = 8888; // Voip turn服务相关 String ICE_ADDRESS = \"turn:turn.liyufan.win:3478\"; String ICE_USERNAME = \"wfchat\"; String ICE_PASSWORD = \"wfchat\"; 导入Android Studio进行编译,或者在项目根目录执行./gradlew clean build进行编译。 可能需要科学上网 由于依赖了一些推送等第三方,可能某段时间找不到对应的依赖,可以自行调试一下。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"android/ChatClient.html":{"url":"android/ChatClient.html","title":"ChatClient简介","keywords":"","body":"ChatClient简介 ChatClient是协议栈在Android平台的wrapper和平台实现,只加上了少量逻辑,ChatClient和协议栈一起完成了所有的能力,但不包括任何的UI。 协议栈处理连接/发送/接收/状态同步等任务,并且内置有SQLite数据库,组织管理各种数据。具有如下功能: 基础功能 消息功能 会话管理功能 消息管理功能 群组功能 用户功能 好友功能 个人设置 聊天室功能 频道(和微信公众号类似)功能 简单使用步骤 ​ 初始化操作,只需在主进程进行,下面只列出最简步骤,详情请参考android-chat项目 初始化 ChatManager.init(application, Config.IM_SERVER_HOST, Config.IM_SERVER_PORT); 置事件回调 ChatManager chatManager = ChatManager.Instance(); chatManager.startLog(); chatManager.addOnReceiveMessageListener(OnReceiveMessageListener listener); chatManager.addRecallMessageListener(OnReceiveMessageListener listener) // ... 设置其他时间回调监听,更多请参考ChatManger 初始化音视频 AVEngineKit.init(application, AVEngineKit.AVEngineCallback); AVEngineKit avEngineKit = AVEngineKit.Instance(); avEngineKit.addIceServer(Config.ICE_ADDRESS, Config.ICE_USERNAME,Config.ICE_PASSWORD); 连接IM 服务器 chatManager.connect(id, token); 等待时间回调通知,如收到新消息、用户信息更新等。 信息获取说明 用户信息/群组信息/频道信息/好友信息/设置信息等,客户端的DB中会存储上一次从服务器更新来的信息,因此当UI获取这些信息时可能返回为空(Android 平台,为了减少UI层的判断压力,采用了Null Object Pattern,返回值并不是NULL, 而是NullUserInfo等,NullUserInfo等对象uid是正确uid但其他信息是默认值,可参考具体的代码)。 另外有些场景UI希望是获取旧的信息尽快展示到UI上,然后同时刷新以便有更新显示正确。 因此当本地信息不存在或获取信息时强制刷新,协议栈回去IM服务器同步该信息,如果信息有变更,则会有对应的回调通知。 public interface OnUserInfoUpdateListener { void onUserInfoUpdate(List userInfos); } //ChatManager.java /** 1. 当返回为NullUserInfo,会触发onUserInfoUpdate 2. 当refresh为true时,如果是信息有更新,则会触发onUserInfoUpdate */ UserInfo getUserInfo(String userId, boolean refresh); 函数说明 请参考ChatManger这个类 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"android/ChatUIKit.html":{"url":"android/ChatUIKit.html","title":"ChatUIKit简介","keywords":"","body":"ChatUIKit简介 为了方便快速二次开发,和快速集成,我们提供了ChatUIKit,ChatUIKit提供了大量可重用的UI组件。 ChatUIKit依赖于ChatClient。当ChatClient调用connect后(调用connect就直接打开了数据库,不用等待成功连上),ChatUIKit就可以使用。 ChatUIKit包含以下页面: 会话列表界面 消息列表界面 输入框的处理 好友界面 好友请求处理界面 会话设置界面 个人信息界面 群组信息界面 频道信息界面 音视频通话界面 消息类型的支持: 文本 图片 语音 视频 文件 动态表情 输入状态 地理位置 通知消息 自定义消息,可以自己添加任意类型消息 音视频通话: 音视频通话只支持1对1,如果不需要可以选择去掉。 开发 自定义消息 继承MessageContent,并添加ContentTag注解,用于标识消息类型和消息存储类型。自定义消息类型要求大于1000。消息类型,参考MessageContentType;消息存储类型,参考PersistFlag。 调用ChatManager#registerMessageContent注册新消息类型,或者直接修改ClientService#onCreate进行消息注册 自定义消息UI 普通消息,靠边显示,显示发送者。 继承NormalMessageContentViewHolder,并添加响应注解,参考TextMessageContentViewHolder 通知消息,居中显示,不显示消息发送者。 简单/小灰条通知,界面只显示一个小灰条 自定义通知类消息后,将其加入到SimpleNotificationMessageContentViewHolder的MessageContentType里面即可 复杂通知,支持定义UI,显示比较复杂的界面 继承NotificationMessageContentViewHolder,实现相关方法,并添加对应的MessageContent和布局注解,请参考ExampleRichNotificationMessageContentViewHolder 响应用户动作 单击 用@OnClick注解单击的响应方法,用法和butterknife一致。参考ExampleRichNotificationMessageContentViewHolder#onClick,支持点击消息的不同UI作出不同的响应。 长按 用@MessageContextMenuItem注解长按响应方法,当有多个长按响应时,会弹出选择对话框,让用户选择选择目标响应,可参考ExampleRichNotificationMessageContentViewHolder#forwardMessage。另外,支持根据不同的消息、会话,过滤长按菜单选项,可参考ExampleRichNotificationMessageContentViewHolder#contextMenuItemFilter 双击,目前尚未支持 注册自定义消息UI 调用MessageViewHolderManager#registerMessageViewHolder注册新的消息UI,或者直接修改MessageViewHolderManager#init进行注册。 自定义会话类型 火信根据会话类型和会话线路唯一标识一种会话类型,故可以采用相应会话类型(单聊、群里等)组合不同会话线路实现自定义会话 继承ConversationViewHolder自定义会话类型UI,添加ConversationInfoType和@EnableContextMenu注解,其中@EnableContextMenu可选,表示是否允许长按操作。 注册定义会话类型UI 调动ConversationViewHolderManager#registerConversationViewHolder,或者直接修改ConversationViewHolderManager进行自定义会话类型UI的注册。 自定义会话扩展 会话扩展指的是:会话界面,点击+号,弹出的那些快捷功能。 自定义扩展 继承ConversationExt,并实现设置icon等相关方法,用ExtContextMenuItem注解需要响应点击的方法,当有多个时,会弹出选择对话框。如果需要使用startActivityForResult方法,需用ConversationExt#startActivityForResult,以保证正确回调onActivityResult,可参考FileExt 如果需要实现类似微信语音输入的扩展,可参考ExampleAudioInputExt 注册扩展 调用ConversationExtManager#registerExt,或直接修改ConversationExtManager#init进行扩展注册。 自定义会话列表状态通知 继承StatusNotification,并实现其方法, 调用ConversationListFragment#showNotification显示通知,调用ConversationListFragment#clearNotification清除通知。 修改会话列表长按菜单 参考ConversationViewHolder#removeConversation和ConversationViewHolder#contextMenuItemFilter 自定义搜索 继承SearchableModule,并实现其方法,参考GroupSearchViewModule 参考SearchPortalActivity#initSearchModule配置当前想进行的搜索项,参考SearchPortalActivity#search开始搜索 推送继承 todo 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"android/wildfirechat.html":{"url":"android/wildfirechat.html","title":"WildfireChat简介","keywords":"","body":"Wildfire Chat简介 Wildfire Chat是使用ChatClient和ChatUIKit的示范应用,设计时,充分考虑了二次开发的需求。 应用在application:didFinishLaunchingWithOptions:对ChatClient进行初始化, 关于推送方面的处理,当获取到token后,调用ChatClient的接口,设置token 检查是否已经登陆成功,登陆成功直接连接,否则跳转到登陆界面。 调用完connect后,打开主界面WFCBaseTabBarController,主界面有4个tab页面,分表是WFCUConversationTableViewController、WFCUContactListViewController、DiscoverViewController和WFCMeTableViewController。前两个是ChatUIKit中的界面。 除了第三方库以为的源码不算太多,请仔细阅读Chat的源码特别是AppDelegate的,以便掌握SDK的使用 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"android/push.html":{"url":"android/push.html","title":"推送集成","keywords":"","body":"推送集成 目前集成了小米、华为、魅族推送,开发者可以自行集成其他推送。小米、华为、魅族手机上,分别走各家自己的推送;其他手机走小米推送。 项目中的key等,只供测试使用,开发者需要自行申请相关key等。 推送相关代码位于push module,key相关配置在chat/build.gradle 开发者可自行集成其他推送服务 小米推送 小米支持透传和通知栏推送,目前voip相关消息,走透传推送,其他消息,走通知栏推送。透传和通知栏的差别如下表: | | 透传推送 | 通知栏推送 | | ---------- | ------------------------------ | ---------------------------- | | 允许自启动 | 通知栏不弹出通知,但拉活应用 | 通知栏弹出通知,并拉活应用 | | 禁止自启动 | 通知栏不弹出通知,也不拉活应用 | 通知栏弹出通知,但不拉活应用 | 当允许自启动,并采用通知栏推送时,通知栏会重复 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"ios/":{"url":"ios/","title":"iOS开发","keywords":"","body":"iOS开发 代码编译与工程说明 ChatClient简介 ChatUIKit简介 WildfireChat简介 推送集成 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"ios/compile.html":{"url":"ios/compile.html","title":"代码编译与工程说明","keywords":"","body":"代码编译与工程说明 由于服务器是私有部署,因此必须修改服务器地址然后编译。下载源码,然后用xcode打开ios-chat.xcworkspace 修改服务器地址 如下图,修改IM服务host和port,修改app服务host和port。测试体验时可以使用我们提供的turn服务,上线时,请务必使用自己部署的turn服务。 工程说明 如上图所示,有3个工程。 WFChatClient 功能SDK,负责实现所有的功能,不包括UI。ChatClient依赖于协议栈,您也可以自己编译替换协议栈。这个工程和协议栈的维护一般是我们来进行,建议遇到问题给我们提issue。如果是IM的通用需求,我们会尽最大努力满足。 WFChatUIKit UI SDK,负责常用IM UI界面。客户可以集成使用,快速开发,降低开发成本。如果不能满足您的需求,也可以抛弃ChatUIKit,自己基于ChatClient来开发自己的UI。建议这个工程有客户多多参与,如果有通用问题,请提Push Request或者issue。 WildFireChat 示例应用。使用了ChatUIKit和ChatClient,演示如何使用我们的SDK。 依赖库(二进制) libopencore-amrnb.a wav与amr格式的转换工具。 mars.framework 我们二次开发的协议栈,开源的,客户可以自主编译。 WebRTC.framework 谷歌正式发布的WebRTC库 WFAVEngineKit.framework 基于野火IM实现的信令系统,只支持一对一音视频功能。由于是购买的商业代码,无法开源,但可以协议转让源码。如果不需要音视频功能,可以去掉该库及相关UI。 依赖库(源码) ChatUIKit使用了许多优秀的开源库,都来源于github,放置于vendor目录下,客户集成时,需要避免冲突 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:41:21 "},"ios/chatclient.html":{"url":"ios/chatclient.html","title":"ChatClient简介","keywords":"","body":"ChatClient简介 ChatClient是协议栈在iOS平台的wrapper和平台实现,只加上了少量逻辑,ChatClient和协议栈一起完成了所有的能力,但不包括任何的UI。 协议栈处理连接/发送/接收/状态同步等任务,并且内置有SQLite数据库,组织管理各种数据。具有如下功能: 基础功能 消息功能 会话管理功能 消息管理功能 群组功能 用户功能 好友功能 个人设置 聊天室功能 频道功能 信息获取的一个原则 用户信息/群组信息/频道信息/好友信息/设置信息等,客户端的DB中会存储上一次从服务器更新来的信息,因此当UI获取这些信息时可能返回为空。另外有些场景UI希望是获取旧的信息尽快展示到UI上,然后同时刷新以便有更新现实正确。因此当本地信息不存在或获取信息时强制刷新,协议栈回去IM服务器同步该信息,如果信息有变更,会发出一个通知,如果没有变更则结束。比如用户信息 //用户信息更新通知 extern NSString *kUserInfoUpdated; /** 获取用户信息 @param userId 用户ID @param refresh 是否强制从服务器更新,如果本地没有或者强制,会从服务器刷新,然后发出通知kUserInfoUpdated。 @return 本地的用户信息,可能为空 */ - (WFCCUserInfo *)getUserInfo:(NSString *)userId refresh:(BOOL)refresh; 函数声明 由于函数太多,就不一一说明了,请找到WFCCNetworkService.h和WFCCIMService.h头文件,里面有所有ChatClient对外暴露的功能。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"ios/chatuikit.html":{"url":"ios/chatuikit.html","title":"ChatUIKit简介","keywords":"","body":"ChatUIKit简介 ChatUIKit是IM UI工具集,依赖于ChatClient。当ChatClient调用connect后(调用connect就直接打开了数据库,不用等待成功连上),ChatUIKit就可以使用。 ChatUIKit包含以下页面: 会话列表界面 消息列表界面 输入框的处理 好友界面 好友请求处理界面 会话设置界面 个人信息界面 群组信息界面 频道信息界面 音视频通话界面 消息类型的支持: 文本 图片 语音 视频 文件 动态表情 输入状态 地理位置 通知消息 自定义消息,可以自己添加任意类型消息 音视频通话: 音视频通话只支持1对1,如果不需要可以选择去掉。搜索WFCU_SUPPORT_VOIP 找到头文件中定义改成0。工程中去掉WebRTC和WFAVEngineKit的依赖。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"ios/wildfirechat.html":{"url":"ios/wildfirechat.html","title":"WildfireChat简介","keywords":"","body":"Wildfire Chat简介 Wildfire Chat是使用ChatClient和ChatUIKit的示范应用。 应用在application:didFinishLaunchingWithOptions:对ChatClient进行初始化, 关于推送方面的处理,当获取到token后,调用ChatClient的接口,设置token 检查是否已经登陆成功,登陆成功直接连接,否则跳转到登陆界面。 调用完connect后,打开主界面WFCBaseTabBarController,主界面有4个tab页面,分表是WFCUConversationTableViewController、WFCUContactListViewController、DiscoverViewController和WFCMeTableViewController。前两个是ChatUIKit中的界面。 除了第三方库以为的源码不算太多,请仔细阅读Chat的源码特别是AppDelegate的,以便掌握SDK的使用 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"ios/push.html":{"url":"ios/push.html","title":"推送集成","keywords":"","body":"推送集成 在作者多年服务客户经历中发现,客户遇到的问题有大约三分之一是推送的问题。主要有两方面原因引起的。 客户对iOS推送方面知识欠缺。APNS的原理与细节是每个中高级iOS研发工程师必备的知识。 当时服务是闭源的,客户的iOS工程师与我们的推送服务工程师信息不对等,沟通困难。 解决办法: 客户iOS工程师需要对APNS有较深入的了解,客户端确保获取到device token并设置给ChatClient。然后能够正确的导出证书,交给推送服务工程师。建议客户工程师详细阅读网易云信推送说明,极光推送说明等厂家的说明。 由于服务器都是开源的,建议推送服务工程师跟踪处理服务器的推送情况。把证书放置到指定位置后,跟踪启动时对证书的初始化,跟踪IM服务器有没有推送到推送服务器,跟踪苹果推送服务返回来的结果。 由于信息对称,iOS推送的调试对接还是很容易获得成功的。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"faq/":{"url":"faq/","title":"常见问题","keywords":"","body":"常见问题 文档和常见问题是客户获得支持的主要地方,客户遇到问题时,首先应该来这里查找说明。 通用问题 服务器问题 安卓问题 iOS问题 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"faq/general.html":{"url":"faq/general.html","title":"通用问题","keywords":"","body":"General FAQ 1. 如何处理信息托管 A:野火IM提供了群组托管/用户信息托管/好友关系托管。对这3种信息采用不同的处理方式 群组托管必须使用野火IM的。 用户信息托管是可选的。当选择野火IM托管时,客户可以使用服务API向野火IM同步用户信息(用户信息会自动同步到客户端)。当不托管时,可以在客户端实现UserSource,满足我们声明的接口(协议)后,IMUIKIT可以正常使用。 好友关系托管可选。当选择好友关系托管时,好友关系建议仅使用野火IM的,不建议使用同步方案。当不托管时,客户需要自己来实现好友关系的相关UI。野火IM的消息发送不依赖于好友关系。由于好友关系相对独立,因此比较容易解决UI问题。建议客户自己来处理好友关系。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"faq/server.html":{"url":"faq/server.html","title":"服务器问题","keywords":"","body":"Server FAQ Q. 如何把IM服务倒入到IDE中? A. 回答 Q. 我部署完成Demo服务后,客户端能登陆,但一只显示连接中? A. 回答 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 09:29:16 "},"faq/server/q1.html":{"url":"faq/server/q1.html","title":"如何导入到IDE中","keywords":"","body":"Q. 如何把IM服务倒入到IDE中? A. 这里讲一下如何倒入到IDEA中并运行,eclipse或其它IDE请参考IDEA自行解决。 首先确保IDEA配置正确,JDK及maven都正确安装。然后在github上下载下来最新代码,并解压。 打开IDEA,选择\"Import Project\" 选择“maven”,然后下一步 下一步 下一步 下一步 下一步 点\"Finish\" 点完结束之后,maven会自动下载依赖包,需要耐心等待一段时间,如果依赖包下载不下来,需要考虑更换国内的源,更换方法请自行百度。 依赖包下载完毕后,点\"Add Configuration\",然后点“+”,再选择\"Application\". 分别填入服务名称, Main class选择\"cn.wildfirechat.server.Server\",Working directory选择到\"broker\"目录,Classpath of module选择\"moquette-broker\"。 这里一定要选择对 点击红圈的运行或旁边的调试按钮来运行。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 08:17:45 "},"faq/server/q2.html":{"url":"faq/server/q2.html","title":"如何解决等登陆但一直连接中的问题","keywords":"","body":"Q. 我部署完成Demo服务后,客户端能登陆,但一只显示连接中 A. 请按照如下步骤检查: 确保只有一个IM服务实例在运行。社区版是单机单实例版本,如果启动多个实例会有异常,请确保只有一个实例启动。查询实例个数方法请百度,或者直接重启机器。 检查端口是否绑定失败。查看logs/wildfirechat.log 看里面是不是有异常抛出,看一下异常原因。异常原因里有bind失败就是端口被占用。需要找到使用该端口的应用并停止掉,然后重启IM服务。或者换一台服务器。 检查服务器配置中的server.ip是否配置正确。server.ip应该是服务器的对外提供服务的IP地址。 检查端口是否对外开放。在服务器上使用curl http://localhost/api/version或使用浏览器打开http://localhost/api/version看看是否返回一个json。然后再在另外一台电脑上用浏览器打开http://{server.ip}/api/version。 看看是否返回同样的json。 检查客户端配置是否正确。确保客户端配置正确。 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-04-17 10:19:11 "},"faq/android.html":{"url":"faq/android.html","title":"安卓问题","keywords":"","body":"Android FAQ 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "},"faq/ios.html":{"url":"faq/ios.html","title":"iOS问题","keywords":"","body":"iOS FAQ 2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2019-03-19 21:40:43 "}}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/alex16888_admin/docs.git
git@gitee.com:alex16888_admin/docs.git
alex16888_admin
docs
docs
master

搜索帮助