在我们日常应用开发中,很多时候产品需要IM聊天功能。考虑到时间、难度等问题一般会选择集成一些比较稳定的第三方SDK来实现功能。最近的项目也有IM需求,因为之前用过环信,感觉还不错,所以就再次使用了环信SDK。
环信以及其他第三方SDK有个问题就是环信服务器本身不会保存用户的昵称及头像,但实际项目中又需要显示。
关于这个问题在环信官方的常见问题中也提供了如下两种解决方案以及利弊分析,如图:


之前的项目中使用的第一种方式,这种方式还需要服务器配合专门提供查询用户信息的API。相比较下来第二种方式 实现起来更方便,不需要服务器配合,只需要在发出的消息扩展字段中增加昵称和头像属性即可
官网只提供了两种方案的思路及利弊分析,但没有提供具体的实现代码,对于第一次使用环信SDK的朋友来说 改起来可能还是需要花点时间的。这篇文章会提供给大家第二种方案的具体实现方法,以便大家使用在项目中,快速高效的解决问题。
在开始讲具体的实现方式前,我们还需要分析一下,都需要在哪里显示头像和昵称
对于一般的应用来说,一般有两个地方:
- 聊天会话列表页
- 聊天页
我们先解决最容易的聊天页昵称和头像显示问题,我们以使用环信提供的EaseUI为例。
1.在EaseChatFragment文件中找到发送消息的sendMessage()方法,然后在所要发送的消息扩展中加入用户昵称及头像两个字段

2.在EaseChatRow文件中找到显示头像及昵称的代码,并修改为从消息扩展中获取

这样在聊天页里面就可以只要收到包含扩展字段的信息就能显示昵称及头像了
接下来我们还要解决聊天会话列表页显示的问题
解决方式差不多,都是先获取到用户的昵称及头像,再显示出来就行了。但是获取方式和之前有所不同,不能再使用从消息扩展中获取了。原因很简单,如果是我们先发起的聊天而不是对方的话,这时候我们根本没有收到对方发来的含有扩展字段的消息。
那应该怎么获取呢?其实也不难,大家考虑一下我们真正使用的场景:一般来说和一个用户聊天我们肯定会先进入该用户的个人页面,然后点击私信、聊天类似的按钮才能开启聊天,对不对?
那我们完全可以在用户点击“聊天、私信”按钮时,将个人页面的用户昵称及头像保存到数据库,当用户进入聊天会话列表页时,直接从数据库查出来显示就可以了
下面的图片以我司项目举例,大家可以用到自己的项目中修改对应的地方就可以了。


这里还有个小提示,会话列表页显示时可以优先使用官方API getLatestMessageFromOther()这个方法,判断对方是否发送过信息,如果是,就从消息扩展中获取,反之,则从数据库获取即可
以上Android 环信显示头像及昵称的简单方法,iOS的实现方式相同。希望这篇文章可以帮助大家解决项目中的时间问题。有不对的地方,请不吝赐教,谢谢!
网友评论