如何在App中实现IM功能
之六
快速实现群聊的高级功能
本文通过利用anSocial的Circle API实现群聊的高级功能(如群组身份、群成员匿名发言等)。
实现方式:
将Circle与anIM的Topic结合:当我们创建群组得到topicId以后,我们同时往Arrownock的服务器创建一个Circle来保存该群组属性。
Mapparams = new HashMap (); params.put("name", topicName); params.put("user_id", topicOwner);// 群主的AnSocialuser_id params.put("user_ids", user_ids);// 所有群成员的AnSocialuser_id,用","分割 Map customFields = new HashMap (); customFields.put("topicId", topicId);// AnIM创建群组得到的topicId params.put("custom_fields", customFields); anSocial.sendRequest("circles/create.json",AnSocialMethod.POST, params, new IAnSocialCallback() { @Override public void onSuccess(JSONObject response) { // TODO onSuccess String circleId=response.getJSONObject("response") .getJSONObject("circle").getString("id"); } @Override public void onFailure(JSONObject response) { // TODO onFailure } });
对于anIM的其他api,Circle也有相应的接口来实现,比如添加成员方法:
//Circle添加群成员 Mapparams = new HashMap (); // 创建Circle时得到的circleId params.put("circle_id", circleId); // 新成员的AnSocialuser_id,多个user用","分割 params.put("add_user_ids", user_ids); anSocial.sendRequest("circles/update.json", AnSocialMethod.POST, params, new IAnSocialCallback() { @Override public void onSuccess(JSONObject response) { // TODO onSuccess } @Override public void onFailure(JSONObject response) { // TODO onFailure } });
其他API不一一举例,大家可以上Arrownock的官方文档网站上查询:
群组等级功能的实现方式:
创建Circle的customFields中添加一个等级的属性:customFields.put("topicLevel", 1);这个属性的修改调用circles/update.json API即可,根据多种情况,如群主主动升级,群成员扩充到一定数量时自动升级等等。
群成员匿名发言的实现方式:
我们在这里分两种情况实现:
1.群组本身就是匿名发言群
如同实现群组等级一样,在customFields中添加一个是否为匿名的标识位即可:customFields.put("isHideName", 1);群成员发言后,接收用户根据Circle的该标识位判断是显示用户的名称,还是显示匿名。
2.由用户选择是否匿名
首先我们需要在anSocial的User customFields中保存一个属性用来表示该用户哪些群组是匿名发言:customFields.put("hideNameCircleIds", circleIds);//表示哪些群组是匿名发言群成员发言时,首先判断用户当前发言的群组是否在需要匿名发言群组里,如果是,那么需要调用sendMessageToTopic(topicId,message, customData);方法,将当前用户匿名的标识位放入customData属性中,接收消息的用户根据该标识位,界面上不再显示发言用户的名称,而是用匿名代替。
在社交App的使用中,群组聊天是社交功能里一个常用的场景。而群组我们又会把它分为两种形式:
1.讨论组形式(只能实现基本聊天功能)。
2.进阶群组形式(可以实现匿名、身份等功能)。
本文我们将为大家带来如何利用anSocial的circle实现完整的群聊功能。
讨论组形式定义:
实现多人聊天场景,无其他特殊功能(如:群成员昵称、群主、匿名等)。
具体实现方式:
anIM实现群组聊天
//创建群组,传入群组名称和群组成员clientId anIM.createTopic("topicName", clientIds); //添加删除成员 anIM.addClientsToTopic(topicId, clientIds); anIM.removeClientsFromTopic(topicId, clientIds); //移除群组 anIM.removeTopic(topicId);
进阶群组形式定义:
可实现匿名、群组成员身份、更改群名称、添加或删除群组成员的进阶群聊场景。
具体实现方式:
利用createCircle,将多个用户组合到一起组成一个circle,对于特殊的群组属性,可以放到circle的customFields中,示例如下:
//组装createCircle的参数 Mapparams = new HashMap (); params.put("user_id", user_id);//群主 params.put("user_ids", user_ids);//群成员,以","分割 Map customFields = new HashMap (); customFields.put("topicId", topicId);//将anIM创建topic返回的topicId传入 customFields.put("specialField1", specialField1); customFields.put("specialField2", specialField2); params.put("custom_fields", customFields);//群组的特殊属性 //创建circle anSocial.sendRequest("circles/create.json", AnSocialMethod.POST, params, new IAnSocialCallback() { @Override public void onSuccess(JSONObject response) { } @Override public void onFailure(JSONObject response) { } });
对于添加成员,删除成员可以调用updateCircle来进行修改,对于删除群组可以用deleteCircle
提示:
circle额外提供了父子结构供大家使用,详情可以参考
如何在App中实现IM功能系列文章:
之一离线消息常见浅析
之二快速实现离线消息模块
之三快速实现离线消息推送模块
之四创建稳健的消息发送模块
之五快速实现图片接收和发送
之六快速实现群聊的高级功能
之七快速实现聊天列表排序模块