質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

167閲覧

Firebaseのメールアドレス更新が出来ない

12e80e801281281

総合スコア3

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Firebase Authentication

Firebase Authenticationは、Firebaseを利用したユーザーの認証機能です。バックエンドサービス、SDK、アプリでのユーザー認証に使用できるUIライブラリが用意されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2024/02/14 09:26

編集2024/02/20 06:56

実現したいこと

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等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

メールアドレスの確認メールが古いアドレス(=現在ログインしているメールアドレス)に送信されてしまいます。

補足

どうすればメールアドレスを変更できるか教えてほしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2024/02/17 09:10

Firebaseのことは詳しくないのですが、コメントしますね。 タグがSwiftになっていますので、Firebase関係のものにできるのであれば、そういったものにした方が回答してもらえそうかなと思いました。 > `メールアドレスの更新に失敗しました: Please verify the new email before changing email.` > メールアドレスの確認メールが古いアドレス(=現在ログインしているメールアドレス)に送信されてしまいます。 まず、エラーメッセージに表示されている通りの対応をしてみたらいかがでしょうか。 エラーメッセージを見る限りですと、「古いアドレス(=現在ログインしているメールアドレス)」の認証?確認?が済んでいないように見えました。 「古いアドレス(=現在ログインしているメールアドレス)」の認証?確認?を済ませることで、新しいメールアドレスへの変更の処理に進めるのかな?というように見えました。
12e80e801281281

2024/02/19 09:34 編集

> タグがSwiftになっていますので、Firebase関係のものにできるのであれば、そういったものにした方が回答してもらえそうかなと思いました。 ありがとうございます。 先ほど `追記` いたしました。
12e80e801281281

2024/02/18 06:55

> まず、エラーメッセージに表示されている通りの対応をしてみたらいかがでしょうか。 エラーメッセージを見る限りですと、「古いアドレス(=現在ログインしているメールアドレス)」の認証?確認?が済んでいないように見えました。 「古いアドレス(=現在ログインしているメールアドレス)」の認証?確認?を済ませることで、新しいメールアドレスへの変更の処理に進めるのかな?というように見えました。 こちらも 認証 → メール送信 → 古いメールアドレスの認証 までを行った後に `メールアドレス` の上書き処理を行う方法に修正しました。
12e80e801281281

2024/02/19 09:34

コメントありがとうございます。質問を修正したのでご確認よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2024/02/19 11:08

コメントありがとうございます。 > こちらも 認証 → メール送信 → 古いメールアドレスの認証 までを行った後に `メールアドレス` の上書き処理を行う方法に修正しました。 「修正しました。」というのは具体的にはどういうことでしょうか? 質問の後に「古いメールアドレスの認証」をしても同様のエラー(「メールアドレスの更新に失敗しました: Please verify the new email before changing email.」)になってしまいますでしょうか? お手数をおかけしてしまうかもしれませんが、私はFirebaseについて詳しくありませんので、「古いメールアドレスの認証」の具体的な操作を細かくご記載いただくことは可能でしょうか? それから「メールアドレスの確認を促すメール」の文面を貼り付けていただくことは可能でしょうか?(名前やメールアドレスなどが含まれる部分は除いて大丈夫です。)
12e80e801281281

2024/02/20 06:58

コメントありがとうございます。 > 「修正しました。」というのは具体的にはどういうことでしょうか? 修正内容をアップデートしました。 (UI/UX的には変ですが)新しく `sendVerifyEmailButtonAction` を設置。 そのボタンを押すとviewModel側の `sendVerifyEmail()` が呼び出されて認証メールが送られます。 (確認済み)
12e80e801281281

2024/02/20 07:02

> 質問の後に「古いメールアドレスの認証」をしても同様のエラー(「メールアドレスの更新に失敗しました: Please verify the new email before changing email.」)になってしまいますでしょうか? なります。 Forebaseの仕様なのかわかりませんが... 認証メールが古いアドレスに送られる時と新しいアドレスに送られる状態があります。 (前回よりここが改善しています) 以前は `Firebaseのメールアドレス更新が出来ない = 新しいメールアドレスに認証メールが送信されない` 状態でしたが、 今は `Firebaseのメールアドレスが古いメールアドレスに送られる時と新しいメールアドレスに送られる時がある` 状態に変わりました。 ですので質問内容も求める回答も変わってしまいましたので一旦この質問は `クローズド` にします。 コメントいただきありがとうございました。
guest

回答1

0

自己解決

自己解決しました。
古いメールアドレスに一旦認証メールを送信することでメールアドレスの変更が可能になりました。
(ただし認証メールが送られるのが時々コンフリクトするような症状があります。)

Swift

1@IBAction func sendVerifyEmailButtonAction(_ sender: Any) { 2 3 viewModel.sendVerifyEmail() 4 5 }

投稿2024/02/20 07:10

12e80e801281281

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問