実現したいこと
Firebaseのメールアドレスを更新したいです。
発生している問題・分からないこと
1:公式サイト通りに実装すると以下のエラーが出てメールアドレスが更新できませんでした。
2:メールアドレスの確認を促すメールがなぜかいつも同じアドレスにのみ送信されてしまいます。(例:firebase@gmail.com)
エラーメッセージ
error
1メールアドレスの更新に失敗しました: Please verify the new email before changing email.
該当のソースコード
Swift
1// ViewModel.swfit 2 3import PKHUD 4import Firebase 5import Foundation 6 7class MailAdressChangeViewModel { 8 // 現在のユーザーを取得 9 func updateEmail(newEmail: String) { 10 if let user = Auth.auth().currentUser { 11 // 新しいメールアドレスを設定 12 user.updateEmail(to: newEmail) { (error) in 13 if let error = error { 14 print("メールアドレスの更新に失敗しました: \(error.localizedDescription)") 15 // メールが新しいアドレスに送信されたことを通知 16 Auth.auth().currentUser?.sendEmailVerification(completion: { (error) in 17 if let error = error { 18 print("確認メールの送信に失敗しました: \(error.localizedDescription)") 19 } else { 20 print("確認メールが新しいメールアドレスに送信されました") 21 } 22 }) 23 } else { 24 print("メールアドレスが更新されました") 25 } 26 } 27 } else { 28 print("ユーザーがログインしていません") 29 } 30 } 31 32 33 func sendVerifyEmail() { 34 // ---------- メールが新しいアドレスに送信されたことを通知 --------- // 35 Auth.auth().currentUser?.sendEmailVerification(completion: { (error) in 36 if let error = error { 37 print("確認メールの送信に失敗しました: \(error.localizedDescription)") 38 } else { 39 print("確認メールが新しいメールアドレスに送信されました") 40 } 41 }) 42 } 43 44 func sendVerifyEmail02(){ 45 // 新しいメールアドレスに送信する? 46 } 47 48 // UUID取得 49 func fetchUUID() -> String? { 50 return UserDefaults.standard.string(forKey: "uuid") 51 } 52 53 // FirebaseID = Email 54 func fetchFirebaseId() -> String? { 55 return UserDefaults.standard.string(forKey: "firebaseId") 56 } 57 58 // メールアドレスの形式チェック 59 func isValidEmail(_ email: String) -> Bool { 60 // 正規表現を使用してメールアドレスの形式を確認する 61 let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}" 62 let emailPredicate = NSPredicate(format: "SELF MATCHES %@", emailRegex) 63 return emailPredicate.evaluate(with: email) 64 } 65 66 // 日本語が含まれているかチェックする 67 func containsJapanese(text: String) -> Bool { 68 let regex = ".*[\\p{Hiragana}\\p{Katakana}\\p{Han}]+.*" 69 let predicate = NSPredicate(format: "SELF MATCHES %@", regex) 70 return predicate.evaluate(with: text) 71 } 72}
Swift
1// ViewController.swift 2 3class ViewController.swift 4 5// インスタンス 6let viewModel = viewModel.swift() 7 8@IBAction func addAction(_ sender: Any) { 9 if textField.text?.isEmpty ?? true { 10 print("textField は空です。") 11 return 12 } 13 14@IBAction func sendVerifyEmailButtonAction(_ sender: Any) { 15 viewModel.sendVerifyEmail() 16 } 17 18 let inputMailAdress = textField.text! 19 20 // メールアドレスを検証する 21 if self.viewModel.isValidEmail(inputMailAdress) { 22 print("入力されたテキスト:\(inputMailAdress)") 23 24 // 空入力:弾く 25 if inputMailAdress.isEmpty { 26 self.alert(message: "IDを入力してください。") 27 return 28 } 29 30 // 空白:取り除く 31 let email = inputMailAdress.trimmingCharacters(in: .whitespaces) 32 33 // ---------- 文字数チェック ---------- // 34 if email.count < 5 { 35 // idTextFiledが5文字未満の場合はエラー 36 self.alert(message: "idの文字数が不正です。5文字以上15文字以内にしてください。") 37 return 38 } 39 40 // ---------- 日本語チェック ---------- // 41 if self.viewModel.containsJapanese(text: email) { 42 self.alert(message: "IDに日本語が含まれています。") 43 return 44 } 45 // アップデートする 46 self.viewModel.updateEmail(newEmail: email) 47 } else { 48 print("メールアドレスの形式が正しくありません") 49 } 50 }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
メールアドレスの確認メールが古いアドレス(=現在ログインしているメールアドレス)に送信されてしまいます。
補足
どうすればメールアドレスを変更できるか教えてほしいです。
回答1件
あなたの回答
tips
プレビュー