最佳实践

记录实际应用中的最佳实践方法。

1. Q. 红包有已打开/未打开状态,能否修改IM消息中的已读/未读状态

A. 使用野火IM的一个原则就是:不能把业务逻辑强加于IM系统,需要保持IM服务的独立性。红包的已打开/未打开状态属于业务逻辑。应该把该状态保存在红包服务器,当红包消息显示时,如果本地没有该红包对应的状态,应该去红包服务器取回状态,取回之后判断如果已经打开,保存已打开状态下来,如果没有打开则不存储。之后每次显示红包消息时都根据本地保存的状态是否打开过,如果已经打开显示打开状态;如果未打开则再去红包服务器刷新。这样当多端登录或者更换手机后,状态也都能正确显示。(此逻辑仅供参考)

2. Q. 如何添加内置动态表情,如果收藏表情,还有如何开发应用商店。

A。 请参考小表情大世界

3. Q. 多人音视频想做成微信那样,在群内显示正在通话中,可以点击加入。

A。 首先我们不认同微信的模式,当部分人在群内进行通话时,所有人都可以点击加入,带来隐私性的问题。其次如果客户坚持需要此种模式,是可以根据SDK来自定义开发的,具体实现步骤如下:

  1. 音视频通话的callsession有个发起者的属性,可以知道谁是发起者。当发起者离开时,音视频SDK也会自动选举一个发起者。
  2. 发起者可以在群内周期性的广播自定义消息,需要把消息定义为透传消息,内容是谁在通话,群内其它用户收到后可以显示正在通话中,可以点击。
  3. 当群内用户点击要求加入时,发送加入请求消息(同样需要定义为透传消息),发起者收到消息后弹出“通知XX要求加入,是否同意?”,用户点击同意调用邀请此人加入。

4. Q. 上线时要注意什么问题呢?

A. 请参考 上线检查事项

5. Q. 有种场景,需要给一个用户发消息,又不想让发送方接收到消息?

A. 这种情况下你可以定义一种自定义消息(包含是那一方要接收消息及消息的内容),如果接收用户肯定在线可以用透传消息,如果接收用户可能不在线还想收到,可以用不存储消息。然后当客户端收到后判断是那一方,如果不是接收方就抛弃,如果是接收方就调用客户端API插入想要发送的消息(文本/图标/或者其它存储类型自定义消息)并更新UI,这样就做到了给用户发消息,发送方接收不到的需求。

6. Q. 多人音视频为什么没有做得像微信那样,在群里通话,其他成员能够看到并加入?如何实现这种效果?

A. 野火这么选择是出于隐私考虑的,很多人在群里通电话并不愿意被其他人看见,更不愿意有人突然闯入。但如果想做成微信那样,也是可以的,需要您做一定的二次开发。可以自定义一个通知消息(存储状态标志位用透传消息,这样只有在线用户才能收到),会议的主持人周期性(比如3秒钟)地广播到群内,其他人在会话内收到通知后在会话内显示通话状态状态,当点击加入后给会议主持人发送一条消息,主持人直接把该用户拉入会议,或者提示用户是否同意后拉入会议。会议主持人在电话的session对象中能够获取,当主持人退出后,会重新选举出新的主持人,所以需要关注主持人变更的通知。

7. Q. 如何实现让用户主动搜索群组,如何让用户搜索某一类或者多类群组?

A. 野火IM没有提供群组搜索功能,如果需要搜索群组功能,需要客户在应用服务二次开发,直接读取IM服务的数据库,搜索t_group表即可。注意t_group表中的type是群类型,不能使用这个字段,有个_searchable字段是留给客户做搜索扩展用的,可以给这个字段设置上业务属性,比如行业性质等,然后搜索时就可以按照业务来搜索了。

SpringBoot可以配置多个数据源,如果您使用demo应用服务器,请给demo应用服务器配置上IM数据库数据源。请注意IM数据库一定要只读不能修改,如果需要修改请通过api进行修改,因为IM服务器使用了缓存,直接修改数据库容易导致数据不一致。

8. Q. 如何同步会话列表,这样可以在换机时保留所有的会话。

A. 野火SDK中会自动同步一个月内的会话列表,如果需要同步更多的会话列表信息,就需要二次开发来实现。交互上可以在设置中添加菜单上传会话列表,然后登录到新手机后再恢复会话列表。保存会话时可以读取会话列表,把会话和时间保存下来就可以了;恢复时SDK有设置会话时间的接口,检查一下如果会话不存在就设置一下会话时间,会话就会出来了。

9. Q. 连接之后同步消息的处理方式。

A. 当协议栈首次连上IM服务之后,会从IM服务同步离线消息,同步完离线消息之后再同步设置(包括消息状态等)。可能会离线消息数量较大,如果都抛到应用层接收消息处理,很可能造成界面卡顿,而且因为是先收消息再同步设置,可能消息状态不准确。因此最佳做法是当连接状态是接收中时,收到消息不刷新UI。只有收到连接状态变成已连接或者设置更新时再刷新一次。这样即使离线消息有几千条甚至更多,也可以在两三秒秒的时间同步完成。

目前所有客户端demo都是这样实现的,在连接状态是接收中收到消息不处理,接收完成之后统一刷新。这样会有一个限制是,不能依赖接收到的消息来做业务处理,比如收到某个消息然后做什么事,特别是web端要避免依赖消息来驱动业务。

10. Q. 如何实现类似于微信群接龙的功能。

群接龙在工作中是非常实用的功能,使用野火IM也可以实现这个功能。首先需要自定义消息,自定义消息包含大概2部分,第一部分是固定信息,比如接龙的标题发起人描述等;第二部分是接龙列表。UI上需要处理接龙的编辑展示查看等工作。在应用服务需要保存接龙结果。工作流程如下:

  1. 发起人选择发起接龙,弹出创建接龙界面,输入各项内容。点发起后,调用应用服务创建接龙,在应用服务创建成功后,使用server api发送消息。
  2. 其他人收到消息后展示接龙信息,包括固定信息和接龙列表。
  3. 参与接龙的用户点击接龙按钮,弹出接龙修改界面,这时要从应用服务获取最新接龙数据,然后用户可以添加和删除接龙。点确认,先调用应用服务进行处理
  4. 客户端调用的数据中包括添加或删除项,应用服务需要考虑有没有并发问题,如果有就用锁(如果分布式需要分布式锁)逐个处理,处理成功之后使用server api发送消息。
  5. 可能还有别的一些功能,比如接龙统计等需要完成。 在流程中,可能还有权限问题需要考虑,比如发起人才可以删所有人的接龙,普通用户只能删除自己的。发起人可以终止接龙。群主或者群管理员也可以终止接龙等。

11. Q. 场景:用户A分享了群二维码给用户B,用户B扫码进入该群,并提示“用户A邀请用户B加入群聊”,如何改成像微信那样显示为“用户A扫码用户B分享的群二维码加入了群聊”?

在微信和其他的一些主流社交软件中,会保留每个群成员的入群方式,包括邀请、分享名片、搜索等,会显示在入群提示和群成员用户详情。野火IM的demo中没有实现这个功能,但这个功能也可以二开实现,以二维码扫码入群为例,我们的推荐如下:

  1. 用户A分享二维码,在二维码的链接上加入分享着A的用户ID。
  2. 用户B扫码,得到群ID和分享者A的用户ID。
  3. 用户B调用加入群接口(可以是客户端的或者是server api的),有个参数是memberExtra,把加群方式和用户A用户ID放入到这个extra中。
  4. 加入群成功后,所有客户端同步到用户B(包括用户B)的群组成员信息,及收到用户B加入群的通知消息。群组成员信息和入群通知中都包含这个memberExtra。
  5. 展示通知消息时,就可以根据加入类型及用户A的ID显示为扫码了用户A分享的群名片入群。
  6. 展示群成员信息详情时,就可以显示这个群成员的入群方式。
  7. 对于创建群时直接包含的群成员,可以在创建群时也设置参数memberExtra。

我们部分平台已经实现了这个功能,在野火中memberExtra是个json,内容包括

{
  "s": {
    "t":join_type,
    "i":target_id
  }
}

json中s(source)为来源,包含一个t(type)和一个i(目标id)。其中type的取值为

ENUM WFCCGroupMemberSourceType {
    GroupMemberSource_Unknown = 0,
    GroupMemberSource_Search = 1,
    GroupMemberSource_Invite = 2,
    GroupMemberSource_QrCode = 3,
    GroupMemberSource_Card = 4,
};

比如用户B使用用户A分享的群二维码入群,那么用户B的群成员信息和入群消息中的extra为

{
  "s":{
    "t":3,
    "i":"userIdA"
  }
}
2018 © wildfirechat.net 京ICP备18060403号-1 all right reserved,powered by Gitbook该文件修订时间: 2024-11-15 02:48:21

results matching ""

    No results matching ""