2016-10-01 116 views
0

我想使用Facebook进行Cognito登录流程,并且我遵循了很多AWS文档,并查看了Stackoverflow中的教程和问题,但是我没有找到解决方案我的问题。Swift - AWS Cognito-Facebook登录

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

我发现如果我使用AWSIdentityManager.defaultIdentityManager().resumeSessionWithCompletionHandler(handler)我恢复了我的会话,但万一用户没有登录,它不会按预期显示我的自定义登录屏幕,而是显示到Facebook的Safari网页浏览。

这里是我的代码:

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

显然,我的问题是,我是里面的AppDelegate调用IdentityManager.loggedIn .swift,所以我把它移到我的主视图c中的viewDidLoad() ontroller。

此外,我改变了我的登录代码:

@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() 
     } 
    } 
}