如何在App中实现IM功能

之六

快速实现群聊的高级功能

 本文通过利用anSocial的Circle API实现群聊的高级功能(如群组身份、群成员匿名发言等)。

 

实现方式:

将Circle与anIM的Topic结合:当我们创建群组得到topicId以后,我们同时往Arrownock的服务器创建一个Circle来保存该群组属性。

    Map
 params = 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添加群成员    Map
 params = 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的参数    Map
 params = 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功能系列文章:

之一离线消息常见浅析

之二快速实现离线消息模块

之三快速实现离线消息推送模块

之四创建稳健的消息发送模块

之五快速实现图片接收和发送

之六快速实现群聊的高级功能

之七快速实现聊天列表排序模块