Swift5 Firebase でチャットアプリをつくろう　新規会員登録・ログイン・ログアウト編

前提条件
・xcode11.4
・swift5


#Firebaseとは
Firebaseとは、Googleが提供している、すばやく高品質のモバイルアプリやWebアプリケーションを開発することができるプラットフォームです。

Firebaseを使うことで、開発者はアプリケーションの開発に専念でき、バックエンドで動くサービスを作成する必要も管理する必要もありません。
ここでいうバックエンドとは、サービスの内、見えないところでデータの処理や保存などを行う要素のことです。

![firebase-01_mbaas.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694910/1eee50ba-c22f-9b45-51aa-713abcdd2680.png)


Firebaseではたくさん役に立つ機能がありますが、今回はログインや新規登録の時に使う認証機能Firebase Authenticationとデータを保管するCloud Firestoreを使っていきます。
ちなみにデータベースにはCloud FirestoreとRealtime Databaseがありますが、Cloud FirestoreはRealtime Databaseをアップグレードさせたものです。

##新規会員登録
Firebaseを導入したら進めてください。
導入の仕方は以下の記事が参考になると思います！
https://qiita.com/eKushida/items/54b62d3961a5c74a71af

ちなみにpodfileは 'Firebase/Auth'と'Firebase/Firestore'を入れました。

###emailとパスワードをセット
emailとパスワードのtextFieldのtextを現在ログインしているユーザーの妥当するところにいれる。
 Auth.auth().createUserが現在ログインしているユーザーのことです。

```swift:RegisterViewController.swift

 @IBAction func registerPressed(_ sender: UIButton) {
        if let email = emailTextField.text, let password = passwordTextField.text {
            Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
                if error != nil {
                    print(error)
                    //あとでコード書く
                } else {
                    print("会員登録成功")

```

Cloud FirestoreのAuthenticationを見てみると、emailとパスワードがセットされました。
![スクリーンショット 2020-08-20 12.38.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/694910/edb5fd7e-70e4-0cee-0889-81d79c4ac3a3.png)

###ログイン
ログインするときは Auth.auth().signInです。
ログインに成功したときはログイン画面にいくようになっています。

```swift:RegisterViewController.swift
 @IBAction func loginPassword() {
        if let email = emailTextField.text,let password = passwoedTexxtField.text {
        Auth.auth().signIn(withEmail: email, password: password) {  authResult, error in
            if error != nil {
                
            } else {
                let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
                                   let rootViewController = storyboard.instantiateViewController(withIdentifier: "RootTabBarController")
                                   UIApplication.shared.keyWindow?.rootViewController = rootViewController
                                   
                                   let ud = UserDefaults.standard
                                   ud.set(true, forKey: "isLogin")
                                   ud.synchronize()
               }
    }
        }
```

###ログアウト
``` swift
@IBAction func logout() {
        let firebaseAuth = Auth.auth()
        do {
            try firebaseAuth.signOut()
            let storyboard = UIStoryboard(name: "SignIn", bundle: Bundle.main)
            let rootViewController = storyboard.instantiateViewController(withIdentifier: "RootNavigationController")
            UIApplication.shared.keyWindow?.rootViewController = rootViewController
            // ログイン状態の保持
            let ud = UserDefaults.standard
            ud.set(false, forKey: "isLogin")
            ud.synchronize()
            
        } catch let signOutError as NSError {
            print ("Error signing out: %@", signOutError)
        }  
    }
```