#ios #swift #facebook #amazon-web-services #amazon-cognito
#iOS #swift #Facebook #amazon -веб-сервисы #amazon-cognito
Вопрос:
Я хочу использовать Facebook для процесса входа в систему с помощью Cognito, и я изучил много документации AWS и посмотрел учебные пособия и вопросы в Stackoverflow, но я не нашел решения своей проблемы.
Когда пользователь открывает приложение, оно проверяет, вошел ли пользователь в систему с помощью IdentityManager. Если нет, откроется новое представление, в котором пользователь может войти в систему с помощью Facebook с помощью Facebook SDK. После этого я сохранил токен с пользовательским идентификатором IdentityProvider, как указано в документации (CredentialsProvider.logins устарел). Кажется, все работает нормально, но каждый раз, когда я снова открываю приложение, мой сеанс не восстанавливается.
Я обнаружил, что если я использую AWSIdentityManager.defaultIdentityManager().resumeSessionWithCompletionHandler(handler)
, я восстановил свой сеанс, но в случае, если пользователь не вошел в систему, он не отображает мой пользовательский экран входа в систему, как ожидалось, а веб-просмотр Safari на Facebook.
Вот мой код:
AppDelegate.swift
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let identityManager = AWSIdentityManager.defaultIdentityManager()
identityManager.resumeSessionWithCompletionHandler({
(result, error) -> Void in
if !identityManager.loggedIn {
let mainStoryboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewControlleripad : UIViewController = mainStoryboard.instantiateViewControllerWithIdentifier("SignIn") as UIViewController
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
self.window?.rootViewController = initialViewControlleripad
self.window?.makeKeyAndVisible()
}
})
return AWSMobileClient.sharedInstance.didFinishLaunching(application, withOptions: launchOptions)
}
SignInViewController.swift
@IBAction func openFacebookLoginScreen(sender: AnyObject) {
FBSDKLoginManager().logInWithReadPermissions(FACEBOOK_PERMISSIONS, fromViewController: self, handler: { (result, error) -> Void in
if error == nil {
let fbLoginResult : FBSDKLoginManagerLoginResult = result
if fbLoginResult.isCancelled {
print("Cancelled")
}
else {
if FBSDKAccessToken.currentAccessToken() != nil {
self.signInFacebook(FBSDKAccessToken.currentAccessToken().tokenString)
self.dismissSignInView()
}
}
}
})
}
func signInFacebook(fbToken: String){
let logins = [AWSIdentityProviderFacebook : fbToken]
let customProviderManager = CustomIdentityProvider(tokens: logins)
let credentialsProvider = AWSCognitoCredentialsProvider(
regionType:.USEast1,
identityPoolId: COGNITO_IDENTITY_POOL_ID,
identityProviderManager: customProviderManager)
let configuration = AWSServiceConfiguration(region:.USEast1, credentialsProvider: credentialsProvider)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
}
class CustomIdentityProvider: NSObject, AWSIdentityProviderManager {
var tokens : [NSString : NSString]?
init(tokens: [NSString : NSString]) {
self.tokens = tokens
}
@objc func logins() -> AWSTask {
return AWSTask(result: tokens)
}
}
Ответ №1:
По-видимому, моя проблема заключалась в том, что я вызывал IdentityManager.LoggedIn внутри AppDelegate.swift, поэтому я переношу его в viewDidLoad() на моем главном контроллере просмотра.
Также я изменил свой код входа на:
@IBAction func openFacebookLoginScreen(_: AnyObject) {
handleLoginWithSignInProvider(AWSFacebookSignInProvider.sharedInstance())
}
func handleLoginWithSignInProvider(signProvider: AWSSignInProvider){
AWSIdentityManager.defaultIdentityManager().loginWithSignInProvider(signProvider) { (result, error) in
if(error == nil){
let logins = [AWSIdentityProviderFacebook : FBSDKAccessToken.currentAccessToken().tokenString!]
let customProviderManager = CustomIdentityProvider(tokens: logins)
let credentialsProvider = AWSCognitoCredentialsProvider(
regionType:.USEast1,
identityPoolId: self.COGNITO_IDENTITY_POOL_ID,
identityProviderManager: customProviderManager)
let configuration = AWSServiceConfiguration(region:.USEast1, credentialsProvider: credentialsProvider)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
self.dismissSignInView()
}
}
}