web-dev-qa-db-ja.com

Xcodeで$(PRODUCT_BUNDLE_IDENTIFIER)を変更するにはどうすればよいですか?

さまざまな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ではこのような方法を見つけることができません。

2
FlutterFirebase

package nameプラグインを使用する必要があるため、異なるbundle id(Android)とFirebase Auth(iOS)を使用する必要がありますか?

この場合、iOSプロジェクトでは、PlistBuddyの使用を検討し、Run ScriptXCode 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

enter image description here

とにかく、Firebase Authを使用しない場合は、異なるFirebaseプロジェクトで同じバンドルIDを持つことができます。

次に、Firebaseプロジェクトファイルをステージングと本番環境で区別する必要がある場合は、こちらをご覧ください。

ビルドフレーバーに基づいて開発と本番のFirebaseプロジェクトを選択する方法は?

[〜#〜]更新[〜#〜]

それで、OPチャットに続いて、彼がこれをフォローしていることを知って tutorial セットアップするflutter flavors私は自分たちが立ち往生している場所を確認しようとしました。

開始点は次のとおりです。

  • 2Firebase project
  • Firebase Authモジュールの使用(プロジェクト間でバンドルIDを変更する必要があるため)
  • そしてもちろん、2つの異なるGoogleService-Info.plist

Xcode bundle idGoogleService-Info.plistを本番環境に設定して開始します(オプションのみ)

enter image description here

次に、GoogleServices-Info-staging.plistGoogleServices-Info-production.plistの両方をios/Runnerフォルダーに保存しました

enter image description here

次に、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と呼びました(あなたはそれをあなたが望むものと呼ぶことができます)

enter image description here

このスクリプトは、xcodeビルドの実行内容を簡単に確認できるように、いくつかのログ(タイムスタンプ付き)をiosフォルダー内のenvironment.txtというファイルに保存します。

enter image description here

そして今、SchemesBuild Configurationsについて:

私のBuild Configurationの正確なコピーであるtwoDebug Build Configurationを実行し、それらを呼び出しました

enter image description here

  • Debug-Runner-staging
  • Debug-Runner-production

経験則では、ビルド構成に'Debug-<your flavor>'という名前を付け、すべてのフレーバーのスキームを用意する必要があるので、次のようにします。

  • Runner-stagingその実行はDebug-Runner-stagingビルド構成を呼び出します
  • Runner-productionその実行はDebug-Runner-productionビルド構成を呼び出します

enter image description here

enter image description here

したがって、flutter run --flavor Debug-stagingを呼び出すと、ステージングFirebaseプロジェクトで実行されるビルドがあります。

flutter run --flavor Debug-productionを呼び出すと、productionfirebaseプロジェクトで実行されるビルドがあります。

enter image description here

enter image description here

更新2

完全を期すために、ここでもバンドルIDを変更できます。

enter image description here

とにかく、奇妙な振る舞いがあるようです。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の場合、次のようなことができます。

enter image description here

enter image description here

ここでは、違う考えをするためにsedコマンドを使用しましたが、flutter runを呼び出す前に、常に以下のPlistBuddyを呼び出して変更を加えることができます。

7
shadowsheep