📌

iOSでflutter_secure_storageに保存したものはアンインストールしても消えない

2023/02/08に公開

タイトルの通り。
調べてみると情報は出てくるのだが、思いあたる節がないと気づかない。
Androidと挙動が異なる点も注意が必要。

書いていること

Androidの挙動に近づける方法。
iOS側に合わせる方法は今のところない認識。

flutter_secure_storageとは

https://pub.dev/packages/flutter_secure_storage

Infoには「セキュアなストレージにデータを保存するFluterプラグイン」と書かれており、
良しなに暗号化もしてくれるパッケージ。

すごく便利なパッケージなのだが、今回落とし穴に引っかかった。
(念の為バージョンも記載すると、「6.0.0」ときに直面)

iOSでflutter_secure_storageに保存したものはアンインストールしても消えない

消えない。
検索してみるとツイッターなど出てくる。

https://twitter.com/goccix/status/1379624323372118016?s=20&t=kWZrjKTFLhXg7B2uVnaiWQ
https://twitter.com/miyaba89/status/1497780158287122437?s=20&t=QQ5FPD29WBdVvAF9BQUb2Q

なぜ消えないのかというと、
iOSにおいては内部でKeychainを使っているので消えないという話らしい。

https://qiita.com/sachiko-kame/items/261d42c57207e4b7002a

「flutter_secure_storage」という名前に惑わされてしまったのもあり、私は知らなかった。
(よくよく調べたら出てくるのだが、もっと周知されてもいいんじゃなかろうか、、)

「Androidの挙動に近づける」 解決策

https://aroundthedistance.hatenadiary.jp/entry/2021/01/12/121036
https://stackoverflow.com/questions/57933021/flutter-how-do-i-delete-fluttersecurestorage-items-during-install-uninstall

shared_preferences(内部的にはNSUserDefaults)と組み合わせて使えば良い。

つまり、アプリが初起動(再インストール後の起動も含む)か否かを「shared_preferences」で管理して、
※ 一度アンインストールしたら、「shared_preferences」の中身が消えるので、データのあるなしで判断可能

初起動だったらflutter_secure_storageKeychain)の中身を消す、というやり方になる。
(参考記事とはちょっと違う例として) 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