2016-03-26 15 views
4

Vielen Dank im Voraus für Ihre Hilfe!Segue wird nicht ausgelöst nach Facebook Login mit Swift

Ich implementiere Facebook Login auf einer schnellen App, die ich schreibe, und ich habe einige Probleme, ein Segment nach dem Login abgeschlossen.

Im Rahmen FBSDKLoginButtonDelegate, ich habe zwei Methoden:

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: 
FBSDKLoginManagerLoginResult!, error: NSError!) 
    {} 

und

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) 
    {} 

Die Login-Button korrekt implementiert ist, kann ich Berechtigungen/FB-Token lesen, und übergeben diese an Amazon Cognito.

Die seltsame Sache ist jedoch, dass ich nicht programmgesteuert aus dem Login, in eine andere Ansicht (Controller) segue kann.

Das Drücken der FB-Login-Schaltfläche führt den Benutzer zu einem Webbrowser (das Facebook SDK erledigt dies alles), und die Anmeldung findet statt.

Wenn ich Platz ein Segue, wie:

dispatch_async(dispatch_get_main_queue(), { 
     self.performSegueWithIdentifier("segueLoginViewtoHome", sender: nil }) 

in loginButton(), es nie wirklich ausführt (dh, wenn der Web-Browser weggeht, kann der Benutzer auf die Ansicht mit der Login-Button zurückgeführt wird, nicht die neue Ansicht, die durch den Übergang beabsichtigt ist). Ich glaube, dass die Zeile ausgeführt wird, bevor das Browserfenster zu der Ansicht mit der Login-Schaltfläche (und dem Segment) zurückkehrt, aber ich habe keine Ahnung, wie ich dem Programm sagen soll, dass es die einzige aktive und sichtbare Ansicht sein soll Führe den Übergang durch.

Ich glaube, das ist der Fall, denn wenn ich den gleichen segue-Code in loginButtonDidLogOut() setzen würde, wo kein Wechsel zu einem Browser erforderlich ist, wird der Übergang gut ausgeführt, nachdem "Abmelden" im Blatt gedrückt wurde das gleitet von der Unterseite des Bildschirms nach oben.

Dieser Ansichtssteuerungs-Controller ist korrekt als Delegierter eingestellt, wie durch den korrekten Betrieb des Segments gezeigt wird, wenn der Code beim Abmelden codiert wird.

Jede Hilfe wäre sehr willkommen, Entschuldigung für die lange Frage, und danke!

Antwort

12

Ich habe dieses Problem behoben, indem ich einen globalen Booleschen Wert namens fbLoginSuccess initialisiert auf false erstellt habe. Wenn der Facebook-Login erfolgreich war, dann setze ich fbLoginSuccess auf true, wo du dein Segment ausführst. Dann überschreibe ich viewDidAppear() und führe das Segment dort durch, wenn fbLoginSuccess wahr ist. Dies behebt es, weil viewDidAppear() nach der Rückkehr vom Browser-Fenster ausgeführt wird, was Sie wollen.

var fbLoginSuccess = false 

override func viewDidAppear(animated: Bool) { 
    if (FBSDKAccessToken.currentAccessToken() != nil && fbLoginSuccess == true) 
    { 
     performSegueWithIdentifier("loginSegue", sender: self) 
    } 
} 

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 
    print("User Logged In") 

    if ((error) != nil) { 
     // Process error 
     print(error) 
    } 
    else if result.isCancelled { 
     // Handle cancellations 
    } 
    else { 
     fbLoginSuccess = true 
     // If you ask for multiple permissions at once, you 
     // should check if specific permissions missing 
     if result.grantedPermissions.contains("email") { 
      // Do work 
     } 
    } 
} 

Hoffe es hilft!

+0

Perfect-- Aufruf von viewDidAppear war genau die Methode, die ich brauchte. Danke für die Hilfe! – kmypwn

+0

Eine seltsame Sache, die ich bemerkte, obwohl - wenn der Benutzer den Code-Generator verwenden muss, um sich anzumelden, wird der Übergang nicht auftreten. Irgendwelche Ideen? – kmypwn

+0

Ich bin froh, dass ich helfen konnte. Was meinst du mit Code-Generator? Kannst du mir ein Beispiel geben? –

0

Ich habe nicht genug Reputation um zu kommentieren, aber ändere deinen 'ODER' Komparator '||' AND '& &' bei der Überprüfung, ob die Anmeldung erfolgreich war und das Token war nicht für mich nil gearbeitet. Ansonsten würde ich segeln, egal ob sie sich eingeloggt haben oder nicht. Könnte nur mein Problem gewesen sein, aber hoffe das hilft jemand anderem.