[Flutter]共有Apple キーチェーンを使ったアプリ間認証を有効にする場合の注意点
やりたかったこと
Flutter製のアプリをリリース済みで、機能の拡充でiOSのHomeScreenWidgetsを作ることになった。
認証はFirebaseAuthを利用していて、iOSのHomeScreenWidgetでアプリ側で認証してるAuthを取得したかった。
が、うまくいかなかった...
共有方法
キーチェーンアクセスグループを利用してAuthの状態を共有する方法
Flutter側
FirebaseAuth.instance.setSettings(userAccessGroup: 'キーチェーン用のIDをセット');
Widget側
try? Auth.auth().useUserAccessGroup("キーチェーン用のIDをセット")
ここで注意点⚠️
新規でアプリを作る際はこれでOKなのだが、すでにFlutter側でuserAccessGroupなしでリリース済みの場合、setSettingsでuserAccessGroupを設定してしまうと、Authの認証が切れてしまう問題が起こる。
それを防ぐために、ログイン中のユーザーを共有キーチェーンに移行する処理を必ず行う必要がある。
マイグレーション方法
SwiftではupdateCurrentUserを使ってuserをアップデートする方法が記載されている。
Auth.auth().updateCurrentUser(user!) { error in
// Error handling
}
...が、FlutterにupdateCurrentUserがない....
2023年からIssueが上がってた
[FIREBASE_AUTH] userAccessGroup setting signs users out, and there's no way to migrate existing users
どう回避したか
Authの認証をしたかどうかを知りたかったので、SharedPreferences経由で値を渡して判断させた。
(アプリ)Flutter
①SharedPreferencesに保存
②MethodChannelでSwift側のコードを実行
↓
(アプリ)Swift
③UserDefaults.standardからSharedPreferencesに保存したものを取り出す
④アプリグループ用のUserDefaultsを作成し、そこに保存
↓
(HomeScreenWidget)Swift
⑤アプリグループ用のUserDefaultsからアプリ側で保存された値を取得
一旦MethodChannelとか使って遠回りしたけど、HomeWidget.saveWidgetData
使えば良い
最後に
もし、今作ってるアプリでちょっとでも機能追加でiOSのHomeScreenWidgetを作る可能性がありそうなら、事前にキーチェーンアクセスグループの設定をしておいた方がいいかも
(他の方法をご存知の方いたらコメントください)
Discussion