FireAuthで確認メール送信方

#概要
普段アプリを作る時にそうゆえば確認メール送信したことないなと思い調べました。
また、ついでに　RxSwiftの勉強も平行でしていたのでRxSwiftで書きました。
RxSwiftの方の解説はなしで行きます。

ではさっそくコードを書いていきましょう。
#ViewModel
```swift
protocol ViewPresentable {
    typealias Input = (
        emailText: Driver<String>,
        passwordText: Driver<String>,
        tappedButton: Driver<()>
    )
    typealias Output = (
        isValid: Driver<Bool>, ()
    )
    
    var input: ViewPresentable.Input { get }
    var output: ViewPresentable.Output { get }
}

class ViewModel: ViewPresentable {
    var input: ViewPresentable.Input
    var output: ViewPresentable.Output
    
    private var emailBehavior = BehaviorRelay<String>(value: "")
    private var passwordBehavior = BehaviorRelay<String>(value: "")
    
    private let disposeBag = DisposeBag()
    
    init(input: ViewPresentable.Input) {
        self.input = input
        self.output = ViewModel.output(input: self.input)
        
        input.emailText
            .drive(emailBehavior)
            .disposed(by: disposeBag)
        input.passwordText
            .drive(passwordBehavior)
            .disposed(by: disposeBag)
        
        process()
    }
}

private extension  ViewModel {
    static func output(input: ViewPresentable.Input) -> ViewPresentable.Output {
        let emailDriver = input.emailText
        let passwordDriver = input.passwordText
        
        let isValid = Driver.combineLatest(emailDriver, passwordDriver) { (email, password) -> Bool in
            return !email.isEmpty && !password.isEmpty
        }.asDriver(onErrorJustReturn: false)
        
        return (
            isValid: isValid, ()
        )
    }
    
    func process() {
        self.input
            .tappedButton.drive(onNext: {
                let email = self.emailBehavior.value
                let password = self.passwordBehavior.value
                AuthManager.shared.createUser(email: email, password: password)
            }).disposed(by: disposeBag)
    }
}
```

#AuthManager
```swift
class AuthManager {
    static let shared = AuthManager()
    
    private let auth = Auth.auth()
}

extension AuthManager {
    func createUser(email: String, password: String) {
        
        auth.createUser(withEmail: email, password: password) { (result, error) in
            guard let user = result?.user, error == nil else {
                print(error!)
                return
            }
            
            user.sendEmailVerification { (error) in
                if let error = error {
                    print(error)
                }
            }
        }
    }
}

```

今回の記事の肝は

```
user.sendEmailVerification
```
の部分です。
これで確認メールを送信できます。
ただ、デフォルトでは日本語じゃないのでFirebaseコンソールで
Authenticationを開いて`Templetes`のタブを開きます。
そこの一番下にテンプレート言語というのがあるのでペンマークを押すと言語を変更できます。
また、メールのメッセージ内容も変更できるのでいじってみてください。


#ViewController
```swift
class ViewController: UIViewController {

    @IBOutlet weak var emailField: UITextField!
    @IBOutlet weak var passwordField: UITextField!
    @IBOutlet weak var subscribeButton: UIButton!
    
    private let disposeBag = DisposeBag()
    private lazy var viewModel = ViewModel(input: (emailText: emailField.rx.text.orEmpty.asDriver(),
                                                   passwordText: passwordField.rx.text.orEmpty.asDriver(),
                                                   tappedButton: subscribeButton.rx.tap.asDriver()))
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupBind()
    }
    
    private func setupBind() {
        viewModel.output.isValid
            .drive(subscribeButton.rx.isEnabled)
            .disposed(by: disposeBag)
    }

}
```

こんな感じです。

実行してみるとメールが届きました。
![スクリーンショット 2021-03-03 19.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567404/233c9d95-ab9b-7735-df13-b99f29e33ca9.png)


#まとめ
今回解説はかなり少ないですが確認メールを送信するだけなので難易度は高くないと思います。

今まで実装してこなかったのですが確認メールは必須ですよね。

ご指摘等ございましたらコメントの方よろしくお願いいたします。