QMServices 0.6.2

QMServices 0.6.2

测试已测试
Lang语言 Obj-CObjective C
授权 BSD-3-Clause
发布最后发布2018年5月

Andrey ivanovVitaliy GorbachovStan ShaforenkoIllia Chemolosov维护。



 
依赖
QuickBlox>= 2.17
Bolts>= 1.9.0
 

  • 作者
  • Andrey Ivanov,Vitaliy Gorbachov和Vitaliy Gurkovsky

CocoaPods CocoaPods CocoaPods

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 缓存,您可以使用继承自 QMDBStorageQMContactListCacheQMChatCacheQMUsersCache,您也可以使用自己的数据库存储 - 只需根据您的需要实现 QMChatServiceDelegateQMContactListServiceDelegateQMUsersServiceDelegate 即可。

入门

#import <QMServices.h> 添加到您的应用程序的 .pch 文件中。

服务管理器

要使用服务,您可以使用现有的 QMServicesManager 类或其他从其创建的子类。下面是 QMServicesManager 类的详细说明。

QMServicesManager 有两个功能 - 用户登录(登录到 REST API、聊天)/登出(从聊天、REST API 登出、清除持久和内存缓存);在 QMChatCacheQMChatService 之间建立连接,以便能够在磁盘上存储对话框和消息数据。

以下是 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;

文档

更多信息请参阅我们的内联代码文档。

许可证

LICENSE.txt