我有一个简单的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用户已失效。完成此任务的最佳做法是什么?在所有示例中,密码都是硬编码的。这似乎不是一个很好的解决方案。
答案 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")
}
}
}