如何使用网易云信实现匿名聊天
手机端的 APP 如果嵌入了 IM 模块,比如网易云信(环信),这些第三方的服务都有自己的账户系统,也是需要注册登录。
现在有这么一个需求:如何实现匿名聊天?同时要实现实名聊天。
需求可以简单理解为:相同的用户 A 和 B,需要有三个会话,一个是实名的聊天,一个是 A 匿名 B 实名的聊天,一个是 A 实名 B 匿名的聊天。
咋一看好像没什么难度,直接使用云信提供的 SDK 来做就可以吧,但是这里的一个问题是:
云信提供的移动端 SDK(Android 和 iOS)有自己的一套会话系统,这个会话系统里面,每两个人都只能有一个会话,怎么办?
开始的时候,和移动端工程师商量:
- 是否可以使用群聊来做?每个匿名聊天会话会创建一个群聊,然后在显示层面来隐藏匿名用户。后来发现这样做是有问题的,因为每个人可以创建的群聊个数是有限制的。
- 抛弃云信 SDK 的会话实现方法,重新实现会话,但这势必要修改移动端上面聊天会话的数据存储(sqlite),需要自己维护一套会话。这个方案我们只使用云信进行收发消息。
后来选择了方案2,虽然移动端花了比较多的时间,但是最终实现了自己的会话,并且完成了匿名聊天。
给大家一个思路,供大家参考。
前一个项目主要重构了 IM 模块,之前是自己写的 IM,通过轮询来做消息,效率很低,后来接入了网易云信,陆续写了几篇小文章,希望可以给需要接入网易云信的同学一些参考。
关于 LearnKu
比较棘手的问题,实时通讯自己维护的话,后面也会有无数多的坑。
这个需求应该经常遇到,看了下几个
实时消息云都不支持。金马,加你友链了,记得回加
@Summer 确实有很多坑,正在一个一个填坑。
将来还要做群聊中匿名聊天,还不知道要填多少坑。。。
我也是看了一遍
实时消息云,没发现有匿名聊天的功能,只能自己做。但长期来看,自己做数据确实可以灵活很多,长期来看还是值得的。
博客已经加 PHPhub 了友链了哦。:grinning:
匿名聊天可以建立“临时”IM账户(昵称头像什么的都用系统指定的而不是用户自己的),用户退出的时候或退出一阵后再删除掉。
以上没代码,我只是想这个过程,不知道这样可行?
@隔壁老王 我们当时的情况是不行的,因为:
实时消息云都不允许同时登陆两个用户,你这个思路是同时登陆两个用户,一个是实名,一个是匿名。:)
@lijinma
第一个问题,完全可以解决的,用户发送消息的时候就保存到自己的数据库里就行,这个我之前有个项目就是这样做的,云信好像有API也可以解决,环信这块是收费的,所以当时自己解决的。
第二个问题,的确不行,甚至以前我用环信的时候都不能多终端同时登陆,不知道现在行不行。
@隔壁老王 恩恩,
第二个问题,云信的一个账号可以设置是否可以多终端登录,web,iOS,Android。
hmmmmmmm.......
我突然想到一个方法....
另开一套云信服务专门给匿名使用。。。
@hareluya - 。- 怎么做。。。。哈哈
思路
A-B匿名聊天的实现思路
这个不是很简单的问题吗?你的实现并不是很好,感觉会误导人。我这里也提供一个思路,也不一定好。但是可以作为参考。
每个实体用户(指在自己系统的账户) 开通两个云信账户也就是一个user_id对应两个accid (一个实名用,一个匿名用)
例如:A->B聊天。就有2*2=4种组合。A1代表实名 A2代表匿名,同理B1代表实名 B2代表匿名。
四种组合即:A1B1 A1B2 A2B1 A2B2。以上四种即符合你的需求,也还可以使用云信的IM。
缺点:
1、要实现匿名的用户需要开通两个账户。浪费用户数的资源。
2、本来是实体用户对应云信用户是1对1的关系变成了1对多的关系。
@Will 恩,你说的这种方法思路是可行的,其实你和 @隔壁老王 的方案是一样的,创建两个用户。
但是你们这个方案最大的问题就是:
我们的 iOS 和 Android 端最终还是要使用
云信提供的 SDK,因为你要使用它的用户系统,使用它的整个消息系统,我们试过了他的 SDK,不可以同时登陆两个用户,这是最大的难题,并不好解决。@lijinma
1、用户聊天信息的问题。因为一个用户对应两个accid。利用消息抄送 同步或者异步保存聊天记录。
2、多用户登录的问题。一个用户登录自己的账户系统。获取两个accid。发起聊天的时候建立accid与accid回话。
并没有矛盾
@Will
1,是没问题的,可以两个 accid 的消息抄送到一个人身上。
2,使用云信的移动端 SDK不可以,不知道你有什么方法吗?因为登陆一个云信账户后,你其实需要做很多事情,比如监听消息等。
所以云信的 SDK 并不可以同时登陆两个账户。
@lijinma 高级群聊是有限制。但是讨论组(普通群聊)是否有限制?
@Will 你说的是聊天室吗?
@lijinma I mean use different vendor's API....
@hareluya 那你不就要引入两套 SDK,= 。= 要累死的。。
@lijinma 发送信息是可以自定义消息的? 组个json带个消息类别?{type:anonymous} or {type:ordinary}?来区分同一个id两者不同的消息?