1

Ich setze den Root-View-Controller meines Fensters sofort als Login-Controller ein und der Login-Controller prüft die Benutzerauthentifizierung von Firebase. Wenn der Benutzer angemeldet ist, ändert der Controller den Root-View-Controller als Feed-Controller. Ansonsten läuft der Login-Controller wie er selbst ab.Swift Firebase prüft die Authentifizierung reibungsloser

class LoginController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let uid = Auth.auth().currentUser?.uid { 

      Database.database().reference().child("users").observeSingleEvent(of: .value, with: { snapshot in 
       if snapshot.hasChild(uid) { 
        AppDelegate.launchApplication() 
       } 
       else { 
        self.setUpUI() 
       } 
      }) 

     } 
     else { 
      self.setUpUI() 
     } 

    } 
... 
} 

wo launchApplication

class func launchApplication() { 
    guard let window = UIApplication.shared.keyWindow else { return } 
    window.rootViewController = UINavigationController(rootViewController: FeedController()) 
} 

Neben if let uid = Auth.auth().currentUser?.uid ist, ich überprüfen, ob die uid (wenn es nicht nil ist) existiert in meiner Datenbank, weil ich die Situation gehabt haben, wo ein gelöschter Benutzer war immer noch nicht nil.

Das Problem ist, dass nach dem Startbildschirm, gibt es einen Moment, wenn der Login-Controller, obwohl leer, sichtbar ist. Manchmal dauert dieser Moment ein paar Sekunden. Wie kann ich die Authentifizierung so überprüfen, dass der Login-Controller überhaupt nicht sichtbar ist, sodass die App sofort nach dem Verschwinden des Startbildschirms entscheidet, wie weiter verfahren wird? Vielen Dank.

+0

haben Sie gerade versucht, von Appdelegate zu präsentieren? Es passiert, weil Sie zuerst loginController initialisieren, weshalb Residuen angezeigt werden. –

Antwort

0

Statt einen Code ändern, habe ich einfach den Hintergrund der Login-Controller setzen Sie den Startbildschirm entsprechen:

class LoginController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // here 
     let background_image_view = UIImageView(image: #imageLiteral(resourceName: "launch_screen_background")) 
     background_image_view.frame = self.view.frame 
     self.view.addSubview(background_image_view) 

     if let uid = Auth.auth().currentUser?.uid { 

      Database.database().reference().child("users").observeSingleEvent(of: .value, with: { snapshot in 
       if snapshot.hasChild(uid) { 
        AppDelegate.launchApplication() 
       } 
       else { 
        self.setUpUI() 
       } 
      }) 

     } 
     else { 
      self.setUpUI() 
     } 

    } 
... 
} 

Es gibt keinen merklichen Übergang vom Startbildschirm zum Login-Controller.

0

Als schnelle Lösung, könnten Sie versuchen nur den gewünschten "users" Kind-Knoten überprüft (und nicht den kompletten Zweig). Zum Beispiel:

Dies könnte Ihre Verzögerung erheblich verringern, wenn Ihre Datenbank viele Benutzer enthält.

Wenn das nicht genug ist, dann kann man auch diese Logik Sie AppDelegate Klasse betrachten bewegen und zeigen Sie Ihre LoginController von dort (und vielleicht holding off your launch screen a little longer, bis Sie herausfinden, ob ein Benutzer zur Verfügung steht).

+0

Warum funktioniert die Überprüfung des 'user'-Knotens alleine? –

+0

@ArchieGertsman Sie überprüfen * nur * einen einzigen Benutzer in Ihrem ursprünglichen Code: 'snapshot.hasChild (uid)'. Dies sollte gut funktionieren, aber möglicherweise nicht gut skalieren, da Sie unnötigerweise den Zweig * complete * 'users 'ebenfalls herunterladen;) –

0

1) Verwenden Sie diesen folgenden Code für den Fall, wenn Sie einen rootController vom App-Delegaten selbst festlegen möchten. Verwenden Sie eine Prüfung, wenn Ihre currentUser.uid nicht Null ist und mit Werten in der Datenbank übereinstimmt, dann führen Sie folgenden Code in DidFinishLaunchingWithOptions von Appdelegate. Wird von mir

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 
    // Override point for customization after application launch. 

    FirebaseApp.configure() 
    GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID 



    if let uid = Auth.auth().currentUser?.uid { 

     Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { snapshot in 
      if snapshot.exist() { 
       let storyBoard = UIStoryboard.init(name: "Main", bundle: nil) 
       let vc = storyBoard.instantiateViewController(withIdentifier: "feedController") as! FeedController 

       self.window?.rootViewController=vc 
       self.window?.makeKeyAndVisible() 
      } 
      else { 
       //Present your loginController here 
      } 
     }) 

    } 

    return true 
} 

2) Methode: wenn Sie Ihre logincontroller initialisiert hatte stattdessen eine Funktion aus AppDelegate oder Code in der Launchapplication aufrufen. machen eine Funktion in Login-Klasse und schreiben Sie den folgenden Code bei Bedarf Parameter angepasst werden

var transition: UIViewAnimationOptions = .transitionFlipFromLeft 
let rootviewcontroller: UIWindow = ((UIApplication.shared.delegate?.window)!)! 
     rootviewcontroller.rootViewController = self.storyboard?.instantiateViewController(withIdentifier: "rootnav")//rootnav is Storyboard id of my naviagtionController attached to the DestinationController [FeedController] 
     let mainwindow = (UIApplication.shared.delegate?.window!)! 
     mainwindow.backgroundColor = UIColor(hue: 0.6477, saturation: 0.6314, brightness: 0.6077, alpha: 0.8) 
     UIView.transition(with: mainwindow, duration: 0.55001, options: transition, animations: {() -> Void in 
     }) { (finished) -> Void in 

     } 
+0

Sie werden wahrscheinlich die Einstellung für die Standardansicht entfernen wollen: Im Attribute-Inspector gibt es das ein Kontrollkästchen für * Ist der Initial View Controller *. Deaktivieren Sie dies, damit Sie die Ansicht im Code ermitteln können. – Jay

Verwandte Themen