質問: Firebase Authenticationで電話認証させて認証番号を入力させる。 次に電話番号が登録されてるか否かで分岐させる。 登録されてたらホーム画面へ、未登録であれば登録画面へ遷移させる。 Firebase Authentication周りのドキュメント見てるのですが分かりません。 ``` signInAndRetrieveDataWithCredential:(FIRAuthCredential *)credential completion:(nullable FIRAuthDataResultCallback)completion; ``` ``` signInWithCredential:(FIRAuthCredential *)credential completion:(nullable FIRAuthResultCallback)completion DEPRECATED_MSG_ATTRIBUTE( "Please use signInAndRetrieveDataWithCredential:completion:" " for Objective-C or signInAndRetrieveData(with:completion:)" " for Swift instead."); ``` ここら辺のメソッドをいじって条件分岐させるのかなと考えてます。
回答: ~~これでどうでしょう??? Swift // currentUserがnilならログインしていない if FIRAuth.auth()?.currentUser == nil { // ログインしていない時の処理 } else { // ログインしている時 }~~ /_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ Firebase Authentication で 携帯番号認証 を 実装して試してみました。 すると、hirukoさん、の言っているような挙動は認められませんでした。 まず、1度電話番号でユーザー登録すると 電話番号ごとに「ユーザーUID」というものが作られることをFirebaseのconsoleで確認できるでしょうか? なので、このユーザーUIDを用いることで、同じ本人(固有文字列を知っている人)かどうかを照合できます。 しかし、このUIDを他のデータベース等と照合するのはgoogleでは非推奨とされています。(どこかに書いてありました) コードは多少はしょりますが、 ``` Auth.auth().signInAndRetrieveData(with: credential) { (success, error) in if error != nil { print("error:", error) } else { print("success:", success) print(success?.user.uid) // <-この文字列が携帯番号ごとに一意となります。 } } ``` で、本題はここからですが、想定している2通りの場面を考えると 1既にユーザー登録した人が他の端末でアプリを使用する時 これは、携帯電話番号が変わらず本人のものかどうかが大事になります。 もし、本人のものである場合は、その携帯に送られてくるワンタイムパスワード番号を入力してもらえれば、 本人の情報を取得でき、本人としてログインできます。 ex) 携帯を手元に持ってて、たまたまパソコンからサービスにログイン、 送られてくるワンタイムパスワードをその場で見て入力するパターン 一方、もし携帯電番号がすでに本人のものでなくなった場合ですが、 この場合はワンタイムパスワードをもらえないので、他のログイン方法を確保しておく必要があります。 それを利用して携帯電話番号を修正できるようにしておかなければなりません。 2ユーザー登録済みの人が一旦アプリを削除して、再インストールした時 自分の環境で行ってみましたが、同じ番号を用いている限り、 登録画面(絵を実際に選ぶ作業???)に飛ばされることはなかったです。 本当に番号を初めて入力する初回のみ、Robotじゃない確認で絵を選ばされましたが、 それ以外はRobotじゃない確認をしています。って表示されるだけで、 勝手に自動認証してくれて、ワンタイムパスワードが送られてきましたよ。 それはアプリを一度削除し、インストールし直したとしてもです。 仕様上、botじゃないという検証の自動認証ページに関しては、 飛ばすことはできないと思います。 これで答えになるでしょうか??? もう一度、質問を読んでみましたが、 もしかして、自分でログイン画面と登録画面を実装し、場合分けし、 表示を変えたい・アプリ特有のユーザーの設定情報を保存したいということですか? その場合は、Firebaseにログイン回数や最終ログイン日 場合によってはアプリの設定情報なども ユーザー情報として保存した方がいいのではないでしょうか? FirebaseのAuthenticationの仕様上、 番号を入力ワンタイムパスワードを要求し、ログインした時点で、 これまで登録がなくても、携帯番号は登録されますし、 uidも作成されてしまうので、その後でそれらを取得しても、 区別はできないと思われます。 ~~上記コードの「success?.user.」と打ち込んでメソッドをみてみると、 userdefaults.standardのように fs_setBoolVariable("", forKey: ""), fs_setIntegerVariable("", forKey: ""), fs_setVariable("", forKey: ""), fs_setFloatVariable("", forKey: "") などがあるので、これらを利用して、~~ 上記を試してみましたが、うまく利用できませんでした。 やはり、firebaseのrealtime databaseかfirestoreに自分でデータ登録するか、 もしくはfirebaseで与えられてるユーザーのemail, displayname, photoURL などの 要素の初期値を変更したかどうかで条件分岐するのがいいのではないでしょうか? これで解決できるのではないでしょうか??? ちなみに、調べた限り、firebaseのAuthenticationの consoleに表示されている作成日とログイン日は Administer権限がないと取得できないみたいなので、 実際にアプリのコード内で利用することはできないと思います。 [参考URL] https://firebase.google.com/docs/auth/admin/manage-users?hl=ja 長くなってしまいました。