なんかiOSだとエラーがでてくるんだけど?
Androidの方ではうまく動いていたのに、iOSの方ではうまく動かなくなった。
下のようなエラーがsecureStorage.write(Key:key, value,value);
のところで出てきて解決に時間がかかったので備忘録として残しておく。
PlatformException(Unexpected security result code, Code: -25299, Message: The specified item already exists in the keychain., -25299, null)
エラーの調査と解決策
まったく同じエラーの内容がGitHubのissueに上がっていた。
ただ、ここの内容では、インスタンスの初期化とwriteを呼び出すところを分けるとうまくいったよと書かれているのみだった。
はぁ...詰んだ...と思って、あきらめそうになったが、なんだかんだ、ブレークポイントを置いて、一行ずつ実行して原因を調査していたら、「あれ?writeが通ったぞ?」ってなりました。
つまり、通常の実行だとエラーがでるが、一行ずつ実行すれば正常に動作するこということが分かりました。ここから推測するに非同期処理がなんか悪さしてるんじゃね?とコードを見返してみたところ、writeが非同期処理で大量に呼ばれていました。ほんとはいろいろなところにちりばめられていましたが、分かりやすくかくと以下のようなコードになっていました。
secureStorage.write(Key: key, Value: value);
...何らかの処理...
secureStorage.write(Key: key, Value: value);
...何らかの処理...
secureStorage.write(Key: key, Value: value);
...何らかの処理...
await secureStorage.write(Key: key, Value: value);
つまり、awaitをつけていないsecureStorageを同じkeyに対して、何回も呼び出しているようなコードになっていました...(汗)。自分の場合は、この上の方のsecureStorageは完全に不要な処理であったため、余分なところをすべて削除し、必要なsecureStorageを1回のみ呼び出すように修正しました。
...何らかの処理
await secureStorage.write(Key: key, Value: value);
すると、正常に動くようになりました。
まとめると、非同期にsecureStorage.write()を何回も呼び出していたため、同時にアクセスが発生したりしてエラーがでていたのではないかと推測しています。なので、解決には、非同期に何回も呼び出してしまっていないかチェックすると解決できるかもしれません。