📌
iOSでflutter_secure_storageに保存したものはアンインストールしても消えない
タイトルの通り。
調べてみると情報は出てくるのだが、思いあたる節がないと気づかない。
Androidと挙動が異なる点も注意が必要。
書いていること
Androidの挙動に近づける方法。
iOS側に合わせる方法は今のところない認識。
flutter_secure_storageとは
Infoには「セキュアなストレージにデータを保存するFluterプラグイン」と書かれており、
良しなに暗号化もしてくれるパッケージ。
すごく便利なパッケージなのだが、今回落とし穴に引っかかった。
(念の為バージョンも記載すると、「6.0.0」ときに直面)
iOSでflutter_secure_storageに保存したものはアンインストールしても消えない
消えない。
検索してみるとツイッターなど出てくる。
なぜ消えないのかというと、
iOSにおいては内部でKeychainを使っているので消えないという話らしい。
「flutter_secure_storage」という名前に惑わされてしまったのもあり、私は知らなかった。
(よくよく調べたら出てくるのだが、もっと周知されてもいいんじゃなかろうか、、)
「Androidの挙動に近づける」 解決策
shared_preferences(内部的にはNSUserDefaults
)と組み合わせて使えば良い。
つまり、アプリが初起動(再インストール後の起動も含む)か否かを「shared_preferences」で管理して、
※ 一度アンインストールしたら、「shared_preferences」の中身が消えるので、データのあるなしで判断可能
初起動だったらflutter_secure_storage
(Keychain
)の中身を消す、というやり方になる。
(参考記事とはちょっと違う例として) flutter_hooks
で書くと、以下のような感じ。
final prefs = await SharedPreferences.getInstance();
// ...
useEffect(
() {
Future(() async {
// 初回起動かどうかの確認
final isFirst = await prefs.getBool('is_first')
if (isFirst == null || isFirst) {
// flutter_secure_storageのデータを破棄
final storage = FlutterSecureStorage();
await storage.deleteAll();
await prefs.setBool('is_first', false);
}
});
},
const [],
)
これで初起動後は、Androidと同じ挙動にすることができる。
以上!
Discussion