Как сохранить правильный порядок страниц входа и домашней страницы с помощью входа в firebase в ios? - PullRequest
0 голосов
/ 03 мая 2018

Это может звучать очень просто. Но я не мог найти выход.

Я использую Firebase аутентификацию, если это необходимо знать заранее.

Контроллер initial view установлен как LoginViewController. У меня здесь две кнопки: Регистрация & Вход . Кнопка Регистрация представляет другой контроллер вида модально, где пользователь может выбрать регистрацию. После успешной регистрации, SignUpViewController отклоняется, поэтому появляется LoginViewController. Внутри LoginViewController viewDidAppear(_:) я проверяю текущего пользователя и, если доступно, перенаправляю пользователя на HomeViewController:

class LoginViewController: UIViewController {
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if let _ = Auth.auth().currentUser {
            // This is a modal segue
            performSegue(withIdentifier: "SegueToHomeViewController", sender: self)
        }
    }
}

При нажатии кнопки Logout в HomeViewController контроллер просто отклоняется из-за выхода пользователя из системы.

class HomeViewController: UIViewController {
    @IBAction func logoutButtonDidTouch(_ sender: UIBarButtonItem) {
        do {
            try Auth.auth().signOut()
            // This dismiss lands user to the LoginViewController again
            // So user has chance to login again with `Login` button this time
            dismiss(animated: true, completion: nil)
        } catch {
            print(error)
        }
    }
}

Пока все работает нормально. Но есть тонкое плохое поведение . Потому что каждый раз, когда приложение запускается, появляется LoginViewController, а затем перенаправляется на HomeViewController, что не так хорошо, как пользовательский опыт.

Итак, я хочу, чтобы пользователь вошел в систему уже в первом окне, которое он / она увидит, будет HomeViewController, отличным от LoginViewController. Но если пользователь ранее не входил в систему, он / она попадет на LoginViewController.


Да, я могу проверить из AppDelegate application(_:didFinishLaunchingWithOptionss:) для текущего пользователя и, если найден, перейти непосредственно к HomeViewController. Но тогда я потеряю LoginViewController, когда пользователь нажмет на Выйти в HomeViewController.


На первый взгляд, это почти то, что мне нужно сделать:

Signup-Login-Home-Sequence

Все что угодно, даже без примера кода приветствуется.

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

У меня была похожая дилемма, и я решил ее, добавив 'Splash' ViewController в качестве контроллера ввода для приложения. Я назвал его идентичным LaunchScreen.storyboard. В SplashVC я проверяю действительный токен пользователя и, если он есть, он отправляет напрямую в основное приложение (в моем случае это TabBarController). В моем TabBarController я установил Firebase addStateDidChangeListener, который будет перенаправлять обратно в LoginVC, если токен пользователя станет недействительным.

Я также использую Splash VC для запуска асинхронного кода, проверки статуса подписки и записи данных для входа в систему Firebase.

Пожалуйста, извините за быструю и грязную схему.

enter image description here

0 голосов
/ 03 мая 2018

Вы не потеряете, когда выйдете из системы, вы можете легко показать любой VC anyTime без перехода, jsut присваивает каждому viewController идентификатор и устанавливает его на UIApplication.shared.keyWindow?.rootViewController

let loginView = self.storyboard?.instantiateViewController(withIdentifier: "loginView") as! loginVC

let nav = UINavigationController(rootViewController: loginView)

nav.navigationBar.isHidden = true

UIApplication.shared.keyWindow?.rootViewController = nav
0 голосов
/ 03 мая 2018

попробуйте проверить в функции loadView (), или вы можете создать контроллер представления ввода с фоновым изображением, таким как заставка, сделать его начальным видом и установить функцию проверки в viewWillAppear его класса

...