web-dev-qa-db-ja.com

新しいFirebaseでは、Xcodeで複数の構成ファイルを使用する方法は?

私は新しいFirebase iOS SDKで遊んでいます、私のプロジェクトでは、ターゲットが1つだけで、異なるバンドル識別子で2つの構成、デバッグとリリースを作成しましたが、Firebaseからダウンロードされた設定ファイルは1つのバンドル識別子のみをサポートしているようです.

だから誰もが複数のバンドル識別子のXcodeプロジェクト内でfirebaseを使用する方法を知っていますか?

ありがとう!

33
coolbeet

更新: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のドキュメントには記載されていませんが、ソースコードを確認して理解しました。これを呼び出すことのマイナス面についてはわかりません。他のアプローチを聞きたいです。

47
Chris Chen

異なるバンドル識別子を持つ単一のターゲットに対して2つのスキームがあったので、似たようなものを実装しました。以下の私の例では、UAT用とPROD用の2つの異なるスキームがあります。

2つのGoogleService-Info.jsonファイルを作成し、それらを異なるフォルダーのプロジェクトディレクトリ(Xcodeプロジェクトではない)に配置します。

ROOT/config/UAT/GoogleService-Info.json
ROOT/config/PROD/GoogleService-Info.json

次に、次のようにファイルをXcodeプロジェクトに追加します。

Xcode project advised folder structure

次に、ビルドフェーズで実行スクリプトを追加する必要があります。これは、ソースのコンパイル段階の前に追加する必要があります。

Drag the Run Script to above Compile Sources

この実行スクリプトは、適切に配置された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アナリティクスでも、同じロジックを使用できると推定します。

17
Chris Conway

ターゲットが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)
12
TheiOSChap

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
9
Tai Le

両方のGoogleサービスプリストを異なる名前でプロジェクトに追加します。

enter image description here

次に、ビルドスキームごとに、[スキームの編集]を選択し、次のように環境変数に一意の値を追加します。

enter image description here

したがって、他のビルドスキームの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!)
7
vikzilla

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];
3
Bruno Lemos

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)
2
levibostian

ターゲットを使用して多くの応答が表示されますが、スキームで区別したい場合は、次の場所に移動できます。

スキームの編集...>スキームの選択>ビルド>アクション後

  • 実行スクリプトを追加する
  • ビルド設定を提供します:(目的のターゲットを選択します)
  • 次のスクリプトを追加
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を変更することを忘れないでください

サンプル: - Sample

0
RodolfoAntonici

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名を取得しているだけです。

0
Hemant Sharma