- QMServices
- 特性
- 要求
- 依赖项
- 安装
- 架构
- 入门指南
- 文档
- 授权
QMServices
这是一个用于Quickblox SDK的易于使用的服务,用于加快iOS聊天应用程序的开发。
特性
- 包括用于登录Quickblox REST和XMPP的认证服务的高级聊天功能API
- 消息、对话和用户的消息箱持久存储
- 消息、对话和用户的消息箱内存存储
- 所有方法的Bolts版本。更多信息请参见[Bolts-iOS](https://github.com/BoltsFramework/Bolts-iOS "Bolts-iOS"")。
需求
- Xcode 6+
- 自动引用计数(ARC)
依赖项
安装
可以通过以下几种方法将 QMServices 添加到项目中
1. Cocoapods
使用 Cocoapods 安装 QMServices,只需要在你的 Podfile 中添加以下行
pod 'QMServices'
2. 使用 Xcode 子项目
Xcode 子项目允许你的项目将 QMServices 作为隐式依赖项使用和构建。
将 QMServices 添加到项目中作为 Git 子模块
$ cd MyXcodeProjectFolder
$ git submodule add https://github.com/QuickBlox/q-municate-services-ios.git Vendor/QMServices
$ git commit -m "Added QMServices submodule"
这将添加 QMServices 作为子模块,并下载 Bolts 作为依赖项。将 Vendor/QMServices/QMServices.xcodeproj
拖放到现有的 Xcode 项目中。
导航到你的项目设置,然后选择你想添加 QMServices 的目标。
导航到 构建设置,然后搜索 头文件搜索路径 并双击它来编辑
使用 + 添加新项:"$(SRCROOT)/Vendor/QMServices"
确保它设置为 递归
导航到 构建设置,然后搜索 框架搜索路径 并双击它来编辑
使用 + 添加新项:"$(SRCROOT)/Vendor/QMServices/Frameworks"
** 注意**
仅限手动安装:如果不按照以下步骤操作,您将遇到编译错误,提示Quickblox.framework和Bolts.framework未找到
位于`"$(SRCROOT)/Vendor/QMServices/Frameworks"`的Quickblox.framework和Bolts.framework中不包含二进制数据,它们仅用于生成包。如果您计划将QMServices作为子项目使用,那么
1. 下载Quickblox.framework https://github.com/QuickBlox/quickblox-ios-sdk/archive/master.zip
2. 下载Bolts.framework https://github.com/BoltsFramework/Bolts-ObjC/releases/download/1.5.1/Bolts-iOS.zip
3. 将框架放入文件夹'Vendor/QMServices/Frameworks'
** 注意**:默认情况下,QMServices子项目引用Quickblox和Bolts框架的位置是
../Frameworks
。要更改路径,您需要打开Quickblox.xcconfig文件,将../Frameworks
替换为您Quickblox.framework和Bolts.framework的路径。
** 注意**:请记住,如果您已将Xcode的自动链接框架设置为否,那么您可能需要将Quickblox.framework和CoreData.framework添加到iOS项目,因为UIKit默认不包含Core Data。在OS X上,Cocoa包含Core Data。
和)libQMServices.a。别忘了将Quickblox和Bolts框架添加到您的项目中。
下一步骤是将所有包复制到您的项目中的“复制包资源”。在项目设置中导航到“QMServices.xcodeproj/Cache”,并将子项目中存在的QMUsersCacheModel.bundle、QMContactListCacheModel.bundle和QMChatCacheModel.bundle移动到项目的“复制包资源”中。在弹出的窗口中,只选择“创建文件夹引用”。
如果您将QMServices添加到Swift项目中,您需要将它们导入到您的桥接头中
#import "QMServices.h"
要集成Quickblox iOS SDK到您的Swift项目中,请参阅我们的详细指南这里。
如果您仍然遇到某些崩溃,请检查您是否已为项目设置了正确的其他链接器标志(-lxml2, -ObjC, -lstdc++),否则请随意创建一个问题并告诉我们您的问题。
包生成
注意:如果您不使用对话框、消息和用户内存以及磁盘存储,则可以跳过此步骤。
包允许与静态库一起传递.xcdatamodel文件,对于QMChatCache和QMContactListCache项目是必需的。
要生成联系列表的包,您需要打开QMServices项目,导航到Cache文件夹,并选择QMContactListCache.xcodeproj。打开项目文件夹 - 您将看到红色的QMContactListCacheModel.bundle。要创建它,请选择方案QMContactListCacheModel并运行它。在build成功后,QMContactListCacheModel.bundle的颜色将变为黑色,并将能将 medic将包复制到使用了QMServices的项目中。将此包包含到您的项目中。
为了生成用于对话框和消息的包,您需要打开 QMServices 项目,导航到 Cache 文件夹并选择 QMChatCache.xcodeproj。打开项目文件夹 - 您将看到红色的 QMChatCacheModel.bundle。要创建它,请选择方案 QMChatCacheModel 并运行它。构建成功后,QMChatCacheModel.bundle 颜色将变成黑色,您就可以将其复制到使用 QMServices 的项目中。将此包包含在您的项目中。
架构
QMServices 包含
- QMAuthService
- QMChatService
- QMContactListService
- QMUsersService
它们都继承自 QMBaseService。为了支持 CoreData 缓存,您可以使用继承自 QMDBStorage 的 QMContactListCache、QMChatCache 和 QMUsersCache,您也可以使用自己的数据库存储 - 只需根据您的需要实现 QMChatServiceDelegate、QMContactListServiceDelegate 或 QMUsersServiceDelegate 即可。
入门
将 #import <QMServices.h> 添加到您的应用程序的 .pch 文件中。
服务管理器
要使用服务,您可以使用现有的 QMServicesManager 类或其他从其创建的子类。下面是 QMServicesManager 类的详细说明。
QMServicesManager 有两个功能 - 用户登录(登录到 REST API、聊天)/登出(从聊天、REST API 登出、清除持久和内存缓存);在 QMChatCache 和 QMChatService 之间建立连接,以便能够在磁盘上存储对话框和消息数据。
以下是 QMServicesManager.h
@interface QMServicesManager : NSObject <QMServiceManagerProtocol, QMChatServiceCacheDataSource, QMChatServiceDelegate, QMChatConnectionDelegate>
+ (instancetype)instance;
- (void)logInWithUser:(QBUUser *)user completion:(void (^)(BOOL success, NSString *errorMessage))completion;
- (void)logoutWithCompletion:(dispatch_block_t)completion;
@property (nonatomic, readonly) QMAuthService* authService;
@property (nonatomic, readonly) QMChatService* chatService;
@end
以及在 QMServicesManager.m 中的扩展
@interface QMServicesManager ()
@property (nonatomic, strong) QMAuthService* authService;
@property (nonatomic, strong) QMChatService* chatService;
@property (nonatomic, strong) dispatch_group_t logoutGroup;
@end
在 init
方法中,初始化服务和缓存。
- (instancetype)init {
self = [super init];
if (self) {
[QMChatCache setupDBWithStoreNamed:@"sample-cache"];
[QMChatCache instance].messagesLimitPerDialog = 10;
_authService = [[QMAuthService alloc] initWithServiceManager:self];
_chatService = [[QMChatService alloc] initWithServiceManager:self cacheDataSource:self];
[_chatService addDelegate:self];
_logoutGroup = dispatch_group_create();
}
return self;
}
-
缓存设置(如果您不需要持久存储,则可跳过此步骤)。
- 初始化对话和消息的 Core Data 数据库
[QMChatCache setupDBWithStoreNamed:@"sample-cache"];
-
服务设置
- 认证服务
_authService = [[QMAuthService alloc] initWithServiceManager:self];
- 聊天服务(负责建立聊天连接并响应聊天事件(消息、上线状况等)
_chatService = [[QMChatService alloc] initWithServiceManager:self cacheDataSource:self];
您还必须实现 QMServiceManagerProtocol 方法
- (void)handleErrorResponse:(QBResponse *)response {
// handle error response from services here
}
- (BOOL)isAuthorized {
return self.authService.isAuthorized;
}
- (QBUUser *)currentUser {
return [QBSession currentSession].currentUser;
}
为了实现聊天消息和对话框缓存,您必须实现来自 QMChatServiceDelegate 协议的以下方法
- (void)chatService:(QMChatService *)chatService didAddChatDialogToMemoryStorage:(QBChatDialog *)chatDialog {
[QMChatCache.instance insertOrUpdateDialog:chatDialog completion:nil];
}
- (void)chatService:(QMChatService *)chatService didAddChatDialogsToMemoryStorage:(NSArray *)chatDialogs {
[QMChatCache.instance insertOrUpdateDialogs:chatDialogs completion:nil];
}
- (void)chatService:(QMChatService *)chatService didAddMessageToMemoryStorage:(QBChatMessage *)message forDialogID:(NSString *)dialogID {
[QMChatCache.instance insertOrUpdateMessage:message withDialogId:dialogID completion:nil];
}
- (void)chatService:(QMChatService *)chatService didAddMessagesToMemoryStorage:(NSArray *)messages forDialogID:(NSString *)dialogID {
[QMChatCache.instance insertOrUpdateMessages:messages withDialogId:dialogID completion:nil];
}
- (void)chatService:(QMChatService *)chatService didDeleteChatDialogWithIDFromMemoryStorage:(NSString *)chatDialogID {
[QMChatCache.instance deleteDialogWithID:chatDialogID completion:nil];
}
- (void)chatService:(QMChatService *)chatService didReceiveNotificationMessage:(QBChatMessage *)message createDialog:(QBChatDialog *)dialog {
[QMChatCache.instance insertOrUpdateMessage:message withDialogId:dialog.ID completion:nil];
[QMChatCache.instance insertOrUpdateDialog:dialog completion:nil];
}
- (void)chatService:(QMChatService *)chatService didUpdateChatDialogInMemoryStorage:(QBChatDialog *)chatDialog {
[[QMChatCache instance] insertOrUpdateDialog:chatDialog completion:nil];
}
此外,为了预取初始对话框和消息,您还必须实现 QMChatServiceCacheDataSource 协议
- (void)cachedDialogs:(QMCacheCollection)block {
[QMChatCache.instance dialogsSortedBy:CDDialogAttributes.lastMessageDate ascending:YES completion:^(NSArray *dialogs) {
block(dialogs);
}];
}
- (void)cachedMessagesWithDialogID:(NSString *)dialogID block:(QMCacheCollection)block {
[QMChatCache.instance messagesWithDialogId:dialogID sortedBy:CDMessageAttributes.messageID ascending:YES completion:^(NSArray *array) {
block(array);
}];
}
日志
默认情况下,QMServices将在开发者控制台记录其信息。您可能希望禁用它们(例如,对于生产环境,日志有时可能会减慢您的应用程序)。为此,请使用QMServicesManager静态方法
+ (void)enableLogging:(BOOL)flag;
只需在您的AppDelegate类中设置,例如
[QMServicesManager enableLogging:NO];
身份验证
登录
此方法将用户登录到Quickblox REST API后台和Quickblox Chat后台。它还会自动尝试加入所有缓存的群组对话框,以便立即接收传入的消息。
- (void)logInWithUser:(QBUUser *)user
completion:(void (^)(BOOL success, NSString *errorMessage))completion
{
__weak typeof(self) weakSelf = self;
[self.authService logInWithUser:user completion:^(QBResponse *response, QBUUser *userProfile) {
if (response.error != nil) {
if (completion != nil) {
completion(NO, response.error.error.localizedDescription);
}
return;
}
[weakSelf.chatService connectWithCompletionBlock:^(NSError * _Nullable error) {
//
__typeof(self) strongSelf = weakSelf;
[strongSelf.chatService loadCachedDialogsWithCompletion:^{
NSArray* dialogs = [strongSelf.chatService.dialogsMemoryStorage unsortedDialogs];
for (QBChatDialog* dialog in dialogs) {
if (dialog.type != QBChatDialogTypePrivate) {
[strongSelf.chatService joinToGroupDialog:dialog completion:^(NSError * _Nullable error) {
//
if (error != nil) {
NSLog(@"Join error: %@", error.localizedDescription);
}
}];
}
}
if (completion != nil) {
completion(error == nil, error.localizedDescription);
}
}];
}];
}];
}
用法示例
// Logging in to Quickblox REST API and chat.
[QMServicesManager.instance logInWithUser:selectedUser completion:^(BOOL success, NSString *errorMessage) {
if (success) {
// Handle success login
} else {
// Handle error with error message
}
}];
登出
- (void)logoutWithCompletion:(dispatch_block_t)completion
{
if ([QBSession currentSession].currentUser != nil) {
__weak typeof(self)weakSelf = self;
dispatch_group_enter(self.logoutGroup);
[self.authService logOut:^(QBResponse *response) {
__typeof(self) strongSelf = weakSelf;
[strongSelf.chatService disconnectWithCompletionBlock:nil];
[strongSelf.chatService free];
dispatch_group_leave(strongSelf.logoutGroup);
}];
dispatch_group_enter(self.logoutGroup);
[[QMChatCache instance] deleteAllDialogsWithCompletion:^{
__typeof(self) strongSelf = weakSelf;
dispatch_group_leave(strongSelf.logoutGroup);
}];
dispatch_group_enter(self.logoutGroup);
[[QMChatCache instance] deleteAllMessagesWithCompletion:^{
__typeof(self) strongSelf = weakSelf;
dispatch_group_leave(strongSelf.logoutGroup);
}];
dispatch_group_notify(self.logoutGroup, dispatch_get_main_queue(), ^{
if (completion) {
completion();
}
});
} else {
if (completion) {
completion();
}
}
}
用法示例
[[QMServicesManager instance] logoutWithCompletion:^{
// Handle logout
}];
获取聊天对话框
从REST API加载所有对话框
扩展请求参数可以参考http://quickblox.com/developers/SimpleSample-chat_users-ios#Filters。
[QMServicesManager.instance.chatService allDialogsWithPageLimit:100 extendedRequest:nil iterationBlock:^(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop) {
// reload UI, this block is called when page is loaded
} completion:^(QBResponse *response) {
// loading finished, all dialogs fetched
}];
这些对话框将自动存储在内核中的QMDialogsMemoryStorage
类。
获取聊天消息
从REST API历史记录中获取消息
[QMServicesManager instance].chatService messagesWithChatDialogID:@"53fdc87fe4b0f91d92fbb27e" completion:^(QBResponse *response, NSArray *messages) {
// update UI, handle messages
}];
这些消息将自动存储在内核中的QMMessagesMemoryStorage
类。
发送消息
向对话发送消息
QBChatMessage *message = [QBChatMessage message];
message.text = @"Awesome text";
message.senderID = 2308497;
[[QMServicesManager instance].chatService sendMessage:message type:QMMessageTypeText toDialogId:@"53fdc87fe4b0f91d92fbb27e" saveToHistory:YES saveToStorage:YES completion:nil];
消息被自动添加到 QMMessagesMemoryStorage 类中。
获取用户
[[[QMServicesManager instance].usersService getUsersWithIDs:@[@(2308497), @(2308498)]] continueWithBlock:^id(BFTask<NSArray<QBUUser *> *> *task) {
if (task.error == nil) {
// handle users
}
return nil;
}];
用户被自动存储在 QMUsersMemoryStorage 类中。
QMServicesManager子类示例
此示例添加了附加功能 - 在联系人列表缓存中存储用户、错误处理、存储当前打开的对话标识符。
头文件
@interface ServicesManager : QMServicesManager <QMContactListServiceCacheDataSource>
// Replaces with any users service you are already using or going to use
@property (nonatomic, readonly) UsersService* usersService;
@property (nonatomic, strong) NSString* currentDialogID;
@end
实现文件
@interface ServicesManager ()
@property (nonatomic, strong) QMContactListService* contactListService;
@end
@implementation ServicesManager
- (instancetype)init {
self = [super init];
if (self) {
[QMContactListCache setupDBWithStoreNamed:kContactListCacheNameKey];
_contactListService = [[QMContactListService alloc] initWithServiceManager:self cacheDataSource:self];
// Replace with any users service you are already using or going to use
_usersService = [[UsersService alloc] initWithContactListService:_contactListService];
}
return self;
}
- (void)showNotificationForMessage:(QBChatMessage *)message inDialogID:(NSString *)dialogID
{
if ([self.currentDialogID isEqualToString:dialogID]) return;
if (message.senderID == self.currentUser.ID) return;
NSString* dialogName = @"New message";
QBChatDialog* dialog = [self.chatService.dialogsMemoryStorage chatDialogWithID:dialogID];
if (dialog.type != QBChatDialogTypePrivate) {
dialogName = dialog.name;
} else {
QBUUser* user = [[StorageManager instance] userByID:dialog.recipientID];
if (user != nil) {
dialogName = user.login;
}
}
// Display notification UI
}
- (void)handleErrorResponse:(QBResponse *)response {
[super handleErrorResponse:response];
if (![self isAuthorized]) return;
NSString *errorMessage = [[response.error description] stringByReplacingOccurrencesOfString:@"(" withString:@""];
errorMessage = [errorMessage stringByReplacingOccurrencesOfString:@")" withString:@""];
if( response.status == 502 ) { // bad gateway, server error
errorMessage = @"Bad Gateway, please try again";
}
else if( response.status == 0 ) { // bad gateway, server error
errorMessage = @"Connection network error, please try again";
}
// Display notification UI
}
#pragma mark QMChatServiceCache delegate
- (void)chatService:(QMChatService *)chatService didAddMessageToMemoryStorage:(QBChatMessage *)message forDialogID:(NSString *)dialogID {
[super chatService:chatService didAddMessageToMemoryStorage:message forDialogID:dialogID];
[self showNotificationForMessage:message inDialogID:dialogID];
}
#pragma mark QMContactListServiceCacheDelegate delegate
- (void)cachedUsers:(QMCacheCollection)block {
[QMContactListCache.instance usersSortedBy:@"id" ascending:YES completion:block];
}
- (void)cachedContactListItems:(QMCacheCollection)block {
[QMContactListCache.instance contactListItems:block];
}
@end
QMAuthService
此类负责认证操作。
当前用户授权状态
@property (assign, nonatomic, readonly) BOOL isAuthorized;
注册并登录Quickblox用户。
- (QBRequest *)signUpAndLoginWithUser:(QBUUser *)user completion:(void(^)(QBResponse *response, QBUUser *userProfile))completion;
登录Quickblox用户。
- (QBRequest *)logInWithUser:(QBUUser *)user completion:(void(^)(QBResponse *response, QBUUser *userProfile))completion;
使用Facebook会话令牌登录。
- (QBRequest *)logInWithFacebookSessionToken:(NSString *)sessionToken completion:(void(^)(QBResponse *response, QBUUser *userProfile))completion;
从Quickblox登出用户。
- (QBRequest *)logInWithFacebookSessionToken:(NSString *)sessionToken completion:(void(^)(QBResponse *response, QBUUser *userProfile))completion;
QMAuthService + Bolts
QMAuthService 还实现了所有使用BFTasks的方法。
使用 Bolts 注册用户并登录 Quickblox。
- (BFTask *)signUpAndLoginWithUser:(QBUUser *)user;
使用 Bolts 登录 Quickblox 用户。
- (BFTask *)loginWithUser:(QBUUser *)user;
使用 Bolts 使用FaceBook会话令牌登录。
- (BFTask *)loginWithFacebookSessionToken:(NSString *)sessionToken;
使用 Bolts 从 Quickblox 登出用户。
- (BFTask *)logout;
QMChatService
此类负责与消息和对话框进行操作。
将用户连接到Quickblox聊天。
- (void)connectWithCompletionBlock:(QBChatCompletionBlock)completion;
从Quickblox聊天中断开用户连接。
- (void)disconnectWithCompletionBlock:(QBChatCompletionBlock)completion;
将用户加入群组对话框。
- (void)joinToGroupDialog:(QBChatDialog *)dialog completion:(QBChatCompletionBlock)completion;
在Quickblox上创建带有与会者的群聊对话框。
- (void)createGroupChatDialogWithName:(NSString *)name photo:(NSString *)photo occupants:(NSArray *)occupants
completion:(void(^)(QBResponse *response, QBChatDialog *createdDialog))completion;
在Quickblox上创建与对手的私聊对话框。
- (void)createPrivateChatDialogWithOpponent:(QBUUser *)opponent
completion:(void(^)(QBResponse *response, QBChatDialog *createdDialog))completion;
更改对话框名称。
- (void)changeDialogName:(NSString *)dialogName forChatDialog:(QBChatDialog *)chatDialog
completion:(void(^)(QBResponse *response, QBChatDialog *updatedDialog))completion;
更改对话框头像。
- (void)changeDialogAvatar:(NSString *)avatarPublicUrl forChatDialog:(QBChatDialog *)chatDialog
completion:(void(^)(QBResponse *response, QBChatDialog *updatedDialog))completion;
向对话框中添加与会者。
- (void)joinOccupantsWithIDs:(NSArray *)ids toChatDialog:(QBChatDialog *)chatDialog
completion:(void(^)(QBResponse *response, QBChatDialog *updatedDialog))completion;
在服务和缓存中删除对话框。
- (void)deleteDialogWithID:(NSString *)dialogId
completion:(void(^)(QBResponse *response))completion;
从Quickblox递归获取所有对话框。
- (void)allDialogsWithPageLimit:(NSUInteger)limit
extendedRequest:(NSDictionary *)extendedRequest
iterationBlock:(void(^)(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop))iterationBlock
completion:(void(^)(QBResponse *response))completion;
发送关于将用户添加到对话框的系统消息(对话框内容在内)。
- (void)sendSystemMessageAboutAddingToDialog:(QBChatDialog *)chatDialog
toUsersIDs:(NSArray *)usersIDs
completion:(QBChatCompletionBlock)completion;
发送关于更新对话框的消息(对话框内容在内和通知)。
- (void)sendMessageAboutUpdateDialog:(QBChatDialog *)updatedDialog
withNotificationText:(NSString *)notificationText
customParameters:(NSDictionary *)customParameters
completion:(QBChatCompletionBlock)completion;
发送关于接受或拒绝联系请求的消息。
- (void)sendMessageAboutAcceptingContactRequest:(BOOL)accept
toOpponentID:(NSUInteger)opponentID
completion:(QBChatCompletionBlock)completion;
发送关于将与会者添加到特定对话框的通知消息。
- (void)sendNotificationMessageAboutAddingOccupants:(NSArray *)occupantsIDs
toDialog:(QBChatDialog *)chatDialog
withNotificationText:(NSString *)notificationText
completion:(QBChatCompletionBlock)completion;
发送关于离开对话框的通知消息。
- (void)sendNotificationMessageAboutLeavingDialog:(QBChatDialog *)chatDialog
withNotificationText:(NSString *)notificationText
completion:(QBChatCompletionBlock)completion;
发送关于更改对话框照片的通知消息。
- (void)sendNotificationMessageAboutChangingDialogPhoto:(QBChatDialog *)chatDialog
withNotificationText:(NSString *)notificationText
completion:(QBChatCompletionBlock)completion;
发送关于更改对话框名称的通知消息。
- (void)sendNotificationMessageAboutChangingDialogName:(QBChatDialog *)chatDialog
withNotificationText:(NSString *)notificationText
completion:(QBChatCompletionBlock)completion;
从缓存的最新消息开始获取100条消息。
- (void)messagesWithChatDialogID:(NSString *)chatDialogID completion:(void(^)(QBResponse *response, NSArray *messages))completion;
获取缓存的最早消息之前的所有100条消息。
- (BFTask <NSArray <QBChatMessage *> *> *)loadEarlierMessagesWithChatDialogID:(NSString *)chatDialogID;
获取带有对话框标识符的对话框。
- (void)fetchDialogWithID:(NSString *)dialogID completion:(void (^)(QBChatDialog *dialog))completion;
从Quickblox服务器加载带有对话框标识符的对话框并保存到本地存储。
- (void)loadDialogWithID:(NSString *)dialogID completion:(void (^)(QBChatDialog *loadedDialog))completion;
从特定日期获取更新的对话框。
- (void)fetchDialogsUpdatedFromDate:(NSDate *)date
andPageLimit:(NSUInteger)limit
iterationBlock:(void(^)(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop))iteration
completionBlock:(void (^)(QBResponse *response))completion;
向对话框发送消息。
- (void)sendMessage:(QBChatMessage *)message
toDialog:(QBChatDialog *)dialog
saveToHistory:(BOOL)saveToHistory
saveToStorage:(BOOL)saveToStorage
completion:(QBChatCompletionBlock)completion;
向对话框发送附件消息。
- (void)sendAttachmentMessage:(QBChatMessage *)attachmentMessage
toDialog:(QBChatDialog *)dialog
withAttachmentImage:(UIImage *)image
completion:(QBChatCompletionBlock)completion;
将消息标记为已交付。
- (void)markMessageAsDelivered:(QBChatMessage *)message completion:(QBChatCompletionBlock)completion;
将消息标记为已交付。
- (void)markMessagesAsDelivered:(NSArray<QBChatMessage *> *)messages completion:(QBChatCompletionBlock)completion;
发送消息的阅读状态并更新存储中对话框的未读消息数。
- (void)readMessage:(QBChatMessage *)message completion:(QBChatCompletionBlock)completion;
发送消息的阅读状态并更新存储中对话框的未读消息数。
- (void)readMessages:(NSArray<QBChatMessage *> *)messages forDialogID:(NSString *)dialogID completion:(QBChatCompletionBlock)completion;
QMChatService + Bolts
QMChatService 还实现了所有使用BFTasks的方法。
使用Bolts连接用户到Quickblox聊天。
- (BFTask *)connect;
使用Bolts从Quickblox聊天中断开用户连接。
- (BFTask *)disconnect;
使用Bolts将用户加入群组对话框。
- (BFTask *)joinToGroupDialog:(QBChatDialog *)dialog;
使用Bolts在Quickblox上创建带有与会者的群聊对话框。
- (BFTask *)createGroupChatDialogWithName:(NSString *)name photo:(NSString *)photo occupants:(NSArray *)occupants;
使用Bolts在Quickblox上创建与对手的私聊对话框。
- (BFTask *)createPrivateChatDialogWithOpponent:(QBUUser *)opponent;
使用Bolts更改对话框名称。
- (BFTask *)changeDialogName:(NSString *)dialogName forChatDialog:(QBChatDialog *)chatDialog;
使用Bolts更改对话框头像。
- (BFTask *)changeDialogAvatar:(NSString *)avatarPublicUrl forChatDialog:(QBChatDialog *)chatDialog;
使用Bolts向对话框中添加与会者。
- (BFTask *)joinOccupantsWithIDs:(NSArray *)ids toChatDialog:(QBChatDialog *)chatDialog;
使用Bolts在服务和缓存中删除对话框。
- (BFTask *)deleteDialogWithID:(NSString *)dialogID;
使用Bolts从Quickblox递归获取所有对话框。
- (BFTask *)allDialogsWithPageLimit:(NSUInteger)limit
extendedRequest:(NSDictionary *)extendedRequest
iterationBlock:(void(^)(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop))iterationBlock;
使用Bolts发送关于将用户添加到对话框的系统消息(对话框内容在内)。
- (BFTask *)sendSystemMessageAboutAddingToDialog:(QBChatDialog *)chatDialog
toUsersIDs:(NSArray *)usersIDs;
使用Bolts发送关于接受或拒绝联系请求的消息。
- (BFTask *)sendMessageAboutAcceptingContactRequest:(BOOL)accept
toOpponentID:(NSUInteger)opponentID;
使用Bolts发送关于将与会者添加到特定对话框的通知消息。
- (BFTask *)sendNotificationMessageAboutAddingOccupants:(NSArray *)occupantsIDs
toDialog:(QBChatDialog *)chatDialog
withNotificationText:(NSString *)notificationText;
使用Bolts发送关于离开对话框的通知消息。
- (BFTask *)sendNotificationMessageAboutLeavingDialog:(QBChatDialog *)chatDialog
withNotificationText:(NSString *)notificationText;
使用Bolts发送关于更改对话框照片的通知消息。
- (BFTask *)sendNotificationMessageAboutChangingDialogPhoto:(QBChatDialog *)chatDialog
withNotificationText:(NSString *)notificationText;
使用Bolts发送关于更改对话框名称的通知消息。
- (BFTask *)sendNotificationMessageAboutChangingDialogName:(QBChatDialog *)chatDialog
withNotificationText:(NSString *)notificationText;
使用Bolts通过聊天对话框ID获取消息。
- (BFTask *)messagesWithChatDialogID:(NSString *)chatDialogID;
使用Bolts获取带有对话框标识符的对话框。
- (BFTask *)fetchDialogWithID:(NSString *)dialogID;
使用Bolts从Quickblox服务器加载带有对话框标识符的对话框并保存到本地存储。
- (BFTask *)loadDialogWithID:(NSString *)dialogID;
使用Bolts从特定日期获取更新的对话框。
- (BFTask *)fetchDialogsUpdatedFromDate:(NSDate *)date
andPageLimit:(NSUInteger)limit
iterationBlock:(void(^)(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, BOOL *stop))iteration;
使用Bolts向对话框发送消息。
- (BFTask *)sendMessage:(QBChatMessage *)message
toDialog:(QBChatDialog *)dialog
saveToHistory:(BOOL)saveToHistory
saveToStorage:(BOOL)saveToStorage;
使用Bolts向对话框发送附件消息。
- (BFTask *)sendAttachmentMessage:(QBChatMessage *)attachmentMessage
toDialog:(QBChatDialog *)dialog
withAttachmentImage:(UIImage *)image;
使用Bolts将消息标记为已交付。
- (BFTask *)markMessageAsDelivered:(QBChatMessage *)message;
使用Bolts发送消息的阅读状态并更新存储中对话框的未读消息数。
- (BFTask *)readMessage:(QBChatMessage *)message;
QMDialogsMemoryStorage
此类负责内存中会话的存储。
添加聊天对话和加入。
- (void)addChatDialog:(QBChatDialog *)chatDialog andJoin:(BOOL)join completion:(void(^)(QBChatDialog *addedDialog, NSError *error))completion;
添加聊天对话和加入。
- (void)addChatDialogs:(NSArray *)dialogs andJoin:(BOOL)join;
删除聊天对话。
- (void)deleteChatDialogWithID:(NSString *)chatDialogID;
通过标识符查找对话。
- (QBChatDialog *)chatDialogWithID:(NSString *)dialogID;
通过对手ID查找私密聊天对话。
- (QBChatDialog *)privateChatDialogWithOpponentID:(NSUInteger)opponentID;
查找未读对话。
- (NSArray *)unreadDialogs;
获取所有对话。
- (NSArray *)unsortedDialogs;
按最后一条消息日期排序获取所有对话。
- (NSArray *)dialogsSortByLastMessageDateWithAscending:(BOOL)ascending;
按更新时间排序获取所有对话。
- (NSArray *)dialogsSortByUpdatedAtWithAscending:(BOOL)ascending;
获取带指定排序描述符的对话。
- (NSArray *)dialogsWithSortDescriptors:(NSArray *)descriptors;
QMMessagesMemoryStorage
此类负责内存中消息的存储。
添加消息。
- (void)addMessage:(QBChatMessage *)message forDialogID:(NSString *)dialogID;
添加消息。
- (void)addMessages:(NSArray *)messages forDialogID:(NSString *)dialogID;
替换对话中的所有消息。
- (void)replaceMessages:(NSArray *)messages forDialogID:(NSString *)dialogID;
更新消息。
- (void)updateMessage:(QBChatMessage *)message;
获取消息。
- (NSArray *)messagesWithDialogID:(NSString *)dialogID;
删除对话中的消息。
- (void)deleteMessagesWithDialogID:(NSString *)dialogID;
按标识符获取消息。
- (QBChatMessage *)messageWithID:(NSString *)messageID fromDialogID:(NSString *)dialogID;
获取最后一条消息。
- (QBChatMessage *)lastMessageFromDialogID:(NSString *)dialogID;
检查对话是否有消息。
- (BOOL)isEmptyForDialogID:(NSString *)dialogID;
获取最早(第一条)消息。
- (QBChatMessage *)oldestMessageForDialogID:(NSString *)dialogID;
QMChatAttachmentService
此类负责附件操作(发送、接收、加载、保存)。
附件状态委托
@property (nonatomic, weak) id<QMChatAttachmentServiceDelegate> delegate;
获取附件图片。 (从Quickblox下载或从磁盘加载)。
- (void)getImageForAttachmentMessage:(QBChatMessage *)attachmentMessage completion:(void(^)(NSError *error, UIImage *image))completion;
QMContactListService
此类负责联系人列表操作。
将用户添加到联系人列表。
- (void)addUserToContactListRequest:(QBUUser *)user completion:(void(^)(BOOL success))completion;
从联系人列表中删除用户。
- (void)removeUserFromContactListWithUserID:(NSUInteger)userID completion:(void(^)(BOOL success))completion;
接受联系人请求。
- (void)acceptContactRequest:(NSUInteger)userID completion:(void (^)(BOOL success))completion;
拒绝联系人请求。
- (void)rejectContactRequest:(NSUInteger)userID completion:(void(^)(BOOL success))completion;
QMContactListMemoryStorage
此类负责内存中联系人列表的存储。
更新联系人列表内存存储。
- (void)updateWithContactList:(QBContactList *)contactList;
使用联系人列表项数组更新联系人列表内存存储。
- (void)updateWithContactList:(QBContactList *)contactList;
获取联系人列表项。
- (QBContactListItem *)contactListItemWithUserID:(NSUInteger)userID;
从联系人列表内存存储中获取用户ID。
- (NSArray *)userIDsFromContactList;
QMUsersService
此类负责与用户进行操作,并使用 BFTasks。
将用户从磁盘缓存加载到内存存储中。
- (BFTask<NSArray<QBUUser *> *> *)loadFromCache;
### 获取用户
以下方法有几种获取用户的方式。默认情况下,每个获取方法首先在缓存中检查特定用户。如果找到该用户,则将他从服务器请求中排除,并仅对未在本地缓存中找到的用户发送请求。如果您想更新缓存中的用户,则需要强制他们从服务器加载,即使它们已经被缓存。每个获取方法都有自己的带有 forceLoad 标志的实<现,将其设置为 YES 以强制从服务器加载用户。
按ID获取用户
- (BFTask<QBUUser *> *)getUserWithID:(NSUInteger)userID;
按ID获取用户
- (BFTask<NSArray<QBUUser *> *> *)getUsersWithIDs:(NSArray<NSNumber *> *)usersIDs;
按ID(带扩展分页参数)获取用户
- (BFTask<NSArray<QBUUser *> *> *)getUsersWithIDs:(NSArray<NSNumber *> *)usersIDs page:(QBGeneralResponsePage *)page;
按电子邮件获取用户
- (BFTask<NSArray<QBUUser *> *> *)getUsersWithEmails:(NSArray<NSString *> *)emails;
按电子邮件(带扩展分页参数)获取用户
- (BFTask<NSArray<QBUUser *> *> *)getUsersWithEmails:(NSArray<NSString *> *)emails page:(QBGeneralResponsePage *)page;
按Facebook ID获取用户
- (BFTask<NSArray<QBUUser *> *> *)getUsersWithFacebookIDs:(NSArray<NSString *> *)facebookIDs;
按Facebook ID(带扩展分页参数)获取用户
- (BFTask<NSArray<QBUUser *> *> *)getUsersWithFacebookIDs:(NSArray<NSString *> *)facebookIDs page:(QBGeneralResponsePage *)page;
按登录名获取用户
- (BFTask<NSArray<QBUUser *> *> *)getUsersWithLogins:(NSArray<NSString *> *)logins;
按登录名(带扩展分页参数)获取用户
- (BFTask<NSArray<QBUUser *> *> *)getUsersWithLogins:(NSArray<NSString *> *)logins page:(QBGeneralResponsePage *)page;
### 搜索用户
按全名搜索用户
- (BFTask<NSArray<QBUUser *> *> *)searchUsersWithFullName:(NSString *)searchText;
按全名(带扩展分页参数)搜索用户
- (BFTask<NSArray<QBUUser *> *> *)searchUsersWithFullName:(NSString *)searchText page:(QBGeneralResponsePage *)page;
按标签搜索用户
- (BFTask<NSArray<QBUUser *> *> *)searchUsersWithTags:(NSArray<NSString *> *)tags;
按标签(带扩展分页参数)搜索用户
- (BFTask<NSArray<QBUUser *> *> *)searchUsersWithTags:(NSArray<NSString *> *)tags page:(QBGeneralResponsePage *)page;
QMUsersMemoryStorage
此类负责内存中用户存储。
用于获取 UsersMemoryStorage 用户ID的执行代理。
@property (weak, nonatomic) id <QMUsersMemoryStorageDelegate> delegate;
添加用户
将用户添加到内存存储中。
- (void)addUser:(QBUUser *)user;
将用户添加到内存存储中。
- (void)addUsers:(NSArray<QBUUser *> *)users;
获取用户
按不排序的方式从内存存储中获取所有用户。
- (NSArray<QBUUser *> *)unsortedUsers;
按密钥对内存存储中的所有用户进行排序并获取。
- (NSArray<QBUUser *> *)usersSortedByKey:(NSString *)key ascending:(BOOL)ascending;
按密钥对内存存储中的所有联系人进行排序并获取。
- (NSArray *)contactsSortedByKey:(NSString *)key ascending:(BOOL)ascending;
获取不带某些ID的用户ID。
- (NSArray<QBUUser *> *)usersWithIDs:(NSArray *)IDs withoutID:(NSUInteger)ID;
获取由用戶全名组成的字符串,以逗号分隔。
- (NSString *)joinedNamesbyUsers:(NSArray *)users;
按用户ID获取用户。
- (QBUUser *)userWithID:(NSUInteger)userID;
按用户ID获取用户。
- (NSArray<QBUUser *> *)usersWithIDs:(NSArray *)ids;
按用户登录名获取用户。
- (NSArray<QBUUser *> *)usersWithLogins:(NSArray<NSString *> *)logins;
按用户电子邮件获取用户。
- (NSArray<QBUUser *> *)usersWithEmails:(NSArray<NSString *> *)emails;
获取具有用户Facebook ID的用户。
- (NSArray<QBUUser *> *)usersWithFacebookIDs:(NSArray<NSString *> *)facebookIDs;
搜索和排除
搜索排除具有用户ID的用户。结果字典将包含找到的用户数组和未找到的搜索标准数组(ID、登录名、电子邮件等)。
- (NSDictionary *)usersByExcludingUsersIDs:(NSArray<NSNumber *> *)ids;
搜索排除具有登录名用户。
- (NSDictionary *)usersByExcludingLogins:(NSArray<NSString *> *)logins;
搜索排除具有电子邮件用户。
- (NSDictionary *)usersByExcludingEmails:(NSArray<NSString *> *)emails;
搜索排除具有Facebook ID用户。
- (NSDictionary *)usersByExcludingFacebookIDs:(NSArray<NSString *> *)facebookIDs;
文档
更多信息请参阅我们的内联代码文档。