1

私は自分のウィンドウのルートビューコントローラをバットオフのログインコントローラとして設定しています。ログインコントローラはFirebaseからのユーザ認証をチェックします。ユーザーがログインしている場合、コントローラーはルートビューコントローラーをフィードコントローラーに変更します。それ以外の場合、ログインコントローラはそれ自体として処理を続けます。Swift Firebaseがよりスムーズに認証を確認します

launchApplicationif let uid = Auth.auth().currentUser?.uidに加えて

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

で、私は状況があったので、uidは(それがnilない場合)、私のデータベースに存在するかどうかをチェックしてい

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

    } 
... 
} 

削除されたユーザーはまだnilではありませんでした。

問題は、起動画面が終了した後、ログインコントローラが空白になっていることがあります。時にはこの瞬間が数秒続くことがあります。ログインコントローラが表示されないように認証を確認するにはどうすればよいですか?アプリは、起動画面が消えた直後にアプリが進行する方法を決めます。ありがとう。

+0

あなたはAppdelegateからのプレゼンテーションを試しましたか?最初にloginControllerを初期化しているので、これが起こっています。これは残渣が表示されている理由です。 –

答えて

0

代わりに、任意のコードを変更することを一致している次のコードを記述し、私は単純に起動画面に一致するように、ログインコントローラの背景を設定:

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

    } 
... 
} 

起動画面からログインコントローラへの移行が目立つことはありません。

0

クイックフィックスとして、あなたはだけ希望"users"子ノード(とない完全ブランチ)をチェックしてみてください。例:

Database.database().reference().child("users").child(uid).observeSingleEvent(of: .value, with: { snapshot in 
    if snapshot.exists() { ... 

これにより、データベースに多数のユーザーが含まれている場合、遅延が大幅に減少する可能性があります。

それが十分ではない場合(ユーザーが利用可能な場合、あなたが見つけるまで、多分holding off your launch screen a little longer)、あなたは同様にあなたにAppDelegateクラスをこのロジックを移動することを検討し、そこからあなたLoginControllerが表示される場合があります。

+0

'users'ノードのみのチェックはなぜ機能しますか? –

+0

@ArchieGertsman実際には、元のコードで単一のユーザだけをチェックしています: 'snapshot.hasChild(uid)'。これはうまくいくはずですが、* complete * 'users'ブランチを不必要にダウンロードしているためにスケールがうまくいかないかもしれません;) –

0

1)アプリケーション代理人自身からrootControllerを設定する場合は、次のコードを使用します。 currentUser.uidがnilでなく、データベース内の値と一致していない場合にチェックを使用し、次にAppelegateのDidFinishLaunchingWithOptionsのコードを実行します。

  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、私が使用する)方法:あなたが代わりにAppdelegateかにLaunchApplicationのコードから関数を呼び出すのあなたのlogincontrollerを初期化していました。ログインクラス内の関数を作成し、必要なパラメータが

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

デフォルトビューの設定を削除したいと思うかもしれません:属性インスペクタでは、 *初期ビューコントローラー*のチェックボックス。これをオフにすると、コード内のビューを特定できます。 – Jay