群的一些细节问题
在野火IM系统中,群是有2种可用类型的。创建群的时候有个type参数,不同的参数可以选择不同的群类型
/**
群类型
- GroupType_Normal: 管理员和群主才能踢人,其它所有人的功能一样,包括拉人,修改群信息等。
- GroupType_Free: 所有人都能加人、退群和修改群信息
- GroupType_Restricted: 带有群管理功能
*/
typedef NS_ENUM(NSInteger, WFCCGroupType) {
GroupType_Normal = 0,
GroupType_Free = 1,
GroupType_Restricted = 2,
} ;
1. 1. GroupType_Normal
这种群更像微信的群类型,只有管理员和群主可以踢人。其它所有人的权限都是公平的,都可以拉人,可以修改群组名和头像。
2. 2. GroupType_Restricted
这种群是限制群,只有管理员和群主才可以做所有的操作。群成员可以根据群设置是否拉人,是否发起私聊。群成员不能修改群信息,不能修改群头像。damo中默认使用这种类型。
3. 群头像的问题
野火IM群头像默认是客户端创建群组时生成,且只生成一次,这样当群成员变更时,群的头像就会与实际不符合,需要进行处理,可以有一下几种方式:
手动更新,群类型为GroupType_Restricted,管理员和群主可以手动更新群头像。当群类型为GroupType_Normal时,所有人都可以更新群头像。
变更用户更新;当有人操作群成员时,由操作人重新生成头像并更新,这时需要注意,当群类型为GroupType_Restricted时,只有管理员和群主能更新。当群类型为GroupType_Normal时所有人才可以更新。
客户端自动生成;创建群组时不填写群头像,当客户端发现群头像为空时,自动在本地自动拼接群头像并显示。这种方式可能更接近微信的处理方式。
服务器端生成;客户端在变更群成员时通知应用服务,应用服务获取群成员信息并更新群头像,可以考虑重新定义群头像更新通知消息,改成不存储消息,这样客户端就不会显示更新了群头像,注意群头像更新通知的类型要保持,因为协议栈要根据这个消息来更新群信息。
4. 群公告
群公告功能是在应用服务实现的,实现方法很简单,客户端编辑后调用appserver保存,保存成功后发送@全体的消息,每次进入到群设置界面时从appserver拉取群公告信息,然后展示。群公告谁可以发和编辑的权限是客户端判断的,如果需要进一步加强权限判断,可以在应用服务收到更新群公告信息时判断是不是群管理员。
5. 通知消息的自定义
客户端和Server API对群的所有操作接口都有个可选参数notify_message,当为空时IM服务处理成功后发送系统默认通知消息,如果客户需要自定义通知的内容,可以发送这个可选参数,当IM服务器处理成功后会发送接口带来的消息内容。需要注意,协议会根据消息类型来刷新群的信息,所以如果需要修改通知消息内容,请扩展现有通知消息的字段,不能修改原有的消息类型和格式,否则会有严重问题。另外消息都有个Persist的属性,可以修改 这个属性来改变通知是否显示和存储。
6. 群的常见问题
6.1. 1. 群人数有上限吗?
A. 在数据库t_settings
表中id为1的配置是群的大小配置。但在社区版和专业版的意义是不同的,在社区版,这个配置是全局的,是所有群的最大成员数,如果修改全局都受影响;在专业版这个是群创建时的初始值,如果修改数据库的值,不会影响已经创建的群,只会影响以后创建的群,群创建之后可以通过API修改单个群的群成员上限大小。修改数据库会实时生效,服务器没有缓存此值。
群的大小对于服务器的压力是指数级的,一般情况下建议不要超过1000。如果万人群则需要有一定的发言控制,比如限制用户发言权限仅用于通知等。
6.2. 2. 用户有加群数或者创建群数上限吗?
A. 没有,用户可以创建或者加入无限多的群。
6.3. 3. 如何禁言群组
A. 如果要禁言/取消禁言整个群,可以修改群信息,群信息有个mute属性,改成"1"就是禁言,"0"是取消禁言。专业版IM服务支持单个群成员的禁言,也有对应的接口。