複数Flavorに対応したFlutterにFirebaseを導入する
Firebaseの設定
Firebaseプロジェクトはすでに作成されている前提で記載している。
セットアップ
とりあえずこれ試した
iOSシミュレータでアプリを実行すると以下のエラーとなる
Error (Xcode): Unable to load contents of file list: '/Target Support Files/Pods-Runner/Pods-Runner-frameworks-Debug-development-input-files.xcfilelist'
色々した挙句、Flavor設定後かつFirebaseの設定をしていないコミットまで戻り以下を実行
上記のエラーは消えたが、
Waiting for VM Service port to be available...
から動かなくなる
また同様のエラーが発生し、上記では解消できなかった。
cd ios
pod install
で以下のエラーが出たので
[!] CocoaPods did not set the base configuration of your project because your project already has a custom config set.
このエラーから下記のIssueに辿り着き、ios/Flutter/Debug.xcconfig
、ios/Flutter/Release.xcconfig
の内容を書き換えることで問題が解消した。
例)ios/Flutter/Debug.xcconfig
- #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
+ #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-development.xcconfig"
+ #include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug-production.xcconfig"
#include "Generated.xcconfig"
iOSシミュレータの再起動で解消。
Flavor対応のため作成したios/config
をXcodeにドラッグ&ドロップして、アプリを実行すると別のエラーが発生。
Error (Xcode): Multiple commands produce '.../build/ios/Debug-development-iphonesimulator/Runner.app/GoogleService-Info.plist'
下記を実施してみる。
エラーは解消した。。。
ただし、処理していた工程を除いたため大丈夫だろうか
⇧ config追加時はデフォルト設定。xcodeに追加するとbuildphaseにbundle対象のファイルとして追加されるようだ。
flutterfireで構成しているので、FlutterFire: "flutterfire bundle-service-file"でバンドルするので削除が不安だったが問題なさそうだ
Google Sign-Inを実装する
Supabaseをバックエンドとしているため、以下の記事を参考に進める
- Firebaseのログイン方法にあるGoogleプロバイダを有効にする。
- Androidは、証明書のフィンガープリントを追加する。注意点として、リリースしたアプリの署名はPlay署名になるので、別途フィンガープリントの登録が必要。
Androidフィンガープリント取得方法
上記設定後、Flutterfireによる設定ファイルの更新を行おうとすると以下のエラーが発生。
`PBXGroup` attempted to initialize an object with unknown ISA `PBXFileSystemSynchronizedRootGroup` from attributes
config
をXcodeに追加する際に、Folderとして追加したのが問題だったようだ。
Groupに変換したところ上記エラーは解消した
- iOSは設定ファイルを更新する
手順6のCFBundleURLTypes
について。
以前作成したアプリでは、arrayに開発、本番のを入れてしまっていたが、ユーザー定義変数を利用するのが良いかもしれない。今回はこちらを採用する。
スキップした手順(GIDClientID, GIDServerClientID)についてもユーザー定義変数を利用することにした。
Dartのファイル内でiOSだけの対応となる以下の実装をすることを避けるため。
final GoogleSignIn googleSignIn = GoogleSignIn(
// The OAuth client id of your app. This is required.
clientId: 'Your Client ID',
// If you need to authenticate to a backend server, specify its OAuth client. This is optional.
serverClientId: 'Your Server ID',
);
追記、そもそも6だけで良いので4, 5の手順はスキップする
Google Cloudのプロジェクトに生成されているWeb Client IDをSupabaseのAuth ProviderでGoogleを有効にする際にClinet IDs
に登録する。
iOSも利用するのでSkip nonce checkを有効にする
コードでもwebclientidとiosclientidをセットしないとエラーになる
Androidのフレーバー作成で、マニフェストに以下のように動的な値を設定していたが、
<application
- android:label="@string/app_name"
+ android:label="${appLabel}"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
のようにしても良かった。
後から見返したときに、リソースファイルを探してしまったがないどこで定義されているのかと迷ってしまった。
ビルド変数として定義することで、ビルドファイルで定義されているとすぐわかるから良いか