通用问题

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天之后可以再次发送。

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界面。

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

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

10. 如何购买

参考购买流程

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

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

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

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

  1. 客户端登录时使用的clientid不正确(客户端去应用服务器登录,应用服务器使用这个clientid去gettoken,然后IM服务器生成或更新session),这个clientid必须调用imclient去获取,不然就会找不到session。
  2. 客户端disconnect时,参数传的是1,这个时候IM服务器会完全销毁掉这个session,当用户下次再登录时就无法解码。如果主动断开后期望保存session,参数传0.
  3. 服务器做迁移的时候,没迁移数据库,也就没有用户之前保存的session。
  4. 客户端被踢,系统设计每个平台只能有一个设备登录,当另外一个手机登录同一个账户时,之前的session会被标记为deleted状态。
  5. 客户端卸载重装,cid会变化,如果某个环境缓存了token,则登录时就找不到对应的session。

解决办法:不要在应用服务器缓存token,使用正确的clientid和platform。如果是这几种情况,可以跳到登录界面,让用户重新登录,重新登录时使用正确的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条的情况。一般情况下比较少见,如果您的场景严格不能出现重复,可以考虑在消息中加上业务唯一id,然后再收到后去重。

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的格式和含义,这样才能正确传递信息。

2018 © wildfirechat.cn 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2020-05-16 10:01:57

results matching ""

    No results matching ""