5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

FirebaseAuthのログイン状態によって起動画面を切り替えていく

Last updated at Posted at 2021-02-14

備忘録

#はじめに
タイトルにも書いてあるようにFirebaseAuthのログイン状態によって起動画面を切り替える方法を
備忘録として書いていきます。

FirebaseAuthの説明や導入方法などは沢山、参考記事がありますので省きます。
そして、ログイン機能も実装している前提で書いていきます。

#実装する前に
Xcodeで最初にプロジェクトを立ち上げるとStoryboard起点でアプリの画面が表示されます。

このデフォルトのままだと起動画面の切り替えはできないので
まずはコードベースでアプリの画面を表示させないといけません

コードベースでアプリの画面を表示する方法は
私が記事にしていますので良かったら参考にしてみて下さい↓
画面遷移に関係あるコードの記述を別ファイルに分けて実装する

#実装コード
まずは、ユーザー認証を行うメソッドを準備します。

ViewControllerからFirebase関連のコードを分離させる為にAccountManager.swiftを新しく作ります。
それと同時に、ここにメソッドを書いていきます。

AccountManager.swift
import Firebase

final class AccountManager {
   static let shared = AccountManager()
    private init() {}

   // ユーザー認証を行うメソッド
    func authenticationStatusCheck(complition: ((Bool) -> Void)? = nil) {
        Auth.auth().addStateDidChangeListener { (_, user) in
            // ユーザー情報があるかどうかをBool値で判断する
            if user == nil {
                // 新規ユーザーの場合
                complition?(false)

            }else {
                // ログイン済みユーザーの場合
                complition?(true)
            }
        }
    }
}

次はBool値に応じてViewControllerを返すメソッドを準備します。

UIViewControllerのextentionファイルを作って、そこで場合分けをしていきましょう。

UIViewController+
extension UIViewController {
    // Bool値に応じてViewControllerを返すメソッド
    static func getRoot(isLogined: Bool) -> UIViewController {
        // ログイン済みユーザーの場合
        if isLogined {
            let mainVC = MainViewController()
            return mainVC

        // 新規ユーザーの場合
        }else {
            let registerVC = RegisterViewController()
            return registerVC
        }
    }
}

次はアプリの初期画面を表示するメソッドを準備します。

そして、ここで先ほど準備したメソッドを呼び出していきます。

Router.swift
import UIKit

final class Router {
    // アプリの初期画面を表示するメソッド
    static func showRoot(window: UIWindow) {
        // ユーザーのログイン状態を取得する
        AccountManager.shared.authenticationStatusCheck { (bool) in
            // ログイン状態に応じたViewControllerを取得する
            let rootVC = UIViewController.getRoot(isLogined: bool)
            // アプリの初期画面に反映させる
            window.rootViewController = rootVC
            window.makeKeyAndVisible()
        }
    }
}

このままでは、まだアプリ起動時の画面には反映されていないので
AppDelegate.swift内で実装していきます。

AppDelegate.swift
import UIKit

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let window = UIWindow(frame: UIScreen.main.bounds)
        self.window = window
        // ここでアプリの初期画面を端末に反映させる
        Router.showRoot(window: window)

        return true
   }

これでログイン状態によって起動画面を切り替えることが出来ました。

#おわりに
かなり雑に書いてしまいましたが、これでログイン状態によって起動画面が切り替えれます。
因みに、このように正しく起動時に画面を出し分けることを起動経路と言います。

もし、何かあれば遠慮なくコメントして下さると有り難いです。

5
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?