如何在App中实现IM功能
之六
快速实现群聊的高级功能
本文通过利用anSocial的Circle API实现群聊的高级功能(如群组身份、群成员匿名发言等)。
实现方式:
将Circle与anIM的Topic结合:当我们创建群组得到topicId以后,我们同时往Arrownock的服务器创建一个Circle来保存该群组属性。
Map<String, Object> params = new HashMap<String, Object>();
params.put("name", topicName);
params.put("user_id", topicOwner);// 群主的AnSocialuser_id
params.put("user_ids", user_ids);// 所有群成员的AnSocialuser_id,用","分割
Map<String, String> customFields = new HashMap<String, String>();
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<String, Object> params = new HashMap<String, Object>();
// 创建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的官方文档网站上查询:http://docs.arrownock.com/
群组等级功能的实现方式:
创建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<String, Object> params = new HashMap<String, Object>();
params.put("user_id", user_id);//群主
params.put("user_ids", user_ids);//群成员,以","分割
Map<String, String> customFields = new HashMap<String, String>();
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额外提供了父子结构供大家使用,详情可以参考
http://docs.arrownock.com/docs/ansocial/circle/create
如何在App中实现IM功能系列文章:
之六快速实现群聊的高级功能