さまざまなFirebase環境(開発と本番)でさまざまなフレーバーのFlutterアプリを構築しています。 Xcode foriOSアプリでの開発と本番用に異なるバンドルIDを設定する必要があります。
私はスキームを使用してさまざまなフレーバーを構成しています(ビルド設定で、すべての構成に環境値を追加します)。
しかし、私は$(PRODUCT_BUNDLE_IDENTIFIER)
の変更に大きな問題があります。開発アプリIDの通常のアプリIDにサフィックス_.development
_を追加する必要があります。
このメソッド (ユーザー定義設定を使用)に従って、_info.plist
_を変更してユーザー定義設定から変数を取得しようとしましたが、機能しません。
エラーは次のとおりです。
操作を完了できませんでした。アプリケーション「$(EXAMPLE_BUNDLE_ID)」はFrontBoardに認識されていません。
したがって、ユーザー定義設定を渡すと、正しく補間されないように見えます。
また、デフォルトの_PRODUCT_BUNDLE_IDENTIFIER
_とユーザー定義設定を追加する方法を組み合わせてみました。例:com.example.app$(EXAMPLE_BUNDLE_ID)
where _EXAMPLE_BUNDLE_ID
_ = _.development
_
また、[ユーザー定義設定] $(EXAMPLE_BUNDLE_ID)
を参照して、[ID]の下の[ターゲット全般]タブの[バンドルID]に直接追加してみます。しかし、これは次のように変更されます:_-- EXAMPLE_BUNDLE_ID-
_
また、_info.plist
_でバンドル識別子の値に$(PRODUCT_BUNDLE_IDENTIFIER)$(EXAMPLE_BUNDLE_ID)
を使用してみました。しかし、これは同様のエラーをもたらします:
操作を完了できませんでした。アプリケーション「com.example.app $(EXAMPLE_BUNDLE_ID)」はFrontBoardに認識されていません。
繰り返しますが、これは補間の問題のように見えます。
誰かが解決策を知っていますか?見てみましたが答えが見つかりません。
productFlavors
で_applicationIdSuffix ".development”
_を使用するだけなので、Androidの場合、これは簡単です。しかし、Xcodeではこのような方法を見つけることができません。
package name
プラグインを使用する必要があるため、異なるbundle id
(Android)とFirebase Auth
(iOS)を使用する必要がありますか?
この場合、iOSプロジェクトでは、PlistBuddy
の使用を検討し、Run Script
にXCode build phases
を追加して設定できます。
if [ "${CONFIGURATION}" = "Debug" ]; then
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.developmento.appName" "$PROJECT_DIR/Runner/Info.plist"
echo "Changed bundle id for developement $PROJECT_DIR/Runner/Info.plist"
else
echo "Nothing to do"
fi
とにかく、Firebase Auth
を使用しない場合は、異なるFirebaseプロジェクトで同じバンドルIDを持つことができます。
次に、Firebaseプロジェクトファイルをステージングと本番環境で区別する必要がある場合は、こちらをご覧ください。
ビルドフレーバーに基づいて開発と本番のFirebaseプロジェクトを選択する方法は?
[〜#〜]更新[〜#〜]
それで、OPチャットに続いて、彼がこれをフォローしていることを知って tutorial セットアップするflutter flavors
私は自分たちが立ち往生している場所を確認しようとしました。
開始点は次のとおりです。
Firebase project
Firebase Auth
モジュールの使用(プロジェクト間でバンドルIDを変更する必要があるため)GoogleService-Info.plist
Xcode bundle id
とGoogleService-Info.plist
を本番環境に設定して開始します(オプションのみ)
次に、GoogleServices-Info-staging.plist
とGoogleServices-Info-production.plist
の両方をios/Runnerフォルダーに保存しました
次に、Compile Sources
のスクリプトの前にこのビルドスクリプトを設定します
# Type a script or drag a script file from your workspace to insert its path.
if [ "${CONFIGURATION}" == "Debug" ] || [ "${CONFIGURATION}" == "Debug-Runner-staging" ]; then
echo "Setting up staging firebase environment"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.staging.flutterAppAuthFlavours" "${PROJECT_DIR}/Runner/Info.plist"
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-staging.plist" "${PROJECT_DIR}/Runner/GoogleService-Info.plist"
echo "$(date) staging flavour - Configuration: ${CONFIGURATION}" > "${PROJECT_DIR}/environment.txt"
Elif [ "${CONFIGURATION}" == "Debug-Runner-production" ]; then
echo "Setting up production firebase environment"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier com.example.flutterAppAuthFlavours" "${PROJECT_DIR}/Runner/Info.plist"
cp -r "${PROJECT_DIR}/Runner/GoogleService-Info-production.plist" "${PROJECT_DIR}/Runner/GoogleService-Info.plist"
echo "$(date) production flavour - Configuration: ${CONFIGURATION}" > "${PROJECT_DIR}/environment.txt"
fi
そして私はそれをSetup Firebase Environment
と呼びました(あなたはそれをあなたが望むものと呼ぶことができます)
このスクリプトは、xcodeビルドの実行内容を簡単に確認できるように、いくつかのログ(タイムスタンプ付き)をios
フォルダー内のenvironment.txt
というファイルに保存します。
そして今、Schemes
とBuild Configurations
について:
私のBuild Configuration
の正確なコピーであるtwoDebug Build Configuration
を実行し、それらを呼び出しました
Debug-Runner-staging
Debug-Runner-production
経験則では、ビルド構成に'Debug-<your flavor>'
という名前を付け、すべてのフレーバーのスキームを用意する必要があるので、次のようにします。
Runner-staging
その実行はDebug-Runner-stagingビルド構成を呼び出しますRunner-production
その実行はDebug-Runner-productionビルド構成を呼び出しますしたがって、flutter run --flavor Debug-staging
を呼び出すと、ステージングFirebaseプロジェクトで実行されるビルドがあります。
flutter run --flavor Debug-production
を呼び出すと、productionfirebaseプロジェクトで実行されるビルドがあります。
更新2
完全を期すために、ここでもバンドルIDを変更できます。
とにかく、奇妙な振る舞いがあるようです。2回目にflavour
をビルドすると、flutter
コマンドが正しくフレーバーをビルドしますが、 previosビルドフレーバーを実行します。
XCode
を使用してビルドし、スキームを使用して切り替えると、すべて期待どおりに機能するため(適切なアプリケーションを実行した場合でも)、これはフラッターコマンドの問題である可能性があります。だから私はあなたが問題を提出しようとすることをお勧めします ここ これもリンクしますSO質問/回答。
更新
少し情報を得た後、flutter tools
がプロジェクトをビルドする前にアプリケーションの起動環境を設定していることがわかりました。したがって、最初にInfo.plist
内でCFBundleIdentifier
を変更すると、2回目にflutter run
を起動すると、前に変更した値を取得し、ビルド中にこのバンドルIDを起動しようとします。これは、別のビルドを行っているためです。バリアント。
考えられる解決策は、Info.plist
を呼び出す前に、fluetter run
内のCFBundleIdentifier
を変更するscriptを起動することです。
たとえば、Info.plist
で始まり、プロダクションバンドルIDがcom.example.flutterAppAuthFlavours
の場合、次のようなことができます。
ここでは、違う考えをするためにsed
コマンドを使用しましたが、flutter run
を呼び出す前に、常に以下のPlistBuddy
を呼び出して変更を加えることができます。