QuickBlox视频聊天:QBRequest.logInWithUserEmail vs QBChat.instance()。connectWithUser

时间:2016-05-09 22:53:35

标签: ios swift webrtc quickblox

我有一个简单的QuickBlox聊天应用程序,它遵循iOS教程:

http://quickblox.com/developers/Sample-webrtc-ios#Sources

我已成功创建用户并将其登录。但是,当我尝试启动会话时遇到错误:"您必须登录才能使用聊天API&#34 ;。

    let newSession: QBRTCSession = QBRTCClient.instance().createNewSessionWithOpponents(["12498970"], withConferenceType: QBRTCConferenceType.Video)

我可以通过每次打开它时添加QBChat.instance()。connectWithUser来解决此问题:

    QBChat.instance().connectWithUser(user!) { (error) in
        if error != nil {
            print("error: \(error)")
        }
        else {
            print("login to chat succeeded")
        }
    }

但不知何故,这似乎很奇怪,因为我必须缓存密码或提示用户每次打开应用程序时输入密码。奇怪的是,QBSession.currentSession()。currentUser仍然有效,但QBChat用户已失效。完成此任务的最佳做法是什么?在所有示例中,密码都是硬编码的。这似乎不是一个很好的解决方案。

1 个答案:

答案 0 :(得分:0)

我最后在Q-municate中使用了一些示例,这是Quickblox人员为基本演示整个软件包而构建的应用程序,并为您的聊天需求提供实际解决方案。我有一些其他自定义的东西,并不需要很多功能,所以我仍然试图挖掘他们如何实现它的细节。 Q-municate的链接:

http://quickblox.com/developers/Q-municate#1._Get_the_source_code

在他们的登录流程中,他们使用为Q-municate编写的QMApi模块:

    [[QMApi instance] loginWithEmail:email
                            password:password
                          rememberMe:weakSelf.rememberMeSwitch.on
                          completion:^(BOOL success)
     {
         [SVProgressHUD dismiss];

         if (success) {
             [[QMApi instance] setAutoLogin:weakSelf.rememberMeSwitch.on
                            withAccountType:QMAccountTypeEmail];
             [weakSelf performSegueWithIdentifier:kTabBarSegueIdnetifier
                                           sender:nil];
         }
     }];

在loginWithEmail中,他们的settingsManager缓存此登录信息:

            [weakSelf.settingsManager setLogin:email andPassword:password];

这实际上只是一种在SSKeyChain中缓存密码的方法。

[SSKeychain setPassword:password forService:kQMAuthServiceKey account:login];

稍后,当您返回应用时,他们会调用自动登录:

if (!self.isAuthorized) {
    if (self.settingsManager.accountType == QMAccountTypeEmail && self.settingsManager.password && self.settingsManager.login) {

        NSString *email = self.settingsManager.login;
        NSString *password = self.settingsManager.password;

        [self loginWithEmail:email password:password rememberMe:YES completion:completion];
    }
    else if (self.settingsManager.accountType == QMAccountTypeFacebook) {

        [self loginWithFacebook:completion];
    }
    else {

        if (completion) completion(NO);
    }
}
else {
    if (completion) completion(YES);
}

其中self.settingsManager.password从SSKeychain中提取密码:

NSString *password = [SSKeychain passwordForService:kQMAuthServiceKey account:self.login];
加载主聊天选项卡时,将调用

autoLogin。这就是我们对connectToChat的经典调用:

[[QMApi instance] autoLogin:^(BOOL success) {
    if (!success) {

        [[QMApi instance] logoutWithCompletion:^(BOOL succeed) {
            //
            [weakSelf performSegueWithIdentifier:@"SplashSegue" sender:nil];
        }];

    } else {

        // subscribe to push notifications
        [[QMApi instance] subscribeToPushNotificationsForceSettings:NO complete:^(BOOL subscribeToPushNotificationsSuccess) {

            if (!subscribeToPushNotificationsSuccess) {
                [QMApi instance].settingsManager.pushNotificationsEnabled = NO;
            }
        }];

        [weakSelf connectToChat];
    }
}];

从技术上讲,每次应用程序打开并且聊天不再连接时,通过登录聊天,文档正在做正确的事情。存储密码只是一种更复杂但更安全的方式,因此用户无需重新输入密码。

TLDR:它在我的代码(以及swift)中的工作方式是:

登录时:

    QBRequest.logInWithUserEmail(email, password: password, successBlock: { (response, user) in
        SSKeychain.setPassword(password, forService: "kMyAppLoginServiceKey", account: email)

        }) { (errorResponse) in
            print("Error: \(errorResponse)")
            self.simpleAlert("Could not log in", defaultMessage: nil,  error: nil)
    }

每当加载聊天视图时:

    if !QBChat.instance().isConnected() {
        QBRTCClient.initializeRTC()
        QBRTCClient.instance().addDelegate(self)

        let user = QBSession.currentSession().currentUser
        let password = SSKeychain.passwordForService("kMyAppLoginServiceKey", account: user?.email!)
        user!.password = password
        QBChat.instance().addDelegate(self)
        QBChat.instance().connectWithUser(user!) { (error) in
            if error != nil {
                print("error: \(error)")
            }
            else {
                print("login to chat succeeded")
            }
        }
    }