5

Ich versuche Google Login von AppDelegate.swift zu starten und starte dann den Hauptbildschirm meiner App nach erfolgreichem Login.iOS firebase: FIRAuthUIDelegate.authUI wird nicht aufgerufen

enter image description here

Ich bin in der Lage zu

  1. zeigen die Login google Knopf oben, wie gezeigt

  2. der Benutzer gesendet in

  3. der Benutzer anmelden Google zurück zum Original gesendet (Schritt 1) ​​

Nach Schritt 3. Ich möchte den Benutzer auf die Hauptseite meiner App senden.

Mein Code ist unten. Das Problem, das ich habe, ist, dass authUI nicht aufgerufen wird.

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, FIRAuthUIDelegate { 
    var window: UIWindow? 
    var authUI: FIRAuthUI? 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     FIRApp.configure() 

     authUI = FIRAuthUI.defaultAuthUI() 
     authUI?.delegate = self 
     let providers: [FIRAuthProviderUI] = [FIRGoogleAuthUI()] 
     authUI?.providers = providers 

     // show google login button 
     let authViewController = authUI?.authViewController() 
     self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
     self.window?.rootViewController = authViewController 
     self.window?.makeKeyAndVisible() 
     return true 
    } 

    func application(application: UIApplication, openURL url: NSURL, options: [String: AnyObject]) -> Bool { 
     return GIDSignIn.sharedInstance().handleURL(url, sourceApplication: options[UIApplicationOpenURLOptionsSourceApplicationKey] as? String, annotation: options[UIApplicationOpenURLOptionsAnnotationKey]) 
    } 

    func authUI(authUI: FIRAuthUI, didSignInWithUser user: FIRUser?, error: NSError?) { 
     // launch main view controller 
    } 
} 

EDIT: Dies scheint ein Duplikat another question zu sein. Der Titel der anderen Frage ist ziemlich allgemein gehalten und kommt nur ein paar Zeilen tief in die Details. Auf jeden Fall glaube ich, dass Chris Antwort gründlicher ist als die dort. Ich denke, sowohl die Frage als auch die Antworten hier sind klarer, pointierter und gründlicher, so dass es ein Fehler wäre, Leute hierher zu verweisen, um dorthin zu gehen, was passieren würde, wenn dies als Duplikat gekennzeichnet wäre.

+0

Verwenden Sie Storyboard? –

+0

@Tarvo, ja, ich bin – lf215

+0

Wenn Sie sagen, dass Ihre AuthUI nicht aufgerufen wird, meinen Sie die AuthUI-Delegiertenmethode ja? – Chris

Antwort

5

Ich denke, Ihr Problem liegt here, in der - (void)signInWithProviderUI:(id<FIRAuthProviderUI>)providerUI Methode.

Die Delegate-Methode wird im Completion-Block dismissViewControllerAnimated:completion: aufgerufen.

[self.navigationController dismissViewControllerAnimated:YES completion:^{ 
     [self.authUI invokeResultCallbackWithUser:user error:error]; 
     }]; 

As you can see von dem Apple-docs, wird diese Methode erwartet auf einem modal präsentiert Viewcontroller aufgerufen werden. Sie zeigen es als Root-View-Controller an. Versuchen Sie, es mit einem Modal von UIViewController anzuzeigen, und die Dinge sollten funktionieren. Um dies zu debuggen, versuchen Sie einen Haltepunkt bei line 193 zu setzen, um zu sehen, dass er nicht getroffen wird. Ich wäre sehr überrascht, wenn dies nicht funktioniert, wenn Sie den AuthController modal anzeigen.

Um eine mögliche Lösung für Ihr Problem zu finden (ich nehme an, Sie möchten sicherstellen, dass ein Benutzer angemeldet ist, bevor Sie Ihre App verwenden). Das Folgende ist eine Vereinfachung dessen, was ich gerade in einer App verwende.

BEARBEITEN: Für die neue 1.0.0 FirebaseUI-Syntax aktualisiert.

class MainTabController: UITabBarController, FIRAuthUIDelegate { 

    let authUI: FUIAuth? = FUIAuth.defaultAuthUI() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     var authProviders = [FUIFacebookAuth(), FUIGoogleAuth()] 
     authUI.delegate = self 
     authUI.providers = authProviders 

     //I use this method for signing out when I'm developing 
     //try! FIRAuth.auth()?.signOut() 

    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 

     if !isUserSignedIn() { 
      showLoginView() 
     } 
    } 

    private func isUserSignedIn() -> Bool { 
     guard FIRAuth.auth()?.currentUser != nil else { return false } 
     return true 
    } 

    private func showLoginView() { 
     if let authVC = FUIAuth.defaultAuthUI()?.authViewController() { 
     present(authVC, animated: true, completion: nil) 
     } 
    } 
    func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) { 
     guard let user = user else { 
      print(error) 
      return 
     } 

     ... 
    } 
+0

Können Sie den obigen Code in Ziel c tun? http://StackOverflow.com/Questions/42340641/Firauthuidelegate-authui-not-being-in-objective-c – shamila

+1

Angst nicht @S.Slay:/ – Chris

+0

Ran in ein Problem hier, wo versucht, AuthUI zu FUIAuth. defaultAuthUI() Die Art und Weise, wie Sie eine Ausnahme verursacht haben, weil sie vor der in applicationDidFinishLaunchingWithOptions ausgeführten FirebaseApp.configure() -Methode ausgeführt wurde. Ein bisschen seltsam, aber das Initialisieren des Wertes in viewDidLoad() behebt das Problem für mich. – Cognitio

1

Es muss ein Problem der Referenz sein.

class AppDelegate: UIResponder, UIApplicationDelegate, FIRAuthUIDelegate { 
    var window: UIWindow? 
    let authUI = FIRAuthUI.defaultAuthUI() 

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 
     FIRApp.configure() 

     authUI.delegate = self 
     let providers: [FIRAuthProviderUI] = [FIRGoogleAuthUI()] 
     authUI.providers = providers 

     // show google login button 
     let authViewController = authUI.authViewController() 
     self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
     self.window?.rootViewController = authViewController 
     self.window?.makeKeyAndVisible() 
     return true 
    } 
} 

Versuchen Sie es. AppDelegate wird die Referenz authUI und seine delegate halten.

+0

machen die genaue Änderung, die Sie geschrieben haben, "let authUI = FIRAuthUI.defaultAuthUI()' verursacht 'authUI', um nil zu sein, was dazu führte," Anwendungen werden erwartet, einen Root-View-Controller am Ende des Anwendungsstarts zu haben ". Ich habe meinen Code geändert, indem ich die Referenz auf eine höhere Stufe gezogen habe **, aber "authUI" wird immer noch nicht ausgeführt **. – lf215

+0

Die Warnung bedeutet nicht, dass authUI gleich null ist. Das bedeutet, dass das Fenster nicht rootViewController hat, bis der Start der Anwendung abgeschlossen ist. Es gibt zwei Möglichkeiten. Einer ist 'authUI.authViewController()' gibt nil zurück und die andere Möglichkeit ist 'authUI.authViewController()' ist asynchron und dauert zu lange. Überprüfen Sie, dass 'authUI.authViewController()' 'return nicht null ist. – Ryan

Verwandte Themen