Prodのビルドスキームとステージング(2つの異なるバンドル識別子を使用)にビルドスキームを使用しており、各スキームに個別のGoogleService-Info.plistを使用しようとしています。 GCM(およびgooleログイン)を初期化するときに使用するplistファイルを手動で選択する方法はありますか?または、plistを使用せずに手動でセットアップを行うことは可能ですか?
ありがとう!
テスト済み:
変更することを忘れないでください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
ビルドスキーム名
@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!)
この方法を使用して、GoogleService-Info.plistを動的に構成し、異なるバンドル識別子に異なる名前を使用できると思います。
チャオ・アンドレアス
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];
この記事を確認してください: https://medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164
Xcodeで、プロジェクト内にDebug
とRelease
の2つのディレクトリを作成します。各GoogleService-Info.plist
ファイルをそこに配置します。
AppDelegate.m
のdidFinishLaunchingWithOptions
メソッド内に、コードを配置します。
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
にドラッグアンドドロップします。
それでおしまい :)
私は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から読み取ります
それで、私は単純に同じファイルをコピーして別のディレクトリに置き、それを異なるターゲットにバインドしました:
GoogleService-Info.plist
の名前が異なる場合、分析結果に影響します。 Firebaseはこれについて警告します。 https://github.com/firebase/firebase-ios-sdk/issues/230#issuecomment-32713818 。このため、これらのランタイムソリューションはどれも最高の分析結果を提供しません。
Analyticsを混乱させない2つのソリューションがあります。
各スキームで異なるターゲットを使用し、GoogleService-Info.plist
の各バージョンを独自のターゲットに関連付けます。 Xcodeの右側にあるFileインスペクターのTarget Membershipを参照してください。詳細については この質問を参照 。
ビルドフェーズスクリプトを使用して、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
を変更する必要があります。
これが私の解決策です!
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];
以上です!
Xamarin C#でこれを行う方法は次のとおりです。
string plistPath = NSBundle.MainBundle.PathForResource ("GoogleService-Info", "plist");
Options options = new Options (plistPath);
App.Configure (options);
Firebase名前空間を含めることを忘れないでください:
using Firebase.Analytics;
IOSアプリとGoogleサインインコンポーネントの統合を開始する前に、依存関係をダウンロードしてXcodeプロジェクトを構成する必要があるため、GoogleService-Info.plist.
を使用しないと達成できないと思います。そして、この プロセス は、GoogleService-Info.plist
が大きな要因を持っていることを示しています。
したがって、この SOの質問 のソリューションとアイデアは、問題の解決に役立ちます。 GoogleService-Info plist
のメインコピーをアプリから2つの個別のフォルダーに移動し、各ターゲットでビルドフェーズの「ファイルのコピー」を使用して、ターゲット固有のplistをResourcesフォルダーにインポートしました。
また、これを確認してください SO question 、それはあなたにあなたの問題に関するより多くの情報/アイデアを与えるかもしれません。
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を更新することで元のポスターが修正されたようですが、これを確認していません。
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)
}