現在、iOSアプリの開発でfirebaseをバックエンドに用いたいと思っています。
そこでユーザー登録をTwitterでも匿名認証でもいいのですが、ユーザーを新規登録する際にfirestoreにもusers
コレクションの中にドキュメントキーにuid
を用いて保存するという一般的な手法を用いたいと思います。
しかし、firebase Authenticationのメソッドでは、新規登録と既存のユーザーアカウントにログインするという別々のメソッドが存在しなくsignInAnonymously(completion:)
やAuth().signIn(with: credential)
などのサインインしてユーザーが存在しなければユーザーを作成し、存在していればそのままログインするといったようなメソッドしかないように思われます。(メールアドレス認証をのぞいて)
しかし、これだと次のようにサインインした時にfirestoreにユーザー情報を保存する処理を書いた時、ログアウトしてサインインする度にfirestoreへの書き込みの処理が実行されるかと思います。
//Twitter認証を例にします。 var provider = OAuthProvider(providerID: "twitter.com") provider.getCredentialWith(nil) { credential, error in if error != nil { // Handle error. } if credential != nil { Auth().signIn(with: credential) { authResult, error in if error != nil { // Handle error. } // userInfoは、ユーザー情報が入った[:]型 //この部分の処理をユーザー新規登録の一回のみにしたい。 db.collection("users").document(authResult.uid).setData(userInfo) } } }
//匿名認証の場合 Auth.auth().signInAnonymously(completion: { (authResult, error) in if let error = error { print("failed to sign in anonymously: ", error) } guard let user = authResult?.user else { return } let uid = user.uid //この処理をFirebaseプロジェクトにてユーザーが新規登録された時だけの実行にしたい db.collections("users").document(uid).setData(userInfo) })
しかし、私はFirebaseのAuthentication側でユーザーが登録された時だけこのfirestoreへのユーザー情報の書き込みを行いたいです。
これを区別させる方法はあるのでしょうか?
バックグラウンド関数も考えましたが、トリガーに遅延が発生する可能性があることやできるだけClientSDKを用いたいのでここでは使わないこにしたいと思っています。
あなたの回答
tips
プレビュー