🔐

[Flutter]共有Apple キーチェーンを使ったアプリ間認証を有効にする場合の注意点

2025/01/18に公開

やりたかったこと

Flutter製のアプリをリリース済みで、機能の拡充でiOSのHomeScreenWidgetsを作ることになった。
認証はFirebaseAuthを利用していて、iOSのHomeScreenWidgetでアプリ側で認証してるAuthを取得したかった。
が、うまくいかなかった...

共有方法

https://firebase.google.com/docs/auth/ios/single-sign-on?hl=ja

キーチェーンアクセスグループを利用して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

https://github.com/firebase/flutterfire/issues/11870

どう回避したか

Authの認証をしたかどうかを知りたかったので、SharedPreferences経由で値を渡して判断させた。

(アプリ)Flutter
①SharedPreferencesに保存
②MethodChannelでSwift側のコードを実行

(アプリ)Swift
③UserDefaults.standardからSharedPreferencesに保存したものを取り出す
④アプリグループ用のUserDefaultsを作成し、そこに保存

(HomeScreenWidget)Swift
⑤アプリグループ用のUserDefaultsからアプリ側で保存された値を取得

一旦MethodChannelとか使って遠回りしたけど、HomeWidget.saveWidgetData使えば良い

最後に

もし、今作ってるアプリでちょっとでも機能追加でiOSのHomeScreenWidgetを作る可能性がありそうなら、事前にキーチェーンアクセスグループの設定をしておいた方がいいかも
(他の方法をご存知の方いたらコメントください)

Discussion