如何使用网易云信实现匿名聊天

手机端的 APP 如果嵌入了 IM 模块,比如网易云信(环信),这些第三方的服务都有自己的账户系统,也是需要注册登录。

现在有这么一个需求:如何实现匿名聊天?同时要实现实名聊天。

需求可以简单理解为:相同的用户 A 和 B,需要有三个会话,一个是实名的聊天,一个是 A 匿名 B 实名的聊天,一个是 A 实名 B 匿名的聊天。

咋一看好像没什么难度,直接使用云信提供的 SDK 来做就可以吧,但是这里的一个问题是:

云信提供的移动端 SDK(Android 和 iOS)有自己的一套会话系统,这个会话系统里面,每两个人都只能有一个会话,怎么办?

开始的时候,和移动端工程师商量:

  1. 是否可以使用群聊来做?每个匿名聊天会话会创建一个群聊,然后在显示层面来隐藏匿名用户。后来发现这样做是有问题的,因为每个人可以创建的群聊个数是有限制的。
  2. 抛弃云信 SDK 的会话实现方法,重新实现会话,但这势必要修改移动端上面聊天会话的数据存储(sqlite),需要自己维护一套会话。这个方案我们只使用云信进行收发消息。

后来选择了方案2,虽然移动端花了比较多的时间,但是最终实现了自己的会话,并且完成了匿名聊天。

给大家一个思路,供大家参考。

前一个项目主要重构了 IM 模块,之前是自己写的 IM,通过轮询来做消息,效率很低,后来接入了网易云信,陆续写了几篇小文章,希望可以给需要接入网易云信的同学一些参考。

最近一段时间使用网易云信 IM 的总结
网易云信在阿里云服务器上无法发送大消息
如何使用网易云信实现匿名聊天

写文字大部分时候是因为我希望能帮助到你,小部分时候是想做总结或做记录。我的微信是 lijinma,希望和你交朋友。 以下是我的公众账号,会分享我的学习和成长。
lijinma
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 18
Summer

比较棘手的问题,实时通讯自己维护的话,后面也会有无数多的坑。

这个需求应该经常遇到,看了下几个 实时消息云 都不支持。

7年前 评论
Summer

金马,加你友链了,记得回加

7年前 评论
lijinma

@Summer 确实有很多坑,正在一个一个填坑。
将来还要做群聊中匿名聊天,还不知道要填多少坑。。。
我也是看了一遍实时消息云,没发现有匿名聊天的功能,只能自己做。

但长期来看,自己做数据确实可以灵活很多,长期来看还是值得的。

博客已经加 PHPhub 了友链了哦。:grinning:

7年前 评论

匿名聊天可以建立“临时”IM账户(昵称头像什么的都用系统指定的而不是用户自己的),用户退出的时候或退出一阵后再删除掉。

以上没代码,我只是想这个过程,不知道这样可行?

7年前 评论
lijinma

@隔壁老王 我们当时的情况是不行的,因为:

  • 第一,我们的所有会话是需要保存在服务端,所有聊天记录也要保存在服务端,所以退出删除不行。
  • 第二,这也是最重要的原因:所有的 实时消息云 都不允许同时登陆两个用户,你这个思路是同时登陆两个用户,一个是实名,一个是匿名。

:)

7年前 评论

@lijinma

第一个问题,完全可以解决的,用户发送消息的时候就保存到自己的数据库里就行,这个我之前有个项目就是这样做的,云信好像有API也可以解决,环信这块是收费的,所以当时自己解决的。
第二个问题,的确不行,甚至以前我用环信的时候都不能多终端同时登陆,不知道现在行不行。

7年前 评论
lijinma

@隔壁老王 恩恩,

第二个问题,云信的一个账号可以设置是否可以多终端登录,web,iOS,Android。

7年前 评论
hareluya

hmmmmmmm.......
我突然想到一个方法....
另开一套云信服务专门给匿名使用。。。

7年前 评论
lijinma

@hareluya - 。- 怎么做。。。。哈哈

7年前 评论

思路


A-B匿名聊天的实现思路

这个不是很简单的问题吗?你的实现并不是很好,感觉会误导人。我这里也提供一个思路,也不一定好。但是可以作为参考。

每个实体用户(指在自己系统的账户) 开通两个云信账户也就是一个user_id对应两个accid (一个实名用,一个匿名用)

例如:A->B聊天。就有2*2=4种组合。A1代表实名 A2代表匿名,同理B1代表实名 B2代表匿名。
四种组合即:A1B1 A1B2 A2B1 A2B2。以上四种即符合你的需求,也还可以使用云信的IM。

缺点:
1、要实现匿名的用户需要开通两个账户。浪费用户数的资源。
2、本来是实体用户对应云信用户是1对1的关系变成了1对多的关系。

7年前 评论
lijinma

@Will 恩,你说的这种方法思路是可行的,其实你和 @隔壁老王 的方案是一样的,创建两个用户。

但是你们这个方案最大的问题就是:

我们的 iOS 和 Android 端最终还是要使用云信提供的 SDK,因为你要使用它的用户系统,使用它的整个消息系统,我们试过了他的 SDK,不可以同时登陆两个用户,这是最大的难题,并不好解决。

7年前 评论

@lijinma
1、用户聊天信息的问题。因为一个用户对应两个accid。利用消息抄送 同步或者异步保存聊天记录。
2、多用户登录的问题。一个用户登录自己的账户系统。获取两个accid。发起聊天的时候建立accid与accid回话。
并没有矛盾

7年前 评论
lijinma

@Will
1,是没问题的,可以两个 accid 的消息抄送到一个人身上。
2,使用云信的移动端 SDK不可以,不知道你有什么方法吗?因为登陆一个云信账户后,你其实需要做很多事情,比如监听消息等。

所以云信的 SDK 并不可以同时登陆两个账户。

7年前 评论

@lijinma 高级群聊是有限制。但是讨论组(普通群聊)是否有限制?

7年前 评论
lijinma

@Will 你说的是聊天室吗?

7年前 评论
hareluya

@lijinma I mean use different vendor's API....

7年前 评论
lijinma

@hareluya 那你不就要引入两套 SDK,= 。= 要累死的。。

7年前 评论

@lijinma 发送信息是可以自定义消息的? 组个json带个消息类别?{type:anonymous} or {type:ordinary}?来区分同一个id两者不同的消息?

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!