2016-05-09 4 views
1

У меня есть простое приложение QuickBlox чат, построенный после IOS учебника:.QuickBlox видео чат: QBRequest.logInWithUserEmail против QBChat.instance() connectWithUser

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

Я успешно создал и войти они возникают. Однако при попытке инициировать сеанс я столкнулся с ошибкой: «Вы должны войти в систему, чтобы использовать Chat 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-муника:

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

В их входа в потоке, они используют модуль QMApi, написанный для Q-municate:

[[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: Как это работает в моем коде (и в Свифт) составляет:

На входе:

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") 
      } 
     } 
    } 
Смежные вопросы