2016-05-09 142 views
1

我有以下iOS的教程构建了一个简单QuickBlox聊天应用:QuickBlox视频聊天:QBRequest.logInWithUserEmail VS QBChat.instance()connectWithUser

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

我已经成功地创建了一个用户并登录。他们不过,我碰到一个错误,当我试图启动一个会话:“你必须按顺序使用聊天API被记录在”。 。

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

我想现在,我不完全得到登录情况。 SDK中的视频聊天示例仅使用QBChat.instance()。connectWithUser而不是QBRequest.logInWithUserLogin。仍然希望得到一些人的洞察力。 – mitrenegade

回答

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,其设定管理缓存此登录:

  [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]; 

自动登录时调用主聊天标签被加载。这使得我们的经典调用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") 
      } 
     } 
    }