通用问题

1. 如何处理信息托管

A:野火IM提供了群组托管/用户信息托管/好友关系托管。对这3种信息采用不同的处理方式

  1. 群组托管必须使用野火IM的。
  2. 用户信息托管是可选的。当选择野火IM托管时,客户可以使用服务API向野火IM同步用户信息(用户信息会自动同步到客户端)。当不托管时,可以在客户端实现UserSource,满足我们声明的接口(协议)后,IMUIKIT可以正常使用。
  3. 好友关系托管可选。当选择好友关系托管时,好友关系建议仅使用野火IM的,不建议使用同步方案。当不托管时,客户需要自己来实现好友关系的相关UI。野火IM的消息发送不依赖于好友关系。由于好友关系相对独立,因此比较容易解决UI问题。建议客户自己来处理好友关系。

    托管在野火IM是说信息托管在客户部署的野火IM服务器。我们的所有产品都是客户私有部署,跟我们没有任何的联系和依赖。

2. 为什么删除了好友关系还能发送消息

A:野火IM发送消息时不对用户关系进行判断,只有有对方ID就可以发送(黑名单除外),因此陌生人或者删除好友都可以继续发送消息。如果需要禁止陌生人聊天,可以在客户端应用上去掉所有陌生人聊天的入口,另外也可以开启服务器中的禁止陌生人聊天的配置,如果开启需要确保某些特殊角色的用户类型为管理员类型,这样才可以向用户发通知。

3. 为啥发送好友请求后不能再次发送好友请求

A:为了防止稍扰,野火IM对好友请求做了以下规定

  1. 如果以前没有发送过好友请求,可以发送好友请求。
  2. 如果以前发送过好友请求,对方已经接受了,可以再次发送请求。
  3. 如果以前发送过好友请求,对方没有处理,在7天内会报错已经发送过,7天之后可以再次发送。
  4. 如果以前发送过好友请求,对方拒绝,在30天内再次发送会报错已经被拒绝,30天之后可以再次发送。

其中7和30为默认值,都可以在配置文件中修改。

4. 用户信息的更新策略(用户的头像更新了,为什么我这一端还显示旧头像?)

A:用户信息不是强同步的(强同步的有消息,好友列表,各种设置),因为要实现用户信息强同步需要付出非常大的代价,因此一般是不自动更新用户信息,只有在特定的情况下才去更新。野火IM在与某用户单聊时会强制更新一下该用户的用户信息,还有在该用户的个人详情页面也会更新,基本与微信/QQ逻辑一致。如果客户需要在特定的界面更新,可以自己修改对应的客户端的源码,获取用户信息时强制更新即可。

5. 消息无法删除问题(为什么消息无法删除,我重新安装应用,或者清除会话后再进入会话,被删除的消息就又出来了?)

A: 野火IM的社区版在2019.8.9号之前的版本有这个问题,请更新到这个日期之后的版本,然后配置文件中找到message.roamingmessage.remote_history_message,都配置为0,关掉这两个功能后,被删除掉的消息就不会再出现,这时消息行为就和微信一致。

6. 我创建的群组,在联系人/群组界面,怎看不到?

A: 和微信逻辑一致,需要将群组保存到通讯录,才能在联系人/群组界面看到。如果需要获取到某个用户的所有群组,可以通过客户端调用应用服务,应用服务通过server api调用IM服务获取到。但我们不建议这么做,因为建群是非常容易的一件事,可能用户使用上一年以后都有几百个各种各样的群,获取回来所有的群意义也不大。

7. 为了业务的需要,我们需要修改协议怎么办?

A: 为了保证专业版和社区版协议一致性,我们不对外提供协议修改能力。正常情况下把IM作为一个管道用,业务要跟IM解耦,不能把业务的东西加到IM中。如果是IM方面的扩展,可以给我们提需求。合理通用的需求我们都会满足,在社区版和专业版上都加上。另外我们很多实体都带有extra字段,保留给客户扩展使用,注意extra字段使用时要使用json格式,保留未来继续扩展的可能性。

8. 连接状态码有什么需要注意的吗?

A: 对于特殊的几种状态码一定要处理,不然容易出严重问题。对于kConnectionStatusRejected,表明当前用户已经被禁止登录。需要跳出到登录界面;对于kConnectionStatusTokenIncorrectkConnectionStatusSecretKeyMismatchkConnectionStatusLogout,需要重新获取token,重新调用connect,也可以直接跳到登录界面让用户重新登录。出现的问题原因多种多样,一个常见的问题就是切换过服务器,客户端跟服务器密钥不匹配,另外常见于安卓,保存的token损坏等。

9. 为什么客户端有时显示不了用户名,只显示id?为什么用户修改了头像和名称,别人看到还是旧的?

A: 野火IM各个端取用户信息都是同步的接口,当有内容要显示时,比如新来一条信息,UI层会从本地数据库取该用户信息,有可能该用户信息在本地不存在,那么UI界面上由于没有取到该用户信息,就会显示用户的id,从数据库没有读取到用户信息会触发从服务器获取用户信息操作。当获取用户信息成功以后,会发送通知。UI层应该监听该通知,当收到通知时,刷新UI界面。所以当遇到显示ID无法更新用户信息时,请检查UI是否添加了监听用户信息并刷新的功能。群组信息也是使用同样的原理。

另外也有用户有疑问,为什么用户更新了头像或者昵称,本地还是旧的信息。因为实时同步到所有的端的代价特别大,所以参考微信的机制,只有在部分界面强制刷新用户信息(比如在进入到该用户的对话界面,进入到该用户的详情界面),其他时间都只使用本地的缓存。强制刷新用户信息的办法是在获取用户信息的参数中传强制刷新参数为true。

特别要注意的是:仅仅在部分界面强制刷新用户信息,不能所有调用都强制刷新信息。因为强制刷新信息会触发一次协议栈与IM服务的交互,如果每次都是强制刷新,因为获取用户是非常高频的,所以会导致大量的无效请求,甚至导致客户端协议栈消息队列溢出或者服务器被打崩溃,导致严重问题产生。

其他信息比如群组信息等机制类似于用户信息。

10. 如何购买

参考购买流程

11. 客户自己部署的服务与野火官方有依赖和通信吗,野火会不会获取客户的信息。

A: 野火IM的产品都是跟野火IM官方没有任何依赖的,也没有任何数据通信。客户可以完全部署在隔绝的内网能够正常使用。社区版的所有源代码都是公开的,可以看到没有任何的对外请求,专业版也没有任何的对外访问。客户在实际使用时,可以关闭除了推送服务/机器人服务地址以外的所有出访策略。

12. 客户端登录状态是-6怎么处理?

A: 首先连接状态-6对应的值是kConnectionStatusSecretKeyMismatch,根据常见问题8,是需要跳到登录界面的,需要用户重新登录。其次是-6出现的原因要检查,-6是在服务器无法找到客户端的session而返回的错误。每个用户在getToken时都会带上clientId,platform。服务器会为每个用户的每个设备创建一个session,客户端和服务器使用session中的密钥进行加密通讯,找不到session的原因有如下几种:

  1. 客户端登录时使用的clientid不正确(客户端去应用服务器登录,应用服务器使用这个clientid去gettoken,然后IM服务器生成或更新session),这个clientid必须调用imclient去获取,不然就会找不到session。
  2. 客户端disconnect时,参数传的是1,这个时候IM服务器会完全销毁掉这个session,当用户下次再用旧的token登录时就无法解码。如果主动断开后期望保存session,参数传0.
  3. 客户端连接的IM服务和获取token的IM服务不是同一个,这个是最常见的原因之一。 可以这么确认:

    1. 本地浏览器访问http://{im-server-host}/api/version
    2. ssh登录到部署app-server的服务器,在终端里面执行 curl http://{im.properties 配置文件里面的 im.admin_url的 ip 部分}/api/version,如:curl http://192.168.2.131/api/version
    3. 确保 1 和 2 中返回的label字段完全相同,如果不相同,则表示不是同一个 IM 服务。
    4. 确认客户端代码里的应用服务地址和IM服务地址都是正确的地址(如果是PC或者Web SDK,IM服务地址是打包到SDK内的,确认这个地址就是自己环境地址;如果没有用野火的应用服务,那就确认连接的客户的业务服务地址是否正确)。
  4. 服务器做迁移的时候,没迁移数据库,也就没有用户之前保存的session。
  5. 客户端被踢,系统设计每个平台只能有一个设备登录,当另外一个手机登录同一个账户时,之前的session会被标记为deleted状态。
  6. 客户端卸载重装,cid会变化,如果某个环境缓存了token,则登录时就找不到对应的session。
  7. Web客户端刷新。Web客户端比较特殊,Web SDK的配置文件中有个参数是clientId的策略,某些策略下刷新会生成新的clientId,需要仔细了解这个策略和各种可能的情况。

解决办法:不要在应用服务器缓存token,每次登录时都要重新获取token,使用正确的clientid和platform,如果有多个IM服务注意别弄混了。如果是其他情况,可以跳到登录界面,让用户重新登录,重新登录时使用正确的clientId和platform。如果还是无法解决,可以检查服务器的t_user_session表,确认session状态。

13. 如何像微信一样,把所有频道收入到一个会话中?

A: 客户端获取会话列表有指定获取那些会话类型的参数,分两次获取会话列表,首先获取除频道以外的会话列表,然后再获取频道的会话列表,把频道的会话列表构建成一个会话信息插入到普通会话列表去展示。另外在点击处理时,判断如果是这个特殊的会话,就展示频道会话列表。

14. 如何实现用户在线状态,如何实现用户最后在线时间?

A: 野火IM认为在线状态是PC时代的产物,现在是移动互联网时代,手机应该是永远在线的(IM断开时,还可以走推送),在线状态是个非常鸡肋功能,就应该像微信一样默认对方就是在线的。但客户如果坚持要在线状态和最后在线时间功能也不是不可以,下面讲一下2个实现方案,也可以同时实施。

  1. 依靠野火IM的用户在线状态回调,在IM服务的配置中,设置用户在线状态回调到应用服务,应用服务记录每个用户上下线时间,然后客户端去应用服务获取对方的在线状态。
  2. 客户端主动上报上线/下线事件(程序进入前台切连上的时候上报上线事件,程序进入后台时,或者程序终结时上报下线事件),上报下线事件给应用服务,应用服务记录。然后客户端去应用服务获取对方的在线状态。

    两种方式可能都有一些局限性,可以结合使用。

15. 我不想收到某人退出群组消息该怎么处理?(让某些消息不显示该怎么处理?)

A:群通知消息是一类比较特殊的消息,协议栈会根据群通知消息的类型去更新对应群的群信息和群成员信息。因此对于群通知消息最好的办法是保留对应的类型而重写它的内容。

如果仅仅是让某些群通知消息不显示,只需要重写它的存储类型,改成不存储的类型,这样UI上就不会显示(更改方法,请参考消息内容)。如果要想更改内容,则需要在群操作是带上messageContent参数,server api带上的是messageContent转化过的payload参数,服务器处理完群操作后会发出您指定的消息内容(群操作接口可以传入messgeContent参数,如果不传,服务器会发送默认的通知)。详情请参考如何不显示退群和踢人消息

16. http response的状态码为 403

A:如果服务器在国内,通过域名访问服务器时,域名需要进行备案,如果未备案,会被拦截,直接返回403。

17. 手机上如何登录管理员账号

A:由于客户端限制只能手机号验证码登录,故需要为管理员设置一个手机号,然后用该号码登录。为管理员设置手机号,有下面两种办法:

  1. 如果购买了我们的管理后台,可以很方便地在管理后台为管理员设置手机号码。
  2. 直接操作数据库,为admin账号设置手机号,直接操作数据库,需要重启服务端

18. 某些手机连接正常,而某些手机无法连接服务器

A:检查一下手机时间和服务器时间是否大体一致,需要进行时钟同步。

19. 服务器什么时候会调用推送服务

A:服务器首先会把消息往客户端发送,如果不在线或者发送失败,则检查是否有推送内容(系统内置消息已经定义好了推送内容,自定义消息需要自行填写pushContent内容),如果没有就结束。然后再检查是否有pushToken,如果没有就结束。然后再检查是否会话静音,最后检查是否全局静音。

20. 如何判断还有申请的状态,比如已发送,已过期,已接受,已拒绝。

A:好友请求是有方向的,从SDK中是能分别读出所有发送的请求和收到的请求。请求有已接受/已拒绝/未处理的状态,发送方可以根据是否存在判断是否已发送,也可以发送请求根据返回来的错误码判断是已发送过还是被拒绝;接收方可以根据收到的请求时间来判断是否已经过期,过期时间在服务器配置中

21. 为什么删除了消息或会话,卸载应用重新安装又产生了?为什么清空一个会话内的消息,下拉刷新又重新刷出了消息。

A:IM服务有两个特性,对应的服务器的两个配置如下。如果开启第一个配置,卸载重装会把最近1000条(配置文件中有配置,可以改为更多或者更少)消息同步下来;第二个配置是说当你在一个会话中本地消息看完了,可以拉取服务器上本服务器的消息。当本地会话为空的时候,下拉就从远端拉取了。因为删除只能在本地删除,无法删除远端,所有就有了删除后还能再次出现的场景,如果你们不能容忍这个场景,可以把这两个开关关闭。

##首次登录,是否接收之前的历史消息。0 不同步历史消息;1 同步历史消息。
##选择不同步历史消息依然会同步最近5分钟内的消息。因为换手机期间可能收到消息,不能丢失。
message.roaming 1

##是否开启拉取远程历史消息
message.remote_history_message 1

22. 野火IM通过等保测评了吗

A:等保测评全称是信息安全等级保护测评,这个是需要客户自己来做。因为我们提供的不是成品,我们提供的是半成品和组件,需要客户来进行封装二次开发及和业务系统对接,开发完成后的成品产权属于客户,所以需要客户进行等保测评。客户在等保测评时,我们可以给予一定的支持。

23. 群头像的更新问题

A:请参考群的一些细节问题

24. 为什么不能在前端GetToken呢

A:获取token是使用的server api,需要secret进行签名才行,这样就需要在前端(包括Web/Android/iOS等客户端)保存secret,而前端是很不安全的,很容易被人破解找到secret,一旦拿到secret就相当于拿到了你们家大门钥匙,没有任何安全性可言了。

正确的做法是修改复杂的secret,然后所有的server api请求都在后端进行,也就是说前端请求后端,后端请求野火IM。另外需要保护野火IM的18080端口,不对公网开放,防止被攻击。

25. 消息什么情况下会重复?

A:在某些情况情况下(客户端弱网、服务器压力太大、网络抖动等),可能消息发送到IM服务后,IM服务回复ack失败,这样客户端会再尝试一次,重试成功后就产生了实际发送2条的情况,对端收下了就重复了。一般情况下比较少见,错误不算严重,而且彻底解决的代价太大,所以就保持现状。

如果您想消除这种表现,可以在UI层做个判断,如果两条消息紧挨着且内容完全一样,可以过滤掉一条;如果您的场景中某些消息严格不能出现重复,可以考虑在消息中加上业务唯一id,然后在收到后根据唯一id去重。可以在UI层存储这种关键消息的业务唯一id和messageid的对应关系(放到Share Preference中,或者数据库中),当收到新消息后就可以快速进行排重了。

26. 扫码登录,扫码加群,扫码加好友的实现原理?

A: 这些功能都不属于IM的功能,都是应用层的业务,这里只简单说一下。二维码实质是个URI,扫码只是方便手机输入这个URI,跟手动输入也没有实质性的区别。这个URI格式和意义需要展示方和扫码方共同支持,这样才能在双方直接传递信息。一个URI正常情况下是这种格式的 [scheme:][//authority][path][?query][#fragment]。Scheme是确定是那个 应用提供服务的,移动端需要去注册这个Scheme,我们提供的demo中使用的Scheme是wildfirechat。这样当移动端浏览器打开这个scheme的URI时会自动打开我们的应用,并把URI传递给我们。Authority是服务的类型,Scheme确定了是那个应用,Authority则是定义了这个应用中的那个服务。Path定义了服务的具体内容。野火的DEMO中使用了如下三个URI

wildfirechat://user/useridxxxxx
wildfirechat://group/groupidxxxx
wildfirechat://pcsession/sessionidxxxx

根据扫码获取的URI就能很方便的获取到对应的用户ID/群组ID/PC会话ID。由于是应用层的业务,所以客户可以随意修改这些定义,只需要注意2点,一个是一定要改成自己的不要用我们默认的,如果另外一个app也用我们默认的会引起冲突;另外一个是需要扫码方和展示方对齐URI的格式和含义,这样才能正确传递信息。

27. 能不能再合适的时机多次调用connect提高连接成功率?

A:千万不要重复调用connect,只调用一次就好了,因为重复调用connect时会重新打开数据库,如果这是正在数据库操作,很容易引起crash。野火IM的重连逻辑足够完善,不需要手动干涉重连。

28. 能正常发送文本消息,但是不能发送语音、图片和文件

A:原因是未部署媒体服务、或者媒体服务配置错误。im server默认使用内置文件存储服务。内置文件服务,im server部署成功之后,即可使用;如果配置为其他文件存储服务,修改对着im server配置文件里面的模板进行修改。

29. 发送文件大小上限是多少?想要发送超大文件怎么办?

A:先了解一下野火IM发送文件的流程。SDK调用协议栈发送媒体类消息(图片,文件,视频,语音等)时,协议栈检查问题文件链接是否存在,如果存在就直接发送消息,如果链接不存在则启动上传流程,上传成功后把链接地址更新到消息体中,再把消息发送出去。

上传时先把所有的内容读取到内存中,因此必须有个大小限制,而且由于协议栈http上传不支持断点续传,不支持分段上传,所以过大的消息体体验也会很有问题,因此就限制了200MB的大小。

专业版IM服务支持大文件上传功能,如果是专业版且不使用内置文件存储则可以支持到4GB的文件大小。

30. 为什么服务要限定使用80端口?

A:我们的开发野火的初衷是服务于社会、造福于社会,在开源不久就发现有许多非法和半非法的行为在使用野火IM,给社会带来了危害,也给我们带来了不必要的麻烦。为了避免这种情况,我们强制使用80端口,这样在国内必须备案才能使用,备案后会明确受到监管,这些非法和半非法的事情无法去备案(或者是不敢去备案),这样就避免了他们使用野火给社会带来危害。

所以我们建议IM服务专机专用,专门为IM服务购买一台云服务器。另外专业版IM服务支持nginx部署,是可以跟其他应用共享80端口的,也可以使用专业版IM服务。如果是政企事业单位,因为安全策略无法使用80端口,也可以联系我们,在我们确认情况后,会免费提供定制化端口的SDK。

31. xlog日志如何解压

xlog日志是微信mars日志格式,可以参考他们的介绍。我们使用时未对日志进行加密,使用mars提供的python脚本decode_mars_nocrypt_log_file.py进行解压即可,详情请参考mars wiki

32. 如何实现好友请求的追加和回复功能

A:部分IM产品拥有追加和回复功能,追加就是发起方发送请求后,还可以继续补充信息,回复就是接收方可以回复请求方,请求方收到回复后可以继续回复。可能交互上有些限制,比如只能追加一条或者只能等对方回复才能再次回复等等,但实质上还是双方在不存在好友关系的情况下可以进行聊天,野火IM也可以实现这种交互,可以为双方建立一个单聊会话(其实没有所谓建立会话的概念,在这个会话里发送消息,会话就自动建立了),line选定某个值为好友追加和回复使用,然后双方就可以沟通了。

33. 草稿是如何实现的?为啥有时候会显示成json字符串?

A:草稿分为普通草稿和复杂草稿。普通草稿很简单,就是简单的字符串;复杂草稿包含更多的信息,比如@信息,比如引用信息,可能客户也会二次开发其它信息。简单草稿的存储是字符串,复杂草稿以json格式存储。当UI上需要显示时,需要先json解析,如果无法解析则以普通字符串处理。如果可以解析,需要检查是否有@信息和引用信息。需要注意的是专业版支持草稿多端同步,需要确保所有端对草稿的定义是相同的,也可以在服务器关掉同步功能。

34. 如何实现运行新加群成员查看加入之前10条消息?需要准确到10条,不能更多或者更少

A: 可以在客户端实现,可以知道当前用户加入群的时间,然后确保拉取远程消息显示为您指定的数目。为了避免用户删除部分消息继续拉取,可以在拉取指定条数消息后记录已经拉取完成的标志位,然后每次拉取前检查标志位就行。

35. 直接修改了数据库,但客户端没有更新

A: 首先,直接修改数据库不会更新缓存;其次,客户端同步信息时,会优先使用缓存中的数据,并且会比较时间戳,如果时间戳一致的话,将不进行同步。这就可能出现修改了数据库,并且重启了系统,数据依然不能同步。综上,需要修改数据时,不能直接修改数据库,必须使用server api进行修改。

36. 客户端重装或者换端登录,第一次登录非常卡非常慢,这是什么原因?

A: 首次登录,协议栈会从服务器同步一定量的消息,IM服务配置文件中message.max_queue配置为同步最近的消息数目,社区版默认是1024条,专业版默认是5000条。实际上协议栈同步消息特别快,5千条消息10秒左右就能同步完成。卡主要原因是UI的刷新导致的,在未接收完所有消息前刷新UI是无效的,可以只有在链接状态变成1以后再刷新一次UI。

协议栈收消息是一次一批接收的(总大小为512KB,条数不定,跟消息大小有关),有些客户自定义开发会针对每条消息处理,如果首次登录几千条,这时就特别注意要避免不停的刷新UI。

野火Demo做了比较完善的优化,使用野火SDK进行开发的客户常常在这里遇到问题,收到大批量的消息导致大量刷新UI,导致大量请求用户信息和群组信息,导致客户端或者服务器端超频,导致部分数据同步不下来。使用野火SDK进行开发一定要注意,只有在连接状态变为1时才能进行界面刷新,还有收到usersetting_updated事件也要刷新

37. 如果避免消息乱序?

野火消息发送是并发的,如果快速发送消息,就有可能后发先到。如果想要保持消息的顺序,需要修改一下SDK,让消息发送改成顺序发送,只有前一条发送成功后再发送后一条。存储类消息,可以先保存到协议栈,等到要发送时再调用sendSavedMessage方法发送。

38. 野火Demo上的隐私协议和用户协议源文件在哪里?

可以参加借鉴野火的隐私协议和用户协议,注意修改为自己的信息。源文件已开源,请点击码云Github下载。

39. 消息的大小限制是多大?

野火消息内容分为2种,一种是普通消息,消息的所有内容都在payload中;另外一种是媒体类消息,媒体文件会上传到对象存储服务,消息的payload就只包含这个对象的链接。消息的payload需要严格限制大小,太大会影响消息的收发销量,目前建议是不超过15KB;消息的媒体文件也是有大小限制的,社区版IM服务的大小限制是200MB,专业版IM服务使用内置存储也是200MB,专业版IM服务使用其他对象存储可以支持4G的文件。

图片、视频是常见的媒体类消息,需要把图片和视频文件上传到对象存储服务,此外还需要在消息的payload中携带缩略图,这样在收到消息时不用下载就可以立即看到缩略图,这种情况下要严格限制缩略图的大小。

组合(合并转发)消息或者其他类型消息,如果要支持非常大的大小,也可以改成媒体类消息,可以把大部分内容作为文件上传,客户端需要全部显示时下载显示。

40. 野火为什么要限制只能使用80端口?什么情况下才会给开通定制端口?

即时通讯工具有一定的特殊性,很容易被用于诈骗和灰产等行业。如果被人用在了非法用途,很可能使人穷家荡产甚至家破人亡,这就背离了我们努力创造美好生活的初衷。因此我们产品只能出售给国内企业,不出售给国外客户或国内个人,要求一定要使用80端口,必须在国内进行备案才可以使用。这样虽然增加了很多麻烦,但也减少了被用于非法目的的可能,既保证了普通用户的安全,也会能够保护我们公司更持续稳定地发展。

如果是政府单位或者保密单位,受限于国家网络安全的限制要求,无法使用80端口的。可以微信联系我们说明情况后,出具证明后,我们无偿地提供客户需要的端口的SDK。如果是因为跟其他服务比如Nginx冲突,请单独为IM服务准备一台服务器,确保IM服务专机专用,确保IM服务有80端口可以使用。请理解我们的苦衷。

2018 © wildfirechat.net 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2024-10-25 13:16:51

results matching ""

    No results matching ""