【Firebase・Swift】初回起動時やログイン時、新規会員登録時に表示するViewを変える

## 1. 初回起動時や非ログイン時に表示するためのViewControllerとstoryboardを用意する
今回は`Tutorial`というディレクトリを作成し、その中に`TutorialViewController.swift`と`Tutorial.storyboard`を作成しました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/f771e9f9-c670-7b36-4c3d-a787702df755.png)
`Tutorial.storyboard`で、初回起動時や非ログイン時に遷移したいViewを選択し、`Storyboard ID`を設定します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/9aca3170-ceda-4491-7545-086def7fa047.png)

## 2. SceneDelegateで最初に表示するViewを変更するコードを書く
`SceneDelegate.swift`を開き、以下のコードを追記します
```diff_swift:SceneDelegate.swift
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+         Auth.auth().addStateDidChangeListener { (auth, user) in
+             if user == nil {
+                 guard let scene = (scene as? UIWindowScene) else {
+                     return
+                 }
+                 let window = UIWindow(windowScene: scene)
+                 self.window = window
+                 window.makeKeyAndVisible()
+                 
+                 let vc = UIStoryboard(name: "Tutorial", bundle: nil).instantiateViewController(withIdentifier: "TutorialView") as! TutorialViewController
+                 window.rootViewController = vc
+             }
+         }
        guard let _ = (scene as? UIWindowScene) else { return }
}
```
内容としては、
- FirebaseのAuthサービスのステートリスナーを追加し、ユーザーがサインインしているかを確認する
- ユーザーがサインインしていない場合、新しいUIWindowを作成し、それを表示する。
StoryboardからTutorialViewControllerをインスタンス化し、それをwindowのrootViewControllerに設定する
- ユーザーがサインインしている場合は、何もしない

を行っています

## 3. TutorialViewController.swiftを設定する
今回は次のようにコードを書きました
```swift:TutorialViewController.swift
import UIKit
import Firebase
import FirebaseAuthUI
import FirebaseOAuthUI
import FirebaseGoogleAuthUI

class TutorialViewController: UIViewController, FUIAuthDelegate {
    
    let authUI = FUIAuth.defaultAuthUI()!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let providers: [FUIAuthProvider] = [
            FUIGoogleAuth(authUI: authUI),
            FUIOAuth.appleAuthProvider()
        ]
        self.authUI.delegate = self
        self.authUI.providers = providers
    }
    
    @IBAction func LoginButtonTapped() {
        let authViewController = self.authUI.authViewController()
        self.present(authViewController, animated: true, completion: nil)
    }
    
    public func authUI(_ authUI: FUIAuth, didSignInWith authDataResult: AuthDataResult?, error: Error?){
        if let error = error {
            print(error)
        }

        let db = Firestore.firestore()
        let userRef = db.collection("users").document(Auth.auth().currentUser!.uid)
        userRef.getDocument { (snapshot, error) in
            print(snapshot)
            if let error = error {
                print(error)
                return
            }
            if snapshot?.exists == true {
                let mainVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "HomeView") as UIViewController
                mainVC.modalPresentationStyle = .fullScreen
                mainVC.modalTransitionStyle = .crossDissolve
                self.present(mainVC, animated: true)
            } else {
                //新規会員登録画面に遷移する
            }
        }

    } 
}
```
内容としては、
- viewDidLoadメソッドで、GoogleとAppleの認証プロバイダを設定し、delegateに自身を設定する
- LoginButtonTappedアクションメソッドが呼び出されると、認証画面が表示される
- authUI(_:didSignInWith:error:)メソッドは、認証が完了した後に呼び出され、Firestoreからユーザー情報を取得する
- 取得したユーザー情報が存在すれば、HomeViewに遷移、存在しなければ、SignUp画面に遷移する

を行っています。

また、新規登録・ログインが完了した後に遷移したいViewの`Storyboard ID`を設定しておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540178/e2fb441e-7328-e2ac-6922-33c1971675c0.png)


これで、初回起動時やログイン時、新規会員登録時に表示するViewを変えることができます


リポジトリはこちら

https://github.com/sugijotaro/firebase-demo

ログイン機能の実装についても同じリポジトリを用いて解説しています
こちらもぜひ参考にしてください

https://qiita.com/sugijotaro/items/bbd532d6e1b07bdfb669