【问题标题】:QuickBlox - QBChatDialogTypePublicGroup : Dialog have to be in memory cacheQuickBlox - QBChatDialogTypePublicGroup:对话框必须在内存缓存中
【发布时间】:2017-09-21 19:34:13
【问题描述】:

你好朋友,我用QuickBlox 创建了一个应用程序。我要从管理面板创建一个 10 QBChatDialogTypePublicGroup。它是静态的。

我想从quickblox 管理面板创建静态公共组并与该组中的任何用户聊天。

我在 viewController 中获取所有组并显示它。然后用户可以选择任何组公开聊天。

我正在使用 quickblox 框架与用户聊天。我完成了QBChatDialogTypePrivate 一对一的用户作弊。

登录:

- (void)loginWithQuickBlox{

    NSString *emaiAddress = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserLogin"];
    NSString *password = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserPassword"];

    [QBRequest logInWithUserLogin:emaiAddress password:password successBlock:^(QBResponse *response, QBUUser *user)
     {
         [[NSUserDefaults standardUserDefaults]setObject:[NSString stringWithFormat:@"%ld",(unsigned long)user.ID] forKey:@"USerLoginID"];
         [self loginWithQuickBloxChat:user];

     } errorBlock:^(QBResponse *response)
     {
         // error handling
         NSLog(@"errorsssss : %@", response.error);
     }];
}

使用 QuickBloxChat 登录

- (void)loginWithQuickBloxChat:(QBUUser *)selectedUser {

    QBUUser *selectedUserx = [QBUUser user];
    selectedUserx.login = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserLogin"];
    selectedUserx.password = [[NSUserDefaults standardUserDefaults] objectForKey:@"UserPassword"];
    selectedUserx.ID = [[[NSUserDefaults standardUserDefaults] objectForKey:@"USerLoginID"] integerValue];

    NSLog(@"Currunt User  : %@", [QBSession currentSession].currentUser);

    [ServicesManager.instance logInWithUser:selectedUserx completion:^(BOOL success, NSString *errorMessage)
    {
        [[QBChat instance] connectWithUser:selectedUserx completion:^(NSError * _Nullable error) {

        }];

         if (success)
         {
             NSLog(@"Login in Quickblox : %@",selectedUser);
             [self getPublicGroup];
         }
         else
         {
             NSLog(@"Error in QuickBlox : %@",errorMessage);
         }
    }];
}

获取公共组

- (void)getPublicGroup {

     NSMutableDictionary *extendedRequest = @{@"type" : @(1)}.mutableCopy;
     QBResponsePage *page = [QBResponsePage responsePageWithLimit:100 skip:0];
     [QBRequest dialogsForPage:page extendedRequest:extendedRequest successBlock:^(QBResponse *response, NSArray *dialogObjects, NSSet *dialogsUsersIDs, QBResponsePage *page) {
     publicGroupArray = dialogObjects.mutableCopy;
     NSLog(@"Public Group : %@",publicGroupArray);
     [self.groupCollectionview reloadData];

    } errorBlock:^(QBResponse *response) {

    }];
}

选择任何一个群组并使用 ChatViewcontroller 聊天

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    QBChatDialog *groupChatDialog = [publicGroupArray objectAtIndex:indexPath.row];
    ChatViewController *chatViewController = [[ChatViewController alloc] init];
    chatViewController.dialog = groupChatDialog;
    chatViewController.hidesBottomBarWhenPushed = YES;
    [self.navigationController pushViewController:chatViewController animated:YES];
}

所有程序都运行良好,但是当我从ChatViewController 发送消息时,它会给我错误

-[QMChatService 中的断言失败 sendMessage:toDialogID:saveToHistory:saveToStorage:completion:], All/September/21/ChatApp/Pods/QMServices/QMChatService/QMChatService/QMChatService.m:1338

由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'对话框必须在 内存缓存! *** 首先抛出调用栈:

【问题讨论】:

    标签: ios objective-c quickblox


    【解决方案1】:

    您正在尝试将核心 SDK 方法与 QMServices 的方法结合起来。

    QBRequest 是 Quickblox SDK 的一部分,QMServices 是用于聊天功能的高级 API,包括:

    1. 用于登录 Quickblox REST 和 XMPP 的身份验证服务。
    2. 用于消息、对话框和用户的收件箱持久性和内存存储。

    如果您想使用 QMServices 获取对话框,请尝试以下方法:

    - (void)loadDialogWithID:(NSString *)dialogID completion:(nullable void (^)(QBChatDialog * _Nullable loadedDialog))completion;
    

    例子:

    [ServicesManager.instance.chatService loadDialogWithID:dialogID
                                                    completion:^(QBChatDialog * _Nullable loadedDialog)
     {
    
    }];
    

    此方法将从服务器加载对话框,加入它(如果对话框的类型是组)并存储在内存和CoreDate中。

    如果您想使用 SDK 的核心方法获取对话框,您应该自己实现所有描述的操作。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2014-08-02
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多