prodと1つのステージング(2つの異なるバンドル識別子を使用)のビルドスキームを使用しており、各スキームに個別のGoogleService-Info.plistを使用しようとしています。GCM(およびgooleログイン)を初期化するときに使用するplistファイルを手動で選択する方法はありますか?または、plistの使用を避けて手動で設定することは可能ですか?
ありがとう!
prodと1つのステージング(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
スキーム名の作成
configure(options:)
た場合でも、アプリのルートディレクトリにそのplistファイルが必要です。github.com/firebase/quickstart-ios/issues/5
-r
、詳細:Linux / Unixのcpコマンド
@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
使用して、異なる場所に2つの異なるファイルがあるか、名前が異なる2つのファイルがあるか。実際のファイル名は何で、どこに配置されているかについて、もう少し情報を提供していただけませんか?
この記事を確認してください:https : //medium.com/@brunolemos/how-to-setup-a-different-firebase-project-for-debug-and-release-environments-157b40512164
Xcodeのでは、プロジェクト内の2つのディレクトリを作成しますDebug
とRelease
。各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];
スウィフト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
。
それでおしまい :)
Analytics
フレームワークの問題を解決していません.plist
。どちらがロードされているかはわかりません。
Debug
&Release
?これを行おうとするとalready configured crash.
、Firebaseの公式ドキュメントの最新の指示に従っていることが原因です。ありがとう
この方法を使用してGoogleService-Info.plistを動的に構成し、異なるバンドル識別子に異なる名前を使用できると思います。
チャオ・アンドレアス
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"GoogleService-Info" ofType:@"plist"];
FIROptions *options = [[FIROptions alloc] initWithContentsOfFile:filePath];
[FIRApp configureWithOptions:options];
Could not locate configuration file: 'GoogleService-Info.plist'
コードで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-327138180。このため、これらのランタイムソリューションはどれも最高の分析結果を提供しません。
Analyticsを台無しにしない2つのソリューションがあります。
各スキームで異なるターゲットを使用し、の各バージョンをGoogleService-Info.plist
独自のターゲットに関連付けます。Xcodeの右側にあるファイルインスペクタのターゲットメンバーシップを参照してください。詳細については、この質問を参照してください。
ビルドフェーズスクリプトを使用して、正しいバージョンの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
セットアップに合わせて変更する必要があります。
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)
}
新しい開発者を助けるためにこの回答を投稿する必要があると思いますが、私の問題を解決する非常に良い記事を見つけ、それもあなたに役立つと約束します:) あなたの問題を解決するこの記事も
チェックしてください。
ステップ1: Firebase開発環境に対応するGoogleService-Info.plistをDevディレクトリに
コピーします。同様に、Firebase本番環境に対応するGoogleService-Info.plistをProdディレクトリにコピーします。[ 必要に応じてアイテムをコピーする]と[ターゲットに追加]の下のすべてのターゲットのチェックを必ず外してください。
ステップ2:
Xcodeプロジェクトナビゲーターで、アプリターゲットを選択します。上部の[ビルドフェーズ]タブに切り替え、新しい実行スクリプトフェーズを追加します。フェーズに「Firebase環境のセットアップGoogleService-Info.plist」などの名前を付け、「バンドルリソースのコピー」ステップの前に配置します。
ステップ3:ビルド構成に基づいて、
適切なGoogleService-Info.plistをApp Bundleにコピーするシェルスクリプトを実装します。次のシェルスクリプトをコピーして、作成したスクリプト実行フェーズに貼り付けます。
# Name of the resource we're selectively copying
GOOGLESERVICE_INFO_PLIST=GoogleService-Info.plist
# Get references to dev and prod versions of the GoogleService-Info.plist
# NOTE: These should only live on the file system and should NOT be part of the target (since we'll be adding them to the target manually)
GOOGLESERVICE_INFO_DEV=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Dev/${GOOGLESERVICE_INFO_PLIST}
GOOGLESERVICE_INFO_PROD=${PROJECT_DIR}/${TARGET_NAME}/Firebase/Prod/${GOOGLESERVICE_INFO_PLIST}
# Make sure the dev version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_DEV}"
if [ ! -f $GOOGLESERVICE_INFO_DEV ]
then
echo "No Development GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1
fi
# Make sure the prod version of GoogleService-Info.plist exists
echo "Looking for ${GOOGLESERVICE_INFO_PLIST} in ${GOOGLESERVICE_INFO_PROD}"
if [ ! -f $GOOGLESERVICE_INFO_PROD ]
then
echo "No Production GoogleService-Info.plist found. Please ensure it's in the proper directory."
exit 1
fi
# Get a reference to the destination location for the GoogleService-Info.plist
PLIST_DESTINATION=${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app
echo "Will copy ${GOOGLESERVICE_INFO_PLIST} to final destination: ${PLIST_DESTINATION}"
# Copy over the prod GoogleService-Info.plist for Release builds
if [ "${CONFIGURATION}" == "Release" ]
then
echo "Using ${GOOGLESERVICE_INFO_PROD}"
cp "${GOOGLESERVICE_INFO_PROD}" "${PLIST_DESTINATION}"
else
echo "Using ${GOOGLESERVICE_INFO_DEV}"
cp "${GOOGLESERVICE_INFO_DEV}" "${PLIST_DESTINATION}"
fi
この回答は@abboodの回答に非常に触発されていますが、その方法についてはもう少し具体的です。
各ターゲット、たとえばdev、stg、prodについて:
GoogleService-Info.plist
ターゲットにちなんで名付けられた別のフォルダに対応するものをダウンロードしますAdd files to "your app"
GoogleService-Info.plist
ていることを確認Copy items if needed
しCreate groups
て、ターゲットのリストで対応するターゲットのみをチェックして、を押しますAdd
それでおしまい。これで、この構造に似たものができるはずです。
ターゲットをビルドすると、正しいものGoogleService-Info.plist
が使用されます。
これが私の解決策です!
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];
以上です!
GoogleService-Info.plist.
iOSアプリとGoogleサインインコンポーネントの統合を開始する前に、依存関係をダウンロードしてXcodeプロジェクトを構成する必要があるため、を使用しないと達成できないと思います。そして、このプロセスはそれGoogleService-Info.plist
がそれに大きな要因を持っていることを示しています。
したがって、このSOの質問における解決策とアイデアは、問題の解決に役立ちます。GoogleService-Info plist
アプリのメインコピーを2つの別々のフォルダーに移動し、各ターゲットでビルドフェーズの「ファイルのコピー」を使用して、ターゲット固有のplistをResourcesフォルダーにインポートしました。
また、このSOの質問を確認してください。問題の詳細情報やアイデアが得られる場合があります。
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ポッドを更新することにより元の投稿者が修正したように見えるコンソール警告が生成されますが、これは確認していません。
私はこれでこれを解決しました:
#if STAGING
if let filePath = Bundle.main.path(forResource: "GoogleService-Info-Dev", ofType: "plist"),
let options = FirebaseOptions(contentsOfFile: filePath) {
FirebaseApp.configure(options: options)
} else {
fatalError("GoogleService-Info-Dev.plist is missing!")
}
#else
if let filePath = Bundle.main.path(forResource: "GoogleService-Info", ofType: "plist"),
let options = FirebaseOptions(contentsOfFile: filePath) {
FirebaseApp.configure(options: options)
} else {
fatalError("GoogleService-Info.plist is missing!")
}
#endif