名称:上海璟梦信息科技有限公司IM SDK 集成文档
版本:V1.0.0
日期:2021-12-24
ps:需要申请对应设备权限
用户需要在开发者账号开通推送服务,以及上传对应的推送证书.p12
///SDK初始化
- (void)initWithAppId:(NSString *)appId appSecret:(NSString *)appSecret
/// 登录
/// @param userId 用户Id
/// @param completion completion 完成回调
- (void)loginIMWithUserId:(NSString *)userId
completion:(void (^)(CLImUserInfo * _Nullable userInfo, CLImError * _Nullable error))completion
/// 退出登录
/// @param completion 完成回调
- (void)logoutWithCompletion:(void (^)(CLImError * _Nullable error))completion;
/// 修改用户信息
/// @param userInfo 用户信息
/// @param completion 完成回调
- (void)modifyUserInfo:(CLImUserInfo *)userInfo
completion:(void(^)(CLImError *_Nullable error))completion;
/// 获取用户信息
/// @param userId 用户id
/// @param complete 完成回调
- (void)getUserInfoById:(NSString *)userId
completion:(void(^)(CLImUserInfo *_Nullable info, CLImError *_Nullable error))complete
/// 添加好友
/// @param contacts 对方用户部分信息
/// @param message 加好友的附带消息
/// @param custom 客户自定义值
/// @param completion 回调
- (void)addContacts:(CLImContact *)contacts
message:(NSString *_Nullable)message
custom:(NSString *_Nullable)custom
completion:(void(^)(CLImError *_Nullable error))completion;
/// 是否同意添加好友
/// @param reqModel 添加好友请求model
/// @param pass 是否通过
/// @param message 附带消息
/// @param completion 回调
- (void)passFriendReq:(CLImFriendReqModel *)reqModel
pass:(BOOL)pass
message:(NSString *)message
completion:(void(^)(CLImError *_Nullable error))completion;
/// 删除好友
/// @param contacts 好友信息model
/// @param completion 回调
- (void)deleteContacts:(CLImContact *)contacts
completion:(void(^)(CLImError *_Nullable error))completion;
/// 获取好友列表
/// @param page 起始页
/// @param pageSize 每页数据条数
/// @param completion 回调
- (void)getContactsListWithPage:(int32_t)page
pageSize:(int32_t)pageSize
completion:(void(^)(NSArray <CLImContact *>*_Nullable list, CLImError *_Nullable error))completion;
/// 获取黑名单列表
/// @param page 页数
/// @param pageSize 页大小
/// @param completion 回调
- (void)getBlackFriendListWithPage:(int32_t)page
pageSize:(int32_t)pageSize
completion:(void(^)(NSArray <CLImContact *>*_Nullable list, CLImError *_Nullable error))completion;
/// 拉黑好友
/// @param userId 好友ID
/// @param nickName 好友昵称
/// @param completion 回调
- (void)setBlackFriendWithUserId:(NSString *)userId
nickName:(NSString *)nickName
completion:(void(^)(CLImError *_Nullable error))completion;
/// 移出黑名单列表
/// @param userId 好友ID
/// @param nickName 好友昵称
/// @param completion 回调
- (void)removeBlackFriendWithUserId:(NSString *)userId
nickName:(NSString *)nickName
completion:(void(^)(CLImError *_Nullable error))completion;
/// 置顶(好友会话是否置顶)
/// @param friendId 好友ID
/// @param isTop 是否置顶 0不1是
/// @param completion 回调
- (void)modifyFriendTopWithId:(NSString *)friendId
top:(BOOL)isTop
completion:(void (^)(CLImError * _Nullable error))completion;
/// 设置好友备注
/// @param userId 好友ID
/// @param markname 备注
/// @param completion 回调
- (void)setFriendMarkWithUserId:(NSString *)userId
markname:(NSString *)markname
completion:(void(^)(CLImError *_Nullable error))completion;
/// 设置好友备注
/// @param userId 好友ID
/// @param markname 备注
/// @param completion 回调
- (void)setFriendMarkWithUserId:(NSString *)userId
markname:(NSString *)markname
completion:(void(^)(CLImError *_Nullable error))completion;
/// 取消呼叫
/// @param otherUserId 被取消的用户
/// @param messageId 消息Id
/// @param completion 回调
- (void)cancelCallingWithUserId:(NSString *)otherUserId
messageId:(NSString *)messageId
completion:(void (^)(CLImError * _Nullable))completion;
/// 接受或者拒绝接听
/// @param otherUserId 被……的用户
/// @param passType 接受或者拒绝 YES:接受 NO:拒绝
/// @param messageId 消息Id
/// @param completion 回调
- (void)receiveCallingWithUserId:(NSString *)otherUserId
passType:(BOOL)passType
messageId:(NSString *)messageId
completion:(void (^)(CLImError * _Nullable))completion;
typedef NS_ENUM(NSInteger, CLImMessageDirection) {
CLImMessageDirectionSend = 0, /*! \~chinese 发送的消息 \~english Send */
CLImMessageDirectionReceive, /*! \~chinese 接收的消息 \~english Receive */
};
typedef NS_ENUM(NSInteger,CLImMessageType){
CLImMessageTypeChat = 1, //单聊
CLImMessageTypeGroup, //群聊
};
#import "CLImMessageBody.h"
#import "CLImMessageTextBody.h" //文本消息
#import "CLImMessageImageBody.h" //图片消息
#import "CLImMessageFileBody.h" //文件本消息
#import "CLImMessageVoiceBody.h" //语音消息
#import "CLImMessageVideoBody.h" //视频消息
#import "CLImMessageLocationBody.h" //定位消息
#import "CLImMessageCallingBody.h" //呼叫消息
#import "CLImMessageCmdBody.h" //系统消息
#import "CLImMessageCustomBody.h" //自定义消息
**CLImMessage **属性messageStatus进行设置
/**1已发送, 2已接收, 3已读*/
@property (nonatomic,assign) NSInteger messageStatus;
/// 发送消息回执
/// @param message 消息体
/// @param status 1已发送(后台返回状态),2已接收,3已阅读
/// @param completion 回调
- (void)sendMessageAck:(NSArray <CLImMessage *>*)message
status:(int32_t)status
completion:(void(^)(CLImError *_Nullable error))completion;
/// 发送消息 (成功标志,消息体有messageID,error为nil)
/// @param message 消息体
/// @param completion 完成回调
- (void)sendMessage:(CLImMessage *)message
completion:(void (^)(CLImMessage * _Nullable, CLImError * _Nullable))completion;
@property(nonatomic, weak, readonly) id chatManager;
// 添加代理:
[[CLImClient shared].chatManager addDelegate:self];
- (void)messageDidReceived:(nonnull CLImMessage *)message {
//处理对应的消息
//添加到当前的消息数据源数组
///刷新数据列表
}
/// 获取历史消息
/// @param conversationId 会话ID
/// @param messageType 聊天类型
/// @param msgId 拉取消息的起始id,为空则从最新值开始
/// @param pageSize 页大小
/// @param completion 回调
- (void)getHistoryMessagesWithConversationId:(NSString * _Nonnull)conversationId
messageType:(CLImMessageType)messageType
fromMsgID:(NSString *)msgId
pageSize:(int32_t)pageSize
completion:(void(^)(NSArray <CLImMessage *>*_Nullable messageList, CLImError *_Nullable error))completion;
/// 获取历史未读消息
/// @param pageSize 页大小,最大值100
/// @param completion 回调
- (void)getMessageListWithPageSize:(int32_t)pageSize
completion:(void (^)(NSArray<CLImMessage *> * _Nullable list, CLImError * _Nullable error))completion;
/// 获取未读消息数
/// @param completion 回调
- (void)getUnReadMessageCountWithCompletion:(void (^)(int32_t count, CLImError * _Nullable error))completion;
获取群对象 [CLImClient shared].groupManager,并遵守代理
@protocol CLImGroupManager <NSObject>
- (void)addDelegate:(id<CLImGroupManagerDelegate>)aDelegate;
- (void)removeDelegate:(id<CLImGroupManagerDelegate>)aDelegate;
/// 创建群组(创建群聊时拉人进群默认是不需要对方同意直接进群)
/// @param options 创建信息
/// @param completion 完成回调,若groupid和error同时存在则创建群成功而邀请好友加群失败
- (void)createGroup:(CLImGroupOptions *)options
completion:(void(^)(NSString *_Nullable groupId, CLImError *_Nullable error))completion;
/// 解散群组(群主权限)
/// @param groupId 群组ID
/// @param completion 回调
- (void)disbandGroupWithGroupId:(NSString *)groupId
completion:(void(^)(CLImError *_Nullable error))completion;
/// 修改群组名称
/// @param groupId 群组id
/// @param groupName 新群组名称(最长不超过16个字)
/// @param completion 完成回调
- (void)modifyGroupId:(NSString *)groupId
groupName:(NSString *)groupName
completion:(void(^)(CLImError *_Nullable error))completion;
/// 修改群通知
/// @param groupId 群id
/// @param groupNotice 新群通知
/// @param completion 完成回调
- (void)modifyGroupId:(NSString *)groupId
groupNotice:(NSString *)groupNotice
completion:(void(^)(CLImError *_Nullable error))completion;
/// 修改群介绍
/// @param groupId 群组id
/// @param groupIntro 群介绍
/// @param completion 回调
- (void)modifyGroupId:(NSString *)groupId
groupIntro:(NSString *)groupIntro
completion:(void(^)(CLImError *_Nullable error))completion;
/// 获取群详情
/// @param groupId 群ID
/// @param completion 回调
- (void)queryGroupInfoWithGroupId:(NSString *)groupId
completion:(void(^)(CLImGroupInfo *_Nullable info, CLImError *_Nullable error))completion;
操作对象: [CLImClient shared].groupManager
/// 群文件上传(群文件消息附带的文件不会默认放到群文件列表里,如需要请单独调用此接口)
/// @param groupId 群id
/// @param fileName 文件名字
/// @param fileUrl 文件链接地址
/// @param fileSize 文件大小
/// @param completion 回调,成功则fileId有值
- (void)uploadGroupFileWithGroupId:(NSString *)groupId
fileName:(NSString *)fileName
fileUrl:(NSString *)fileUrl
fileSize:(int64_t)fileSize
completion:(void(^)(NSString *_Nullable fileId, CLImError *_Nullable error))completion;
/// 删除群文件
/// @param groupId 群Id
/// @param fileId 文件Id
/// @param completion 回调
- (void)deleteGroupFileWithGroupId:(NSString *)groupId
fileId:(NSString *)fileId
completion:(void(^)(CLImError *_Nullable error))completion;
/// 获取文件列表
/// @param groupId 群ID
/// @param page 起始页
/// @param pageSize 每页条数
/// @param completion 回调
- (void)getGroupFileWithGroupId:(NSString *)groupId
page:(int32_t)page
pageSize:(int32_t)pageSize
completion:(void (^)(NSArray <CLImFileInfo *>*_Nullable fileList, CLImError * _Nullable))completion;
/// 修改群内显示名称
/// @param groupId 群ID
/// @param markName 昵称
/// @param completion 回调
- (void)modifyGroupId:(NSString *)groupId
markName:(NSString *)markName
completion:(void (^)(CLImError *_Nullable error))completion;
/// 申请加入群聊
/// @param groupId 群组id
/// @param userId 申请用户Id
/// @param completion 回调
- (void)applyToJoinGroupWithGroupId:(NSString *)groupId
userId:(NSString *)userId
completion:(void(^)(CLImError *_Nullable error))completion;
/// 退出群组
/// @param groupId 群组id
/// @param completion 完成回调
- (void)leaveGroup:(NSString *)groupId
completion:(void(^)(CLImError *_Nullable error))completion;
/// 邀请用户加入群组
/// @param groupId 群组id
/// @param groupName 群组名称
/// @param users 用户id列表
/// @param message 附加消息
/// @param needAgree 是否需要被邀请者同意(NO, 不需要, YES,需要)
/// @param completion 完成回调
- (void)inviteUsersToGroup:(NSString *)groupId
groupName:(NSString *)groupName
users:(NSArray *)users
message:(NSString *)message
agree:(BOOL)needAgree
completion:(void(^)(CLImError *_Nullable error))completion;
/// 被邀请用户加入群组回应
/// @param groupId 群组ID
/// @param groupName 群组名称
/// @param userId 邀请者用户ID
/// @param nickName 邀请者昵称
/// @param messageId 邀请加群消息ID
/// @param ackType 是否同意 0拒绝 1同意
/// @param completion 回调
- (void)inviteAckGroupID:(NSString *)groupId
groupName:(NSString *)groupName
inviteUserId:(NSString *)userId
inviteNickName:(NSString *)nickName
messageId:(NSString *)messageId
ackType:(BOOL)ackType
completion:(void(^)(CLImError *_Nullable error))completion;
/// 移除群成员
/// @param groupId 群组Id
/// @param removeUserId 被移除的群成员Id
/// @param completion 回调
- (void)removeGroupUserWithGroupId:(NSString *)groupId
userId:(NSString *)removeUserId
completion:(void(^)(CLImError *_Nullable error))completion;
/// 禁言部分群普通成员 (1、群主不能禁言自己 2、管理员不能禁言群主、自己、其余管理员 3、普通人员无禁言权限)
/// @param groupId 群组ID
/// @param users 被禁言的群成员userID
/// @param isMute 是否禁言
/// @param completion 回调
- (void)muteGroupUsersWithGroupId:(NSString *)groupId
users:(NSArray<NSString *> *)users
mute:(BOOL)isMute
completion:(void (^)(CLImError * _Nullable error))completion;
/// 群禁言(群主一键全禁)
/// @param groupId 群组ID
/// @param isMute 是否开启禁言
/// @param completion 回调
- (void)muteGroupWithGroupId:(NSString *)groupId
mute:(BOOL)isMute
completion:(void (^)(CLImError * _Nullable error))completion;
/// 获取群成员列表
/// @param groupId 群ID
/// @param role 角色 :0:所有成员,1:owner 群主, 2:member普通群成员, 3:admin 群管理员
/// @param page 起始页
/// @param pageSize 每页数据数
/// @param completion 回调
- (void)getGroupMembersListWithGroupId:(NSString *)groupId
role:(int32_t)role
page:(int32_t)page
pageSize:(int32_t)pageSize
completion:(void(^)(NSArray <CLImGroupMemberContact *>*_Nullable userList, CLImError *_Nullable error))completion;
/// 获取群列表
/// @param page 起始页
/// @param pageSize 每页数据数
/// @param completion 回调
- (void)getGroupListWithPage:(int32_t)page
pageSize:(int32_t)pageSize
completion:(void(^)(NSArray <CLImGroupInfo *>*_Nullable groupList, CLImError *_Nullable error))completion;
/// 设置群消息免打扰
/// @param groupId 群ID
/// @param disturb 是否开启免打扰:0不开启,1开启
/// @param completion 回调
- (void)setGroupDisturbWithGroupId:(NSString *)groupId
disturb:(BOOL)disturb
completion:(void(^)(CLImError *_Nullable error))completion;
/// 群置顶(会话置顶,更新到群列表属性中,然后更新到会话属性上)
/// @param groupId 群ID
/// @param isTop 是否置顶
/// @param completion 回调
- (void)modifyGroupId:(NSString *)groupId
top:(BOOL)isTop
completion:(void (^)(CLImError * _Nullable error))completion;
/// 获取具体成员信息
/// @param groupId 群ID
/// @param userId 查找对象的userID
/// @param completion 回调
- (void)getGroupMemberInfoWithGroupId:(NSString *)groupId
userId:(NSString *)userId
completion:(void(^)(CLImGroupMemberContact *_Nullable info, CLImError *_Nullable error))completion;
/// 获取自己发送的群消息状态
/// @param groupId 群组ID
/// @param messageId 消息ID
/// @param completion 回调,已读成员的key是read,未读的是unRead
- (void)acquireGroupMessageStatusListWithGroupId:(NSString *)groupId
messageId:(NSString *)messageId
completion:(void(^)(NSDictionary <NSString *, CLImGroupMemberContact *>*_Nullable data, CLImError *_Nullable error))completion;
/// 获取系统未读消息(好友请求、群邀请请求)
/// @param msgID 拉取消息的起始id,为空则从最新值开始
/// @param pageSize 页大小,最大100
/// @param completion 回调,返回CLImFriendReqModel好友请求、CLImGroupInvitationModel群邀请类型
- (void)getUnReadSystemMessageListWithFromMsgID:(NSString * _Nullable)msgID
pageSize:(int32_t)pageSize
completion:(void (^)(NSArray * _Nullable list, CLImError * _Nullable error))completion;
群组中,@某人的和群组普通消息没有区别,只是针对被@的用户在 UI 上显示会有不同。具体实现可以在消息扩展字段ext中添加**@标识 **, 如下 :
// @某些人
message.ext = @{@"em_at_list":@[@"userl001",@"user002"]};
#import "CLToolMacro.h"
#import "CLVoiceRtvManage.h"
#import "CLVoiceRtvAudioTools.h"
/**
初始化
@param appId appId和IM appId一致,appToken是IM使用的token
@param environment kServerEnvironment枚举
*/
- (void)initWithAppId:(NSString *)appId appToken:(NSString *)appToken environment:(kServerEnvironment)environment
/**
添加代理
*/
[[CLVoiceRtvManage sharedInstance] addDelegate:self];
示例
//IM初始化成功后,才能获取
NSString * appId = [CLImClient shared].appId;
NSString * appToken = [CLImClient shared].appToken;
[[CLVoiceRtvManage sharedInstance] initWithAppId:appId appToken:appToken environment:kServerEnvironment_Release];
**@property **** ** (nonatomic, weak, readonly) id callingManager
ps:当前字符串主要用户用户生成房间Id和房间密钥,用户也可以自己生成,确保房间id唯一即可。
/// 生成随机串(字母加数字,如 T76g)
/// @param len 随机串长度
- (NSString *)randomString: (int)len;
/// 生成随机串(数字,如 23234)
/// @param length 随机串长度
- (NSString *)randomNumber:(int)length
/**
登录房间
@param userId 用户Id(透传客户方自己的用户编号)
@param roomSecret 房间密钥
@param roomId 房间Id(相同appId,相同roomId的用户会分配到同一个房间)
*/
- (void)loginRoomWithUserId:(NSString *)userId roomId:(NSString *)roomId roomSecret:(NSString *)roomSecret;
注意:登录房间,当前如果该房间roomId不存在时,调用该方法会自动创建一个房间;如果存在,会加入该房间。
通过构建呼叫消息,发送给被呼叫方
CLIMMessageCallingBody * body = [[CLIMMessageCallingBody alloc] init];
body.type = CLImMessageBodyTypeVoiceCall;
body.roomId = roomId;
body.roomSecret = secret;
body.content = @"语音呼叫";
body.targetAppUserId = targetUserIds;
CLImMessage * m = 生成CLImMessage对象
m.from = [CLImClient shared].userId;
//发送呼叫消息
[[CLImClient shared].callingManager startCallingWithMessage:m completion:^(CLImMessage * _Nonnull mess, CLImError * _Nullable error) {
NSLog(@"呼叫发送%@",error.code==0?@"成功":@"失败");
}];
接收到呼叫消息之后,获取到roomId 和 roomSecrect 加入房间
[[CLVoiceRtvManage sharedInstance] loginRoomWithUserId:self.userId roomId:self.roomId roomSecret:self.roomSecret];
/**
上/下麦
@param micType YES:上麦 NO:下麦
@param timeLimit 限时上麦时间(单位:秒),0不限制
*/
[[CLVoiceRtvManage sharedInstance] chatMicWithMicType:YES timeLimit:0];
- (void)setAudioRouteToSpeaker;
- (void)setAudioRouteToNone;
/**
注销,用于切换房间 注:切换房间要先调用此方法退出当前房间,再登录其他房间
*/
- (void)logout;
示例代码:
- (void)audioLoginVideoRoom{
//1.初始化CLVoiceRtvManage
CLVoiceRtvManage * rtv = [CLVoiceRtvManage sharedInstance];
///是否开启推流
rtv.isOpenPushing = YES;
///摄像头是否开启
rtv.cameraStatus = 1;
///摄影头方向
rtv.cameraPosition = GtVoiceVLCameraPositionType_Front;
//获取加入视频房间的用户id数组,如 @[@"user001",@"user002"]
NSArray * userIds = self.targetUserIds;
//3.用户Id和视图关联
NSMutableArray <GtVoiceVedioInfoModel *>*infoAry = [self createVideoRoomView:userIds];
//4.根据用户Id找到视图
NSInteger roomIndex = [self.videoContentView getIndexWithUserIds:self.userId];
//5.当前用户加入视频流
[rtv loginVideoRoomWithRoomId:self.roomId userId:self.userId position:roomIndex isOpenCamera:YES preView:self.videoContentView infoArray:infoAry];
//将创建的视图view的frame与用户Id关联对应,生成 GtVoiceVedioInfoModel 数组
- (NSMutableArray <GtVoiceVedioInfoModel *>*)createVideoRoomView:(NSArray *)userIdAry{
[self.view addSubview:self.videoContentView];
NSArray<CLRoomVideoModel *> *rooms = [self.videoContentView roomVideoViewsWithUserIds:userIdAry];
NSMutableArray * tmpAry = [NSMutableArray new];
[userIdAry enumerateObjectsUsingBlock:^(NSString * userId, NSUInteger idx, BOOL * _Nonnull stop) {
CLRoomVideoModel * model = rooms[idx];
GtVoiceVedioInfoModel * viewModel = [[GtVoiceVedioInfoModel alloc] initWithRect:model.roomView.frame userId:userId position:idx];
[tmpAry addObject:viewModel];
}];
return tmpAry;
}
#pragma mark - CLVoiceRtvManageDelegate
///登录回调
- (void)chatManage:(CLVoiceRtvManage *)sender loginRespWithResult:(int)result msg:(NSString *)msg{
NSLog(@"【实时语音】登录回调 %@",msg);
if (self.isCaller == NO) {
//登录成功上麦
[self audioStartRealtimeVoice];
}
}
- (void)chatManage:(CLVoiceRtvManage *)sender msgNotify:(CLVoiceRtvMsgNotify *)msgNotify {
switch (msgNotify.msgType) {
case GtVoiceRtvMessageType_Login:{
//有人登录了
//上麦
[self audioStartRealtimeVoice];
}
break;
case GtVoiceRtvMessageType_Logout:
{
if (msgNotify.remainNum <=1) {
//有人退出房间了
//当房间人数小于等于1时,解散当前房间
[self removeDeallocCall];
}
}
break;
default:
break;
}
}
/**
退出房间
*/
- (void)logout;
示例:
[[CLVoiceRtvManage sharedInstance] logoutVideoRoom];
发布日期 | 发布版本 | 更新说明 |
---|---|---|
2021-12-23 | V1.0.0 | 初版发布 |