Help us understand the problem. What is going on with this article?

開発版とリリース版でFirebaseのGoogleService-Info.plistを切り替える

More than 1 year has passed since last update.

iOSアプリの開発版とリリース版で別々のFirebaseプロジェクトを使うとき、GoogleService-Info.plistを環境ごとに切り替えてあげる必要があります。
この切り替え方法についてまとめます。

環境ごとに別々のターゲットを使用する場合

ターゲット設定

Firebaseに開発用とリリース用の2つのプロジェクトを作成しておきます。
ここではBundleIDは共通にすることとします。

開発版のターゲット名はFireApp-Debug、リリース版のターゲット名はFireApp-Releaseとします。

image.png

image.png

GoogleService-Info.plistの配置

Configs/DebugとConfigs/Releaseといったように、環境ごとにディレクトリを作成し、そこにそれぞれのGoogleService-Info.plistファイルを配置します。
詳しくは後述しますが、「GoogleService-Info.plist」という名前にしておく必要があります。

image.png

各GoogleService-Info.plistをそれぞれのターゲットに関連付けるのを忘れないようにしましょう。
こうすることで、FireApp-DebugターゲットではConfigs/Debug/GoogleService-Info.plistが、FireApp-ReleaseターゲットではConfigs/Release/GoogleService-Info.plistが使用されるようになります。

image.png

image.png

あとはAppDelegateで以下のコードを実行するだけです。

FirebaseApp.configure()

ターゲットは一つで、Configurationで切り替える場合

Firebaseに開発用とリリース用の2つのプロジェクトを作成しておきます。
ここではBundleIDは共通にすることとします。

ターゲット設定

こちらの方法では開発版とリリース版でターゲットは分けないので、新しくターゲットを作成する必要はありません。
プロジェクト作成時にデフォルトで作成されるターゲットを使用することとします。

GoogleService-Info.plistの配置

Configsディレクトリ配下に、GoogleService-Info-Debug.plistとGoogleService-Info-Release.plistという名前で配置します。

image.png

どちらのファイルも、ターゲットには関連付けないようにしておいて下さい(関連付けてもいいですがバンドルに無駄なファイルが追加されるだけです)。

image.png

ビルド時にGoogleService-Info.plistにリネームする

FirebaseSDKはGoogleService-Info.plistという名前を期待しているので、ビルド時にリネームしてバンドルに追加するという手段を取ります。

ターゲットのBuild Phasesに、Run Scriptを追加します。

if [ "${CONFIGURATION}" == "Release" ]; then
  cp "${PROJECT_DIR}/${PROJECT_NAME}/Configs/GoogleService-Info-Release.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
else
  cp "${PROJECT_DIR}/${PROJECT_NAME}/Configs/GoogleService-Info-Debug.plist" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist"
fi

image.png

あとはAppDelegateで以下のコードを実行するだけです。

FirebaseApp.configure()

[非推奨] FirebaseApp.configure(options:)メソッドを使う

アプリ起動時にファイル名を指定してFirebaseSDKを設定する方法があります。
AppDelegateで以下のようなコードを書きます。

#if DEBUG
    let fileName = "GoogleService-Info-Debug"
#else
    let fileName = "GoogleService-Info-Release"
#endif
let filePath = Bundle.main.path(forResource: fileName, ofType: "plist")!
let options = FirebaseOptions(contentsOfFile: filePath)!
FirebaseApp.configure(options: options)

DebugビルドかReleaseビルドかによって、使用するGoogleService-Info.plistファイルを切り替えます。
#if DEBUGのところは他の記事を参照して下さい(これとか)。

ただしこのやり方には問題があって、アプリを実行すると以下のようなログが出力されます。

[Firebase/Core][I-COR000012] Could not locate configuration file: 'GoogleService-Info.plist'.
[Firebase/Analytics][I-ACS020006] Google App ID from GoogleService-Info.plist is empty. Please, define GOOGLE_APP_ID in GoogleService-Info.plist for Analytics to work reliably. See https://goo.gl/txkZbE
[Firebase/Analytics][I-ACS025020] Analytics requires Google App ID from GoogleService-Info.plist. Your data may be lost. Google App ID has been changed. Original, new ID: (nil), 1:230766696330:ios:86cfac58ce17318b

公式ドキュメントにもこの件に関して記載があり、FirebaseApp.configure()を実行するよりも前にGoogleService-Info.plistを参照しようとしてしまうようです。

アナリティクスデータが失われてしまう可能性があるようで、

可能な限りデフォルトの設定方法を使用することをおすすめします。

とのことなので、上述した2つの方法を使用すると良いでしょう。

この件に関連するIssueのリンクも貼っておきます: https://github.com/firebase/quickstart-ios/issues/75

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away