めっっっっっっっっっっちゃ簡単にiOSアプリにログイン機能を導入する

<h1>はじめに</h1>
みなさん初めまして！
IPFactoryの筋肉担当とっちゃんと申します:metal:
初めてのアドベントカレンダーの投稿ですが、今回はFirebaseのAuthenticationを使ってiOSアプリにログイン機能を導入したいと思います！
僕自身まだまだ初心者なので、改善する余地はいくらでもあるかと思いますが、参考程度に見ていただけると幸いです:v:

<h1>事前準備</h1>
コードを書く前にFirebaseでプロジェクトの作成やXcodeとの連携、ライブラリの追加など、事前準備が必要なので下記のFirebase公式サイトに載っている「FirebaseをAppleプロジェクトに追加する」を読んで作成、導入してみてください！

[FirebaseをAppleプロジェクトに追加する](https://firebase.google.com/docs/ios/setup?hl=ja)


![%E7%94%BB%E9%9D%A2%E5%8F%8E%E9%8C%B2%202023-12-11%2013.11.03-2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3130765/e63c376b-229a-6da2-83d5-5b979cbc9b4a.gif)
Firebaseの導入ができたら、**FirebaseコンソールのAuthenticationを選んでメール/パスワードでのログインを有効**にしてください！

以上で事前準備が完了です:ok_hand:

<h1>アカウント新規作成画面を作る</h1>
いよいよ実装の工程に進みます！！

**①レイアウトを配置**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3130765/9abf0537-3d59-2acd-e64e-2c4970190777.png" width=50%>
メールアドレスとパスワード入力用のTextField、新規登録ボタンを用意します

②**ライブラリをインポート**
Authenticationをインポートしてください
```swift
import FirebaseAuth
```

**③レイアウトをViewControllerと連携**
```swift
class ViewController: UIViewController {

    
    @IBOutlet weak var mailField: UITextField! 
    @IBOutlet weak var passField: UITextField! 
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }

    @IBAction func createButton(_ sender: Any) { 
        
    }
    
}
```
レイアウトを定義しましょう！

**④新規作成処理を追加する**
```swift
@IBAction func createButton(_ sender: Any) {
    Auth.auth().createUser(withEmail: mailField.text!, password: passField.text!) { Result, Error in
        if let Error = Error {
            print("アカウントの新規作成に失敗しました。\(Error)")
            return
        }
            print("アカウントの新規作成に成功しました。")
            //アカウントが正常に作られた際に行いたい処理をここに書く
    }
}
```
**createUser**メソッドは、Authでアカウントを新規作成する際に使われるメソッドで、引数のwithEmailとpasswordにmailFieldとpassFieldの文字列を代入することによって、メールとパスワードをセットにしてAuthで管理できるようになります！

![スクリーンショット 2023-12-11 15.17.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3130765/f7560cd9-0cc6-9790-15be-677d5ea5f66b.png)
試しにテストしたところコンソールに反映されていました:hugging:
これでアカウント新規作成画面ができました！

<h1>ログイン画面を作る</h1>
次にログイン画面を作っていきます！

①**レイアウトを配置**
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3130765/4fcde973-a60e-87f7-ff07-08dd260f8f2a.png" width=50%>
メールアドレスとパスワード入力用のTextField、そして新規登録ボタンと新規登録画面への遷移用ボタンを用意します
新規登録ボタンはアカウント新規登録画面に遷移できるように設定しておいてください

②**ライブラリをインポート**
Authenticationをインポートしてください
```swift
import FirebaseAuth
```

**③レイアウトをViewControllerと連携**
```swift
class LoginViewController: UIViewController {


    @IBOutlet weak var mailField: UITextField!
    @IBOutlet weak var passField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        
    }
    
    @IBAction func loginButton(_ sender: Any) {
    }
    
}
```
新しいViewControllerを作ってレイアウトを定義しましょう！

**④ログイン処理を追加する**
```swift
@IBAction func loginButton(_ sender: Any) {
    Auth.auth().signIn(withEmail: mailField.text!, password: passField.text!){
        Result,Error in
            if let Error = Error {
                print("ログインに失敗しました。\(Error)")
                return
            }
                print("ログインに成功しました。")
                //ログインが成功した際に行う処理をここに書く
    }
}
```
**signIn**メソッドは、Authで管理されているアカウントにログインする際に使われるメソッドで、引数のwithEmailとpasswordにmailFieldとpassFieldの文字列を代入することによって、Auth内のアカウントと照らし合わせて一致するアカウントにログインすることができます！

![%E7%94%BB%E9%9D%A2%E5%8F%8E%E9%8C%B2%202023-12-12%2014.34.07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3130765/45735c66-e4ae-f73f-8f46-75f726fb6778.gif)
確認してみると正しいパスワードでは「ログインに成功しました。」と出力されて、間違ったパスワードでは「ログインに失敗しました。」と出力されています！

これで簡易的ではありますが、ログイン機能を搭載できました！

<h1>おまけ</h1>
このままでは細かいところが気になるので修正していきます！

まずアカウント新規登録画面にログイン画面に戻ることができるボタンを設けます

```swift
    @IBAction func backButton(_ sender: Any) {
        dismiss(animated: true)
    }
```
アカウント新規登録画面にボタンを設置して、ViewControllerにボタンを定義し、上記のコードを追加するとアカウント登録画面が消去されてログイン画面が出てきます！

そしてもう一つ
このままではメールアドレスやパスワードが間違っていた時に何もアナウンスされないので、アラートで間違っていることをアナウンスしたいと思います。
```swift
@IBAction func loginButton(_ sender: Any) {
    Auth.auth().signIn(withEmail: mailField.text!, password: passField.text!){
        Result,Error in
            if let Error = Error {
                print("ログインに失敗しました。\(Error)")
                //ここから追加
                let alert = UIAlertController(title: "メールアドレスかパスワードが正しくありません",message: "入力されたメールアドレスかパスワードが間違っています。確認の上、もう一度お試しください。", preferredStyle: .alert)
                let ok = UIAlertAction(title: "了解", style: .default) { (action) in
                    self.dismiss(animated: true, completion: nil)
                }
                alert.addAction(ok)
                self.present(alert, animated: true, completion: nil)
                //ここまで追加
                return
            }
                print("ログインに成功しました。")
                //ログインが成功した際に行う処理をここに書く
    }
}
```
上記のコードを追加するとこのようなアラートが出ます
![%E7%94%BB%E9%9D%A2%E5%8F%8E%E9%8C%B2%202023-12-12%2016.14.54.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3130765/d2c69da2-f6a0-42d4-1ea9-b15188a1146d.gif)
より本格的なログイン機能になりました！

<h1>さいごに</h1>
今回Firebaseを使って超簡単にログイン機能を実装しました！
途中端折って説明した部分もありましたが、少しでも参考になれば幸いです:bow_tone1:

最後までご覧いただきありがとうございました！！