Flutter×Firebase匿名認証: アプリをアンインストール→インストールした時のiOSとAndroidでの挙動の違い
FlutterでFirebaseの匿名認証の機能を確認している際、
アプリをアンインストールして再インストールしたときの
iOSとAndroidの挙動の違いがあり、ハマりました。
挙動の違い
Firebase 匿名認証を行う場合、
以下のようにsignInAnonymously()
を呼び出して匿名でのユーザーログインを行います。
await FirebaseAuth.instance.signInAnonymously();
アプリのインストール後、
signInAnonymously()
が呼び出されているかどうかで、
if (FirebaseAuth.instance.currentUser != null) {
// signInAnonymously()が既に呼び出されている
} else {
// signInAnonymously()がまだ呼び出されていない
}
と、getCurrentUser
メソッド(現在ログインしているユーザーを取得するメソッド)
の挙動が変わるのですが、テスト目的でアプリをアンインストールし、
再インストールした際に気づいた現象があります。
-
iOS: アプリをアンインストールして再インストールしても、
FirebaseAuth.instance.currentUser
がNULLにならない -
Android: アプリをアンインストールして再インストールすると、
FirebaseAuth.instance.currentUser
がNULLになる
原因分析:プラットフォーム固有の動作
iOSの場合
iOSでは、ユーザーの認証情報はKeychainに保存されます。Keychainはアプリ固有のストレージとは別に管理され、アプリがアンインストールされてもKeychainの情報は削除されません。これはAppleのセキュリティ設計の一部で、ユーザーエクスペリエンスを向上させる目的があります。
同じ開発者の同じアプリを再インストールした場合、以前の認証情報を回復できるため、ユーザーが再度ログインする必要がなくなるというメリットがあります。
Androidの場合
対照的に、Androidではアプリをアンインストールすると、アプリに関連するすべてのデータ(認証情報を含む)が削除されます。これは、アプリのデータを完全にクリーンアップするというAndroidの設計思想に基づいています。
そのため、再インストール時には新しいインスタンスとして扱われ、FirebaseAuth.instance.currentUser
はnullを返します。
iOSエミュレーターのKeychainの情報を削除するには?
以下の手順で削除することができます。
ただ、Keychain以外の情報も消える物があるため注意が必要です。
おしまいに
これがわかるのに1日費やしてしまいました。
Discussion