Я закончил с примерами в 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")
}
}
}
Я думаю прямо сейчас, когда я не совсем понимаю ситуацию входа в систему. В примере видеочата в SDK используется только QBChat.instance(). ConnectWithUser, а не QBRequest.logInWithUserLogin. Все еще надеялся на некоторое понимание того, кто это сделал. – mitrenegade