2016-03-31 6 views
0

Ich habe eine App, die sich erfolgreich mit dem Facebook-Provider über AWS Cognito anmelden. Bei der Verwendung der App direkt nach dem Login kann die Identität abgerufen werden und alles scheint gut zu funktionieren.IdentityId ist Nil mit AWS Cognito und Facebook Login in iOS-App

Nach einiger Zeit (ungefähr> 1 Stunde) scheint die Identitäts-ID jedoch nicht ausgefüllt zu sein. Was seltsam ist, ist, dass der Benutzername immer noch ausgefüllt ist - nur nicht die ID.

let identity = self.getLoggedInIdentity() 
    let id = identity?.identityId  //this is nil 
    let username = identity?.userName //this still has a value 

    func getLoggedInIdentity() -> AWSIdentityManager? { 
     if userIsLoggedIn() { 
      return AWSIdentityManager.defaultIdentityManager() 
     } 

     return nil 
    } 

    func userIsLoggedIn() -> Bool { 
     let identityManager = AWSIdentityManager.defaultIdentityManager() 
     return identityManager.loggedIn 
    } 

ich mit der AWS Beispielanwendung gestartet, einschließlich der AWSMobileHubHelper Rahmen, die automatisch vom AWS Mobile Hub erzeugt wird.

Ich glaube, das Problem ist, dass die Sitzung nicht wird erfolgreich als Abschluss Block wieder innerhalb dieser Funktion wird nie ausgelöst, nachdem die App Neubelebung:

func didFinishLaunching(application: UIApplication, withOptions launchOptions: [NSObject : AnyObject]?) -> Bool { 
    print("didFinishLaunching:") 

    if (!isInitialized) { 
     print("AWSIdentityManager Attempt Resume Session") 
     AWSIdentityManager.defaultIdentityManager().resumeSessionWithCompletionHandler({(result: AnyObject?, error: NSError?) -> Void in 
       print("AWSIdentityManager Resume Session Result: \(result) \n Error:\(error)") 
     }) 
     isInitialized = true 
    } 
    let didFinishLaunching: Bool = AWSIdentityManager.defaultIdentityManager().interceptApplication(application, didFinishLaunchingWithOptions: launchOptions) 

    return didFinishLaunching 
} 

ich überprüft haben, die Funktion bei der Neubelebung des App aufgerufen wird und der resumeSessionWithCompletionHandler wird aufgerufen, aber der Beendigungshandler wird nie ausgelöst und ich nehme an, dass die Sitzung nicht erfolgreich fortgesetzt wird.

Als Referenz hier sind die Erstanmeldung Funktionen auch:

@IBAction func handleFacebookLogin(sender: AnyObject) { 
    self.handleLoginWithSignInProvider(AWSFacebookSignInProvider.sharedInstance()) 
} 

func handleLoginWithSignInProvider(signInProvider: AWSSignInProvider) { 
    AWSIdentityManager.defaultIdentityManager().loginWithSignInProvider(signInProvider, completionHandler: {(result: AnyObject?, error: NSError?) -> Void in 
     // If no error reported by SignInProvider, discard the sign-in view controller. 
     if error == nil { 
      dispatch_async(dispatch_get_main_queue(),{ 
       self.dismissViewControllerAnimated(true, completion: nil) 
      }) 
     } 
     print("result = \(result), error = \(error)") 
    }) 
} 

Irgendwelche Ideen, warum ich in der Lage sein würde, zunächst und Verbindungen mit anderen AWS-Diensten anmelden, aber nicht in der Lage sein, die Sitzung nach einiger Zeit wieder aufnehmen ging vorbei?

+0

Können Sie die Implementierung von '- getLoggedInIdentity' und die Definition des' identity' Objekts teilen? Wie erhalten Sie die Cognito IdentityId vom SDK? –

+0

Ich habe den Beitrag so modifiziert, dass er die Funktion getLoggedInIdentity sowie die Funktionen enthält, die die Erstanmeldung durchführen. Das Identitätsobjekt ist optional vom Typ AWSIdentityManager, der ein Wrapper-Objekt im AWSMobileHubHelper-Framework ist. – outerstorm

+0

Wie wäre es mit der Definition von '- userIsLoggedIn'? Wir müssen den gesamten Anmeldefluss sehen, damit wir versuchen können, das Problem, das Sie sehen, zu reproduzieren. –

Antwort

0

Ich hatte das gleiche Problem. Ich habe das auf AppDelegate behoben. Haben Sie diesen Code implementiert?

func application(application: UIApplication,openURL url: NSURL,sourceApplication: String?,annotation: AnyObject?) -> Bool { 
    return FBSDKApplicationDelegate.sharedInstance().application(application, openURL: url, sourceApplication: sourceApplication, annotation: annotation) 
}