SDK采用模块化设计,每一模块的功能相对独立和完善,用户可以根据自己的需求选择使用下面的模块:
EMClient是SDK的入口,主要完成登录,退出,连接管理等功能。也是获取其他模块的入口。
EMChatManager管理消息的收发,完成会话管理等功能。
EMContactManager负责好友的添加删除,黑名单的管理。
EMGroupManager负责群组的管理,创建,删除群组,管理群组成员等功能。
EMChatroomManager负责聊天室的管理。
// 带语音的接口
#import "EMSDKFull.h"
// 不带语音的接口
#import "EMSDK.h"
EMOptions(SDK的设置选项)
//
/*
* 日志输出级别
*/
typedef enum {
EMLogLevelDebug = 0, //输出所有日志
EMLogLevelWarning, //输出警告及错误
EMLogLevelError //只输出错误
} EMLogLevel;
/*
* app唯一标识符
*/
@property (nonatomic, strong, readonly) NSString *appkey;
/*
* 控制台是否输出log, 默认为NO
*/
@property (nonatomic, assign) BOOL enableConsoleLog;
/*
* 日志输出级别, 默认为EMLogLevelDebug
*/
@property (nonatomic, assign) EMLogLevel logLevel;
/*
* 是否使用https, 默认为YES
*/
@property (nonatomic, assign) BOOL usingHttps;
/*
* 是否使用开发环境, 默认为NO
* 只能在[EMClient initializeSDKWithOptions:]时设置,不能在程序运行过程中动态修改
*/
@property (nonatomic, assign) BOOL isSandboxMode;
/*
* 是否自动登录, 默认为YES
* 设置的值会保存到本地。初始化EMOptions时,首先获取本地保存的值
*/
@property (nonatomic, assign) BOOL isAutoLogin;
/*
* 离开群组时是否删除该群所有消息, 默认为YES
*/
@property (nonatomic, assign) BOOL isDeleteMessagesWhenExitGroup;
/*
* 离开聊天室时是否删除所有消息, 默认为YES
*/
@property (nonatomic, assign) BOOL isDeleteMessagesWhenExitChatRoom;
/*
* 是否允许聊天室Owner离开, 默认为YES
*/
@property (nonatomic, assign) BOOL isChatroomOwnerLeaveAllowed;
/*
* 用户自动同意群邀请, 默认为YES
*/
@property (nonatomic, assign) BOOL isAutoAcceptGroupInvitation;
/*
* 自动同意好友申请, 默认为NO
*/
@property (nonatomic, assign) BOOL isAutoAcceptFriendInvitation;
/*
* 是否发送消息送达回执, 默认为NO,如果设置为YES,SDK收到单聊消息时会自动发送送达回执
*/
@property (nonatomic, assign) BOOL enableDeliveryAck;
/*
* iOS特有属性,推送证书的名称
* 只能在[EMClient initializeSDKWithOptions:]时设置,不能在程序运行过程中动态修改
*/
@property (nonatomic, strong) NSString *apnsCertName;
/*
* 获取实例
* @param aAppkey App的appkey
* @result SDK设置项实例
*/
+ (instancetype)optionsWithAppkey:(NSString *)aAppkey;
EMClient(客户端)
{
EMPushOptions *_pushOptions;
}
/*
* SDK版本号
*/
@property (nonatomic, strong, readonly) NSString *version;
/*
* 当前登录账号
*/
@property (nonatomic, strong, readonly) NSString *currentUsername;
/*
* SDK属性
*/
@property (nonatomic, strong, readonly) EMOptions *options;
/*
* 推送设置
*/
@property (nonatomic, strong, readonly) EMPushOptions *pushOptions;
/*
* 聊天模块
*/
@property (nonatomic, strong, readonly) id<IEMChatManager> chatManager;
/*
* 好友模块
*/
@property (nonatomic, strong, readonly) id<IEMContactManager> contactManager;
/*
* 群组模块
*/
@property (nonatomic, strong, readonly) id<IEMGroupManager> groupManager;
/*
* 聊天室模块
*/
@property (nonatomic, strong, readonly) id<IEMChatroomManager> roomManager;
/*
* SDK是否自动登录上次登录的账号
*/
@property (nonatomic, readonly) BOOL isAutoLogin;
/*
* 用户是否已登录
*/
@property (nonatomic, readonly) BOOL isLoggedIn;
/*
* 是否连上聊天服务器
*/
@property (nonatomic, readonly) BOOL isConnected;
/*
* 获取SDK实例
*/
+ (instancetype)sharedClient;
1. Delegate
/*
* 添加回调代理
* @param aDelegate 要添加的代理
* @param aQueue 执行代理方法的队列
*/
- (void)addDelegate:(id<EMClientDelegate>)aDelegate
delegateQueue:(dispatch_queue_t)aQueue;
/*
* 移除回调代理
* @param aDelegate 要移除的代理
*/
- (void)removeDelegate:(id)aDelegate;
2. Initialize SDKDelegate
/*
* 初始化sdk
* @param aOptions SDK配置项
* @result 错误信息
*/
- (EMError *)initializeSDKWithOptions:(EMOptions *)aOptions;
#pragma mark - Register
/*
* 注册用户
* 同步方法,会阻塞当前线程. 不推荐使用,建议后台通过REST注册
* @param aUsername 用户名
* @param aPassword 密码
* @result 错误信息
*/
- (EMError *)registerWithUsername:(NSString *)aUsername
password:(NSString *)aPassword;
3. Login Delegate
//
/*
* 登录
* 同步方法,会阻塞当前线程
* @param aUsername 用户名
* @param aPassword 密码
* @result 错误信息
*/
- (EMError *)loginWithUsername:(NSString *)aUsername
password:(NSString *)aPassword;
4. Logout Delegate
//
/*
* 退出
* 同步方法,会阻塞当前线程
* @param bIsUnbindDeviceToken 是否解除device token的绑定,解除绑定后设备不会再收到消息推送
* 如果传入YES, 解除绑定失败,将返回error
* @result 错误信息
*/
- (EMError *)logout:(BOOL)bIsUnbindDeviceToken;
5. Apns
//
/*
* 绑定device token
* 同步方法,会阻塞当前线程
* @param aDeviceToken 要绑定的token
* @result 错误信息
*/
- (EMError *)bindDeviceToken:(NSData *)aDeviceToken;
/*
* 从服务器获取推送属性
* 同步方法,会阻塞当前线程
*/
- (EMPushOptions *)getPushOptionsFromServerWithError:(EMError **)pError;
/*
* 设置推送消息显示的昵称
* 同步方法,会阻塞当前线程
* @param aNickname 要设置的昵称
* @result 错误信息
*/
- (EMError *)setApnsNickname:(NSString *)aNickname;
/*
* 更新推送设置到服务器
* 同步方法,会阻塞当前线程
* @result 错误信息
*/
- (EMError *)updatePushOptionsToServer;
6. iOS
/*
* iOS专用,数据迁移到SDK3.0
* 同步方法,会阻塞当前线程
* 升级到SDK3.0版本需要调用该方法,开发者需要等该方法执行完后再进行数据库相关操作
* @result 是否迁移成功
*/
- (BOOL)dataMigrationTo3;
/*
* iOS专用,程序进入后台时,需要调用此方法断开连接
* @param aApplication UIApplication
*/
- (void)applicationDidEnterBackground:(id)aApplication;
/*
* iOS专用,程序进入前台时,需要调用此方法进行重连
*/
- (void)applicationWillEnterForeground:(id)aApplication;
EMChatroom(聊天室)
/*
* 聊天室ID
*/
@property (nonatomic, copy, readonly) NSString *chatroomId;
/*
* 聊天室的主题
*/
@property (nonatomic, copy, readonly) NSString *subject;
/*
* 聊天室的描述
*/
@property (nonatomic, copy, readonly) NSString *description;
/*
* 聊天室的最大人数
*/
@property (nonatomic, readonly) NSInteger maxOccupantsCount;
/*
* 初始化聊天室实例
* 请使用[+chatroomWithId:]方法
* @result nil
*/
- (instancetype)init __deprecated_msg("Use +chatroomWithId:");
/*
* 获取聊天室实例
* @param aChatroomId 聊天室ID
* @result 聊天室实例
*/
+ (instancetype)chatroomWithId:(NSString *)aChatroomId;
EMConversation(聊天会话)
//
/*
* 会话类型
*/
typedef enum{
EMConversationTypeChat = 0, //单聊会话
EMConversationTypeGroupChat, //群聊会话
EMConversationTypeChatRoom, //聊天室会话
}EMConversationType;
/*
* 会话唯一标识
*/
@property (nonatomic, copy, readonly) NSString *conversationId;
/*
* 会话类型
*/
@property (nonatomic, assign, readonly) EMConversationType type;
/*
* 会话未读消息数量
*/
@property (nonatomic, assign, readonly) int unreadMessagesCount;
/*
* 会话扩展属性
*/
@property (nonatomic, strong) NSDictionary *ext;
/*
* 会话最新一条消息
*/
@property (nonatomic, strong, readonly) EMMessage *latestMessage;
/*
* 插入一条消息,消息的conversationId应该和会话的conversationId一致,消息会被插入DB,并且更新会话的latestMessage等属性
* @param aMessage 消息实例
* @result 是否成功
*/
- (BOOL)insertMessage:(EMMessage *)aMessage;
/*
* 删除一条消息
* @param aMessageId 要删除消失的ID
* @result 是否成功
*/
- (BOOL)deleteMessageWithId:(NSString *)aMessageId;
/*
* 删除该会话所有消息
* @result 是否成功
*/
- (BOOL)deleteAllMessages;
/*
* 更新一条消息,不能更新消息ID,消息更新后,会话的latestMessage等属性进行相应更新
* @param aMessage 要更新的消息
* @result 是否成功
*/
- (BOOL)updateMessage:(EMMessage *)aMessage;
/*
* 将消息设置为已读
* @param aMessageId 要设置消息的ID
* @result 是否成功
*/
- (BOOL)markMessageAsReadWithId:(NSString *)aMessageId;
/*
* 将所有未读消息设置为已读
*/
- (BOOL)markAllMessagesAsRead;
/*
* 更新会话扩展属性到DB
* @result 是否成功
*/
- (BOOL)updateConversationExtToDB;
/*
* 获取指定ID的消息
* @param aMessageId 消息ID
* @result 消息
*/
- (EMMessage *)loadMessageWithId:(NSString *)aMessageId;
/*
* 从数据库获取指定数量的消息,取到的消息按时间排序,并且不包含参考的消息,如果参考消息的ID为空,则从最新消息向前取
* @param aMessageId 参考消息的ID
* @param aLimit 获取的条数
* @result 消息列表<EMMessage>
*/
- (NSArray *)loadMoreMessagesFromId:(NSString *)aMessageId
limit:(int)aLimit;
/*
* 从数据库获取指定类型的消息,取到的消息按时间排序,如果参考的时间戳为负数,则从最新消息向前取,如果aLimit是负数,则获取所有符合条件的消息
* @param aType 消息类型
* @param aTimestamp 参考时间戳
* @param aLimit 获取的条数
* @result 消息列表<EMMessage>
*/
- (NSArray *)loadMoreMessagesWithType:(EMMessageBodyType)aType
before:(long long)aTimestamp
limit:(int)aLimit;
/*
* 从数据库获取包含指定内容的消息,取到的消息按时间排序,如果参考的时间戳为负数,则从最新消息向前取,如果aLimit是负数,则获取所有符合条件的消息
* @param aKeywords 搜索关键字
* @param aTimestamp 参考时间戳
* @param aLimit 获取的条数
* @result 消息列表<EMMessage>
*/
- (NSArray *)loadMoreMessagesContain:(NSString*)aKeywords
before:(long long)aTimestamp
limit:(int)aLimit;
/*
* 收到的对方发送的最后一条消息
* @result 消息实例
*/
- (EMMessage *)latestMessageFromOthers;
EMCursorResult(分段结果)
/*
* 结果列表<id>
*/
@property (nonatomic, strong) NSArray *list;
/*
* 获取下一段结果的游标
*/
@property (nonatomic, copy) NSString *cursor;
/*
* 创建实例
* @param aList 结果列表<id>
* @param aCusror 获取下一段结果的游标
* @result 分段结果的实例
*/
+ (instancetype)cursorResultWithList:(NSArray *)aList
andCursor:(NSString *)aCusror;
EMError(SDK定义的错误)
/*
* 错误码
*/
@property (nonatomic) EMErrorCode code;
/*
* 错误描述
*/
@property (nonatomic, strong) NSString *errorDescription;
/*
* 初始化错误实例
* @param aDescription 错误描述
* @param aCode 错误码
* @result 错误实例
*/
- (instancetype)initWithDescription:(NSString *)aDescription
code:(EMErrorCode)aCode;
/*
* 创建错误实例
* @param aDescription 错误描述
* @param aCode 错误码
* @result 对象实例
*/
+ (instancetype)errorWithDescription:(NSString *)aDescription
code:(EMErrorCode)aCode;
EMGroup(群组)
//
/*
* 群组ID
*/
@property (nonatomic, copy, readonly) NSString *groupId;
/*
* 群组的主题,需要获取群详情
*/
@property (nonatomic, copy, readonly) NSString *subject;
/*
* 群组的描述,需要获取群详情
*/
@property (nonatomic, copy, readonly) NSString *description;
/*
* 群组当前的成员数量,需要获取群详情
*/
@property (nonatomic, readonly) NSInteger occupantsCount;
/*
* 群组属性配置,需要获取群详情
*/
@property (nonatomic, strong, readonly) EMGroupOptions *setting;
/*
* 群组的所有者,拥有群的最高权限,需要获取群详情
* 群组的所有者只有一人
*/
@property (nonatomic, copy, readonly) NSString *owner;
/*
* 群组的成员列表,需要获取群详情
*/
@property (nonatomic, copy, readonly) NSArray *members;
/*
* 群组的黑名单,需要先调用获取群黑名单方法
* 需要owner权限才能查看,非owner返回nil
*/
@property (nonatomic, strong, readonly) NSArray *bans;
/*
* 群组的所有成员(包含owner和members)
*/
@property (nonatomic, strong, readonly) NSArray *occupants;
/*
* 此群组是否接收消息推送通知
*/
@property (nonatomic, readonly) BOOL isPushNotificationEnabled;
/*
* 此群是否为公开群,需要获取群详情
*/
@property (nonatomic, readonly) BOOL isPublic;
/*
* 是否屏蔽群消息
*/
@property (nonatomic, readonly) BOOL isBlocked;
/*
* 初始化群组实例
* 请使用+groupWithId:方法
* @result nil
*/
- (instancetype)init __deprecated_msg("Use +groupWithId:");
/*
* 获取群组实例,如果不存在则创建
* @param aGroupId 群组ID
* @result 群组实例
*/
+ (instancetype)groupWithId:(NSString *)aGroupId;