概要
普段アプリを作る時にそうゆえば確認メール送信したことないなと思い調べました。
また、ついでに 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)
}
}
こんな感じです。
まとめ
今回解説はかなり少ないですが確認メールを送信するだけなので難易度は高くないと思います。
今まで実装してこなかったのですが確認メールは必須ですよね。
ご指摘等ございましたらコメントの方よろしくお願いいたします。