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;