【Firebase】currentUser はアプリを削除しても nil にならない件

【Firebase】currentUser はアプリを削除しても nil にならない件

Firebase では以下のようにユーザー情報を取得します。

Auth.auth().currentUser

非ログイン状態だと currentUsernil を返します。

メールアドレスやGoogleアカウントなどの任意の方法でログインすると、この currentUser はユーザー情報を返却します。

そして、ログアウトすると再び nil となります(ログイン・ログアウトについてはこちらの記事をどうぞ)。

ログアウトしないままアプリ削除した場合

では、ログアウトしないままアプリを削除した場合どうなるでしょうか

実はアプリ削除・再インストールしても currentUsernil にはなりません。

これ、筆者は勘違いしていたのですが、ユーザー情報はアプリの記憶領域ではなく、キーチェーンに保存されるようになっています

そのため、アプリの初回起動時にログインされたままだと不都合が生じるようなアプリの場合、起動時にログアウトを一旦かませる必要が出てきます。

匿名ユーザー利用できるアプリの場合

例えば、メールアドレス等でユーザー登録しなくても全てまたは一部機能が使えるアプリでは、アプリ初回起動時に匿名ユーザーとして自動ログインしてアプリを利用してもらうような仕様が考えられます

匿名ユーザーでログインしている場合は通常アプリ内にログアウト機能は表示されていないはずなので、アプリを再インストールしたときに currentUser を確認して初回起動の場合はログアウトさせるようにします。

初回起動かどうかは UserDefaults@AppStorage 変数 を使って管理すると良いでしょう。

簡単な例を紹介します。

初回起動時にログインしていたらログアウトする例

struct SplashView: View {
    
    @AppStorage("isSignedIn") var isSignedIn = false
    
    var body: some View {
        Text("Splash View")
        .onAppear() {
            if let _ = Auth.auth().currentUser {
                if !isSignedIn {
                    do {
                        try Auth.auth().signOut()
                        signIn()
                    } catch let error as NSError {
                        エラー処理
                    }
                } else {
                    ホーム画面などへ
                }
            } else {
                signIn()
            }
        }
    }

    private func signIn() {
        Auth.auth().signInAnonymously { authResult, error in
            guard let user = authResult?.user else { return }
            isSignedIn = true
        }
    }
}

※エラー処理は省略しています。

Auth.auth().currentUser nil ではない場合は @AppStorageisSignedIn をチェックして false の時にログアウト(signOut)させています

ただし、この設計の注意点として、ログアウトしたあと新しいユーザーとして再ログインしているため、使われなくなるゾンビのユーザーアカウントが延々と増え続けてしまいます

一定期間使用されていない匿名ユーザーアカウントは自動的に削除するなどの対応が必要になってくるので、そもそもの設計としてどうなのかという疑問もあります。

以上