❤️‍🔥

Flutter×Firebase匿名認証: アプリをアンインストール→インストールした時のiOSとAndroidでの挙動の違い

2025/03/25に公開

FlutterでFirebaseの匿名認証の機能を確認している際、
アプリをアンインストールして再インストールしたときの
iOSとAndroidの挙動の違いがあり、ハマりました。

挙動の違い

Firebase 匿名認証を行う場合、
以下のようにsignInAnonymously()を呼び出して匿名でのユーザーログインを行います。

await FirebaseAuth.instance.signInAnonymously();

アプリのインストール後、
signInAnonymously()が呼び出されているかどうかで、

if (FirebaseAuth.instance.currentUser != null)  {
    // signInAnonymously()が既に呼び出されている
} else {
    // signInAnonymously()がまだ呼び出されていない
}

と、getCurrentUserメソッド(現在ログインしているユーザーを取得するメソッド)
の挙動が変わるのですが、テスト目的でアプリをアンインストールし、
再インストールした際に気づいた現象があります。

  • iOS: アプリをアンインストールして再インストールしても、FirebaseAuth.instance.currentUserNULLにならない
  • Android: アプリをアンインストールして再インストールすると、FirebaseAuth.instance.currentUserNULLになる

原因分析:プラットフォーム固有の動作

iOSの場合

iOSでは、ユーザーの認証情報はKeychainに保存されます。Keychainはアプリ固有のストレージとは別に管理され、アプリがアンインストールされてもKeychainの情報は削除されません。これはAppleのセキュリティ設計の一部で、ユーザーエクスペリエンスを向上させる目的があります。

同じ開発者の同じアプリを再インストールした場合、以前の認証情報を回復できるため、ユーザーが再度ログインする必要がなくなるというメリットがあります。

Androidの場合

対照的に、Androidではアプリをアンインストールすると、アプリに関連するすべてのデータ(認証情報を含む)が削除されます。これは、アプリのデータを完全にクリーンアップするというAndroidの設計思想に基づいています。

そのため、再インストール時には新しいインスタンスとして扱われ、FirebaseAuth.instance.currentUserはnullを返します。

iOSエミュレーターのKeychainの情報を削除するには?

以下の手順で削除することができます。
ただ、Keychain以外の情報も消える物があるため注意が必要です。
https://zenn.dev/40_comeback_eng/articles/e0dbb4515cbc7c

おしまいに

これがわかるのに1日費やしてしまいました。

Discussion