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

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

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

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

Firebase Authentication

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

Swift

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

Q&A

解決済

1回答

1476閲覧

firebaseの複数エラーの同時表示について

Samyan

総合スコア1

Firebase

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

Firebase Authentication

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

Swift

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

0グッド

0クリップ

投稿2021/06/15 02:42

前提・実現したいこと

3日程つまづいております。どうか、ご教授いただけませんでしょうか・・・。
Firebaseを利用して、メールアドレスを使用したユーザー登録機能を作っています。
userName,EmailAddress,Passwordが正しく入力されれば新規登録が完了する機能です。
バリデーションによるエラーメッセージを表示させる機能を実装中に以下の問題が発生しました。

発生している問題

メールアドレス、パスワード両方にバリデーションに伴うエラーが生じている場合、メールアドレスのエラー文しか表示されない。 下記のコードの、errorStringに発生しているエラー文が全て入るコードにするためには、どこを変更すれば良いのでしょうか? ご教授いただけますと幸いです。 変数の定義等は載せておりませんが、そこに問題はなさそうだと考え割愛しております。 もし、掲載の必要がありそうであればご指摘いただけますと幸いです。

該当のソースコード

swift

1 @IBAction func registrationButton(_ sender: Any) { 2 let email = mailAddressRegistration.text 3 let password = passwordRegistration.text 4 let name = userNameRegistration.text 5 6 7 if userNameRegistration.text!.isEmpty{ 8 userNameError.text = "ユーザー名を入力してください。" 9 userNameError.textColor = .red 10 11 } 12 13 14 if mailAddressRegistration.text!.isEmpty{ 15 emailAddressError.text = "メールアドレスを入力してください。" 16 emailAddressError.textColor = .red 17 } 18 19 20 if passwordRegistration.text!.isEmpty{ 21 passWordError.text = "パスワードを入力してください。" 22 passWordError.textColor = .red 23 } 24 25 if userNameRegistration.text?.isEmpty != true && mailAddressRegistration.text?.isEmpty != true && passwordRegistration.text?.isEmpty != true{ 26 Auth.auth().createUser(withEmail: email!, password: password!){ [self](result, error) in 27 28 print("sam") 29 if error != nil{ 30 userNameError.textColor = .systemTeal 31 emailAddressError.textColor = .systemTeal 32 passWordError.textColor = .systemTeal 33 errorString = error!.localizedDescription 34 switch errorString { 35 case "The email address is badly formatted.": 36 emailAddressError.text = "正しいメールアドレスを入力してください。" 37 emailAddressError.textColor = .red 38 case "The password must be 6 characters long or more.": 39 passWordError.text = "パスワードは、6文字以上で入力してください。" 40 passWordError.textColor = .red 41 default: 42 return 43 } 44 45 }else{ 46 47 if let user = result?.user{ 48 let req = user.createProfileChangeRequest() 49 req.displayName = name 50 req.commitChanges(){ error in 51 if error == nil{ 52 print("プロフィール登録完了") 53 self.performSegue(withIdentifier: "topPageFromResistration", sender: nil) 54 55 }else{ 56 print(error.debugDescription) 57 58 } 59 } 60 } 61 } 62 } 63 } 64 }

試したこと

ここに問題に対して試したことを記載してください。
解決に向けてググっているのですが、記事が出てこず質問させていただいております。

補足情報(FW/ツールのバージョンなど)

xcode:12.5

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

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

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

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

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

guest

回答1

0

ベストアンサー

このケースで複数のバリデーションエラーを表示したいときは自前でバリデーションを実装しなければ実現できないと思います。

【追記】

すみません。言葉足らずだったので追記しておきます。
どういうことかというと、SDKに事前にバリデーションするメソッドがない以上、「すべてのエラーが出る」という機能を満たすためには、Firebase側の、Emailでのユーザー作成に関する要件をすべて理解、実装していなければ実現できません。そこまでするほどの機能の重要性なのか、ということです。
createUser(withEmail:password:completion:)
こちらのメソッドではコールバックの引数としてエラーが起きた場合はOptionalError型一つを返すだけなので、複数のエラーを扱うことはできません。

そしてアカウントを作れない場合は以下のとおりです。

  • FIRAuthErrorCodeInvalidEmail - Indicates the email address is malformed.
  • FIRAuthErrorCodeEmailAlreadyInUse - Indicates the email used to attempt sign up
    already exists. Call fetchProvidersForEmail to check which sign-in mechanisms the user
    used, and prompt the user to sign in with one of those.
  • FIRAuthErrorCodeOperationNotAllowed - Indicates that email and password accounts
    are not enabled. Enable them in the Auth section of the Firebase console.
  • FIRAuthErrorCodeWeakPassword - Indicates an attempt to set a password that is
    considered too weak. The NSLocalizedFailureReasonErrorKey field in the NSError.userInfo
    dictionary object will contain more detailed explanation that can be shown to the user.

上から順に

  • 不正なアドレス形式
  • すでにそのアドレスのユーザーが居る
  • Emailでのユーザー作成がFirebase側で有効になっていない
  • パスワードが弱い

です。これらすべてに対してエラーを出したい場合、自前ですべてバリデーションする実装が必要になります。

  • 不正なアドレス形式 -> 正規表現で対応可能
  • パスワードが弱い -> 複雑ながらも対応可能。パスワードの仕様は長さ、使用できる文字の種類が限られている(かななどは不可)の2つがある。この2項目をそれぞれバリデーションする必要がある。参考
  • すでにそのアドレスのユーザーが居る -> このメソッドで、この定数文字列がコールバックの引数に入ってないか調べる
  • Emailでのユーザー作成がFirebase側で有効になっていない -> 設定するばいいので起こり得ない

以上の実装を行ってあげないといけません。なので、ユーザーにとっては初回にちょっとあるだけのアカウント登録に対して、ここまでやる必要があるかどうかを見極めなければなりません。もちろん、勉強のためなどであれば実装する理由としては十分だと私は思うので、「そんな面倒なことやるな」という意味でもありません。

なので、「実際アカウントを作ってみて、帰ってきたエラーを画面に表示する」という今のやり方と、「自前でバリデーションする」やり方、どちらがが良いかを考えてみることをオススメします。

出典
Firebase Authentication#Authのリファレンス
Firebase Authentication#Constantsのリファレンス
Firebase Authentication のパスワードの仕様

投稿2021/06/21 12:48

編集2021/06/23 08:59
takenm

総合スコア55

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

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

Samyan

2021/06/23 02:31

ありがとうございます!バリデーションの実装方法を調べ、取り組んでまいります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問