web-dev-qa-db-ja.com

ビルドスキームごとに異なるGoogleService-Info.plistを使用します

Prodのビルドスキームとステージング(2つの異なるバンドル識別子を使用)にビルドスキームを使用しており、各スキ​​ームに個別のGoogleService-Info.plistを使用しようとしています。 GCM(およびgooleログイン)を初期化するときに使用するplistファイルを手動で選択する方法はありますか?または、plistを使用せずに手動でセットアップを行うことは可能ですか?

ありがとう!

68
nwaxgui

詳細

テスト済み:

  • Xcode 9.2
  • Xcode 10.2(10E125)

解決

  1. プロジェクト内のすべてのGoogle.plistファイル(名前は異なる)でフォルダーを作成します

enter image description here

  1. 実行スクリプトを追加

enter image description here

変更することを忘れないでくださいPATH_TO_GOOGLE_PLISTS

コード

PATH_TO_GOOGLE_PLISTS="${PROJECT_DIR}/SM2/Application/Firebase"

case "${CONFIGURATION}" in

   "Debug_Staging" | "AdHoc_Staging" )
        cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-dev.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;

   "Debug_Poduction" | "AdHoc_Poduction" | "Distribution" | "Test_Poduction" )
        cp -r "$PATH_TO_GOOGLE_PLISTS/GoogleService-Info-prod.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist" ;;

    *)
        ;;
esac

ビルドスキーム名

enter image description here

74

@inidonaの答えは私のために働いた。 Swiftに変換した後

Swift 2.3の場合:

let filePath = NSBundle.mainBundle().pathForResource("GoogleService-Info", ofType: "plist")
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configureWithOptions(options)

Swift 3.0の場合:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FIROptions(contentsOfFile: filePath)
FIRApp.configure(with: options)

Swift 4.0の場合:

let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist")!
let options = FirebaseOptions(contentsOfFile: filePath)
FirebaseApp.configure(options: options!)
59
Essam Elmasry

この方法を使用して、GoogleService-Info.plistを動的に構成し、異なるバンドル識別子に異なる名前を使用できると思います。

チャオ・アンドレアス

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];
23
inidona

この記事を確認してください: https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164

Xcodeで、プロジェクト内にDebugReleaseの2つのディレクトリを作成します。各GoogleService-Info.plistファイルをそこに配置します。

AppDelegate.mdidFinishLaunchingWithOptionsメソッド内に、コードを配置します。

Objective-C

  NSString *filePath;
#ifdef DEBUG
  NSLog(@"[FIREBASE] Development mode.");
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Debug"];
#else
  NSLog(@"[FIREBASE] Production mode.");
  filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist" inDirectory:@"Release"];
#endif

  FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
  [FIRApp configureWithOptions:options];

Swift 4

var filePath:String!
#if DEBUG
    print("[FIREBASE] Development mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Debug")
#else
    print("[FIREBASE] Production mode.")
    filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist", inDirectory: "Release")
#endif

let options = FirebaseOptions.init(contentsOfFile: filePath)!
FirebaseApp.configure(options: options)

DebugフォルダーとReleaseフォルダーの両方をBuild Phases > Copy Bundle Resourcesにドラッグアンドドロップします。

Build Phases > Copy Bundle Resources

それでおしまい :)

22
Bruno Lemos

私はgoogleがコード内のファイル名がGoogleServiceInfo.plistであることを期待していることに気付きました:

 * The method |configureWithError:| will read from the file GoogleServices-Info.plist bundled with
 * your app target for the keys to configure each individual API. To generate your
 * GoogleServices-Info.plist, please go to https://developers.google.com/mobile/add
 *
 * @see GGLContext (Analytics)
 * @see GGLContext (SignIn)
 */
@interface GGLContext : NSObject

キーフレーズはこれです

アプリターゲットにバンドルされているファイルGoogleServices-Info.plistから読み取ります

それで、私は単純に同じファイルをコピーして別のディレクトリに置き、それを異なるターゲットにバインドしました:

enter image description here

8
abbood

GoogleService-Info.plistの名前が異なる場合、分析結果に影響します。 Firebaseはこれについて警告します。 https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-32713818 。このため、これらのランタイムソリューションはどれも最高の分析結果を提供しません。

Analyticsを混乱させない2つのソリューションがあります。

  1. 各スキームで異なるターゲットを使用しGoogleService-Info.plistの各バージョンを独自のターゲットに関連付けます。 Xcodeの右側にあるFileインスペクターTarget Membershipを参照してください。詳細については この質問を参照

  2. ビルドフェーズスクリプトを使用して、GoogleService-Info.plistの正しいバージョンをビルドディレクトリにコピーします。ステージングとプロダクションに別のバンドルIDを使用します。これにより、両方のバージョンのアプリを並行してインストールできます。また、以下のスクリプトを使用して、さまざまなGoogleService-Info.plistファイルにバンドルIDを付けることができます。例えば:

    • GoogleService-Info-com.example.app.plist
    • GoogleService-Info-com.example.app.staging.plist

ビルドフェーズスクリプト

PATH_TO_CONFIG=$SRCROOT/Config/GoogleService-Info-$PRODUCT_BUNDLE_IDENTIFIER.plist
FILENAME_IN_BUNDLE=GoogleService-Info.plist
BUILD_APP_DIR=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"
cp $PATH_TO_CONFIG "$BUILD_APP_DIR/$FILENAME_IN_BUNDLE"

注:セットアップに合わせてPATH_TO_CONFIGを変更する必要があります。

Build Phase Script

4
Onato

これが私の解決策です!

NSString *filePath;
if([self isProduction]){
    filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
}else{
    filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info-Sandbox" ofType:@"plist"];
}
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];

以上です!

2

Xamarin C#でこれを行う方法は次のとおりです。

string plistPath = NSBundle.MainBundle.PathForResource ("GoogleService-Info", "plist");
Options options = new Options (plistPath);
App.Configure (options);

Firebase名前空間を含めることを忘れないでください:

using Firebase.Analytics;
1
Sune Kjærgård

IOSアプリとGoogleサインインコンポーネントの統合を開始する前に、依存関係をダウンロードしてXcodeプロジェクトを構成する必要があるため、GoogleService-Info.plist.を使用しないと達成できないと思います。そして、この プロセス は、GoogleService-Info.plistが大きな要因を持っていることを示しています。

したがって、この SOの質問 のソリューションとアイデアは、問題の解決に役立ちます。 GoogleService-Info plistのメインコピーをアプリから2つの個別のフォルダーに移動し、各ターゲットでビルドフェーズの「ファイルのコピー」を使用して、ターゲット固有のplistをResourcesフォルダーにインポートしました。

また、これを確認してください SO question 、それはあなたにあなたの問題に関するより多くの情報/アイデアを与えるかもしれません。

1
KENdi

Xcode 9.2では、両方のターゲットのファイルに「googleServiceInfo.plist」という名前を付ける必要がありますが、異なるディレクトリに配置し、「ビルドフェーズ」、「バンドルリソースのコピー」で各ターゲットのディレクトリ/ファイルを指定します。

上記は私の好みの解決策ではありませんでしたが、以前に@inidonaの回答の行に沿って異なるファイル名を使用して、Swift 4に変換しようとしました:

 let filePath = Bundle.main.path(forResource: "googleServiceInfo-Pro", ofType: "plist")!
 let options = FirebaseOptions(contentsOfFile: filePath)
 FirebaseApp.configure(options: options!)

残念ながら、これはFirebaseエラーメッセージを修正しませんでした。この質問: Firebase iOS SDK-GoogleService-Info.plist以外の構成ファイルを使用するとコンソール警告が生成されます Firebase Podを更新することで元のポスターが修正されたようですが、これを確認していません。

1
djruss70

Firebaseでplistを使用することは避けられません。私がこれまでに見つけた最良の解決策は、両方のファイルを追加して名前を付けることです

GoogleService-Info_stage.plist

そして

GoogleService-Info_prod.plist

次に、コードから正しいファイルを呼び出すことができます。この方法では、ファイルがない場合でもアプリがクラッシュしません。 FILENAMEをGoogleService-Info_prodまたはGoogleService-Info_stageに置き換えるだけです。

if let configFile = Bundle.main.path(forResource: "FILENAME", ofType: "plist"), 
    let options = FirebaseOptions(contentsOfFile: configFile)   
{
   FirebaseApp.configure(options: options)
}
0
pierre23