私は新しいFirebase iOS SDKで遊んでいます、私のプロジェクトでは、ターゲットが1つだけで、異なるバンドル識別子で2つの構成、デバッグとリリースを作成しましたが、Firebaseからダウンロードされた設定ファイルは1つのバンドル識別子のみをサポートしているようです.
だから誰もが複数のバンドル識別子のXcodeプロジェクト内でfirebaseを使用する方法を知っていますか?
ありがとう!
更新:Firebase公式ドキュメントを参照https://firebase.google.com/docs/projects/multiprojects
より簡単な解決策で更新されました:
1. keep the same names for both GoogleService-Info.plist
2. put one GoogleService-Info.plist inside a subfolder, say "staging"
3. add references to both files in Xcode while linking them to corresponding targets
4. just use FIRApp.configure() in your AppDelegate, done
問題を解決しなかった私の最初の試み:
2番目のGoogleService-Info.jsonを別の名前に変更し、次のコードを使用して、AppDelegateからFirebaseを構成しました。
// Swift code
#if STAGING
let firebasePlistFileName = "GoogleService-Staging-Info"
#else
let firebasePlistFileName = "GoogleService-Info"
#endif
let firbaseOptions = FIROptions(contentsOfFile: NSBundle.mainBundle().pathForResource(firebasePlistFileName, ofType: "plist"))
FIRApp.configureWithOptions(firbaseOptions)
ステージングターゲットを実行すると、「構成ファイルが見つかりませんでした: 'GoogleService-Info.plist'」に関するFirebaseの苦情を受け取ります。しかし、その後、「Firebase Analytics v.3300000が開始されました」と表示されます。
Firebaseダッシュボードで確認したように、運用アプリとステージングアプリの両方で、受信ユーザーイベントがログに記録されます。
上記のconfigureWithOptionsメソッドは、Firebaseのドキュメントには記載されていませんが、ソースコードを確認して理解しました。これを呼び出すことのマイナス面についてはわかりません。他のアプローチを聞きたいです。
異なるバンドル識別子を持つ単一のターゲットに対して2つのスキームがあったので、似たようなものを実装しました。以下の私の例では、UAT用とPROD用の2つの異なるスキームがあります。
2つのGoogleService-Info.jsonファイルを作成し、それらを異なるフォルダーのプロジェクトディレクトリ(Xcodeプロジェクトではない)に配置します。
ROOT/config/UAT/GoogleService-Info.json
ROOT/config/PROD/GoogleService-Info.json
次に、次のようにファイルをXcodeプロジェクトに追加します。
次に、ビルドフェーズで実行スクリプトを追加する必要があります。これは、ソースのコンパイル段階の前に追加する必要があります。
この実行スクリプトは、適切に配置されたjsonファイルを取得し、ビルドアプリディレクトリに複製します。つまり、Firebase/Googleは、単一の識別子設定でファイルを識別する方法と同じように識別します。
isUAT=`expr "$GCC_PREPROCESSOR_DEFINITIONS" : ".*UAT=\([0-9]*\)"`
RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/PROD
if [ $isUAT = 1 ]; then
RESOURCE_PATH=${SRCROOT}/${PRODUCT_NAME}/config/UAT
fi
BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Copying all files under ${RESOURCE_PATH} to ${BUILD_APP_DIR}"
cp -v "${RESOURCE_PATH}/"* "${BUILD_APP_DIR}/"
同様のjson設定ファイルのセットアップを使用するGoogleアナリティクスでも、同じロジックを使用できると推定します。
ターゲットが1つしかない場合のより良いアプローチは、構成に適切な名前を付けて、以下のようにロードすることです。 UAT環境の例では正常に動作しているようです:Swift 3.0
var fireBaseConfigFile = Bundle.main.path(forResource: "GoogleService-Info-PROD", ofType: "plist")
#if UAT
fireBaseConfigFile = Bundle.main.path(forResource: "GoogleService-Info-UAT", ofType: "plist")
#endif
guard let firOptions = FIROptions(contentsOfFile: fireBaseConfigFile) else {
assert(false, "Failed to load Firebase config file")
return
}
FIRApp.configure(with: firOptions)
2つのGoogleService-Infoを異なる名前で保存しました:
GoogleService-Info.plist
生産用GoogleService-Info-Debug.plist
開発用そして、Build Phases
、新しい実行スクリプトを追加します。
if [ "${CONFIGURATION}" == "Release" ]; then
cp -r "${PROJECT_DIR}/PathToYourGoogleServiceInfoFile/GoogleService-Info.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
echo "Production plist copied"
Elif [ "${CONFIGURATION}" == "Debug" ]; then
cp -r "${PROJECT_DIR}/PathToYourGoogleServiceInfoFile/GoogleService-Info-Debug.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
echo "Development plist copied"
fi
両方のGoogleサービスプリストを異なる名前でプロジェクトに追加します。
次に、ビルドスキームごとに、[スキームの編集]を選択し、次のように環境変数に一意の値を追加します。
したがって、他のビルドスキームのBUILD_FOR環境変数は、たとえば「DEV」に設定されます。
次に、App Delegateでこの変数をチェックし、構築されたスキームに従ってFIRAppを構成します。
let buildFor = ProcessInfo.processInfo.environment["BUILD_FOR"]! as String
var firebasePlistFileName = "GoogleService-Info"
if buildFor == "PROD" {
firebasePlistFileName = "GoogleService-Prod-Info"
}
let firbaseOptions = FIROptions(contentsOfFile: Bundle.main.path(forResource: firebasePlistFileName, ofType: "plist"))
FIRApp.configure(with: firbaseOptions!)
AppDeletage.mでObjective-Cを使用:
NSString *filePath;
#ifdef DEBUG
filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Debug" ofType:@"plist"];
#else
filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Production" ofType:@"plist"];
#endif
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];
Firebaseには 公式ドキュメント が含まれています。私は自分のアプリでこの方法を使用しましたが、うまく機能します。
具体的には、XCodeでカスタムSwiftフラグ "BUILD_TYPE"を定義し、スキームごとにそのフラグに一意の値を定義します。その後、AppDelegateで、FirebaseにGoogleService-___.plist
実行時にロードするファイルSwiftフラグ値:
let filePath = Bundle.main.path(forResource: "GoogleService-" + Bundle.main.infoDictionary!["BUILD_FLAVOR"] as! String, ofType: "plist")
guard let fileopts = FirebaseOptions.init(contentsOfFile: filePath!) else {
fatalError("Couldn't load config file")
}
FirebaseApp.configure(options: fileopts)
ターゲットを使用して多くの応答が表示されますが、スキームで区別したい場合は、次の場所に移動できます。
スキームの編集...>スキームの選択>ビルド>アクション後
PATH_TO_GOOGLE_PLISTS="${PROJECT_DIR}/MVCVMRC/Supporting Files/FirebasePlist"
cp -r "$PATH_TO_GOOGLE_PLISTS/Brazil/GoogleService-Info-preprod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
PATH_TO_GOOGLE_PLISTS
を変更することを忘れないでください
2つのターゲット(2つのPlistファイル)に対してfirebaseを構成するための最新の構文はこちらです
func configureFirebase() {
let firebasePlistFileName = ConfigurationManager.sharedManager().firebasePlistName()
if let path = Bundle.main.path(forResource: firebasePlistFileName, ofType: "plist") {
if let firbaseOptions = FirebaseOptions(contentsOfFile: path) {
FirebaseApp.configure(options: firbaseOptions)
}
}
}
firebasePlistFileName変数は、現在の構成(開発または本番)に基づいてPList名を取得しているだけです。