Ios Swift-awscognitofacebook登录

Ios Swift-awscognitofacebook登录,ios,swift,facebook,amazon-web-services,amazon-cognito,Ios,Swift,Facebook,Amazon Web Services,Amazon Cognito,我想在Cognito中使用Facebook进行登录,我已经阅读了大量AWS文档,并查看了Stackoverflow中的教程和问题,但我还没有找到解决问题的方法 当用户打开应用程序时,它将检查用户是否使用IdentityManager登录。如果没有,它将打开一个新视图,用户可以使用Facebook SDK使用Facebook登录。之后,我使用自定义标识Provider存储了令牌,如文档所述(credentialsProvider.logins不推荐使用)。看起来一切正常,但每次我重新打开应用程序时

我想在Cognito中使用Facebook进行登录,我已经阅读了大量AWS文档,并查看了Stackoverflow中的教程和问题,但我还没有找到解决问题的方法

当用户打开应用程序时,它将检查用户是否使用IdentityManager登录。如果没有,它将打开一个新视图,用户可以使用Facebook SDK使用Facebook登录。之后,我使用自定义标识Provider存储了令牌,如文档所述(credentialsProvider.logins不推荐使用)。看起来一切正常,但每次我重新打开应用程序时,我的会话都不会恢复

我发现如果我使用
AWSIdentityManager.defaultIdentityManager().resumeSessionWithCompletionHandler(handler)
我恢复了会话,但是如果用户没有登录,它不会像预期的那样显示我的自定义登录屏幕,而是显示Facebook的Safari web视图

这是我的密码:

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)
}
@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)
    }
}
登录查看控制器。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)
}
@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)
    }
}

显然,我的问题是我在AppDelegate.swift中调用了IdentityManager.loggedIn,所以我将其移动到主视图控制器上的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()
        }
    }
}