0
1

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.

FireAuthで確認メール送信方

Posted at

概要

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

ではさっそくコードを書いていきましょう。

ViewModel

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

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

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

まとめ

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

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

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

0
1
0

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?