2016-12-09 4 views
1

私はFirebaseのサインアップのための1つの中央VCとは対照的に、5つのView Controllerのサインアップフローを取り入れました。FirebaseとSwift 3でサインアップする前にユーザー名が存在するかどうかを検証するにはどうすればよいですか?

通常、サインアップする前にデータが失われてしまう問題がありますが、入力したすべての値をsegue経由でプログラムによって最終確認ページにプッシュし、最終的に正式な認証のためにFirebaseに送信します。

私の問題はそこにあります - ユーザ名が存在するかどうか確認したいですの前ににサインアップしてください。これは私のアプリのUXにとって不可欠です。私はこれを1つのVCだけで行うことはできません。ここで

はUsernameViewControllerのための私が持っているコードです:

let rootRef = FIRDatabase.database().reference() 

    rootRef.queryOrdered(byChild: "users").queryEqual(toValue: self.chooseUsernameTextField.text!) 
    .observe(FIRDataEventType.value, with: { (snapshot: FIRDataSnapshot!) in 

      if snapshot.hasChildren() == false { 
       print("not found") 

      } else { 
       print("usr found") 
      } 
     }); 

ここFirebaseデータベース・セキュリティ・ルール

{ 
    "rules": { 
     ".read": false, 
     ".write": false, 
     "users": { 
     ".validate": "data.child('username').val() === true", 
     ".read": true 
     } 
    } 
    } 

そして最後に、私のデータツリー(マイデータのスクリーンショットのために私が持っているコードですツリーは新しいユーザーを入れ子にしたり、なんらかの理由で価値のないユーザーノードを作成しません)。

Picture of Firebase Data Tree: App Name/Users

データルールとツリーがコードと一致するように正しく設定されているという疑問がありますが、Firebaseセキュリティでユーザー名チェックのコードを完成させるために何をすべきかわからないXY問題に悩まされています。

私を助けてください! :

+0

可能性のある重複した[Firebaseアンドロイド:ユーザ名を一意にする](http://stackoverflow.com/questions/35243492/firebase-android-make-username-unique) – Jay

答えて

1

私はコードをテストしていませんが、理論はあなたが探しているユーザー名と同じユーザー名で注文することでしょうこのスナップショットが存在する場合、あなたは。

を実行し、テストコードiがチャンスを持っているとき、私の記事を更新するしないでください。

let rootRef = FIRDatabase.database().reference() 

     rootRef.child("users").queryOrdered(byChild:"username").queryEqual(toValue: self.chooseUsernameTextField.text!) 
    .observe(.value, with: { (snapshot) in 

      if snapshot.exists() == false { 
       print("not found") 

      } else { 
       print("usr found") 
      } 
     }); 
+0

更新 あなたをしたくない場合ユーザノードは、認証されていないユーザが読み取り可能なユーザ名を別のノードに保存し、認証されていないユーザがそのリストから読み取ることができるようにします。次に、そのユーザー名がそのリストに存在するかどうかを確認します。 – shektek

0

同様Firebaseの認証セクション内に作成したユーザーがある場合、その後、あなたが実際にできるのt fetchProvidersメソッドを使用し、プロバイダが返されない場合は、あなたの認証セクションにユーザーがいません。

FIRAuth.auth()?.fetchProviders(forEmail: email, completion: { (providers, error) in 
      if providers == nil { 
        // user doesn't exist 
       } else { 
        // user does exist 
       } 
     }) 
関連する問題