[Xamarin] Firebaseプロジェクトを開発用と本番用で使い分けてみた

Firebase Analytics等を使うとき、アプリの環境(開発用と本番用)でFirebaseプロジェクトを変更したくなりました。

  • 開発用アプリ: 開発用のFirebaseプロジェクト
  • 本番用アプリ: 本番用のFirebaseプロジェクト

そこで、開発用アプリと本番用アプリで、google-services.jsonGoogleService-Info.plistの使い分けを試してみました。

目次

環境

  • Windows
    • Windows 10 Pro
    • Visual Studio Community 2019: 16.1.6
  • macOS
    • macOS Mojave 10.14.5
    • Visutal Studio Community 2019 for Mac: 8.1.5
    • Xcode: 10.2.1
  • Android
    • Pixel 3a: Android 9
  • iOS Simulator
    • iPhone Xs: iOS 12.2
  • Xamarin
    • Xamarin: 16.1.0.545
    • Xamarin.Android SDK: 9.3.0.23
    • Xamarin.iOS and Xamarin.Mac SDK: 12.10.0.157
  • Library
    • 共通
      • Xamarin.Forms: 4.0.0.425677
    • Android
      • Xamarin.Firebase.Analytics: 60.1142.1
    • iOS
      • Xamarin.Firebase.iOS.Analytics: 5.5.0

Firebase プロジェクトの作成(開発用 & 本番用)

Firebaseコンソールにアクセスし、開発用と本番用のFirebaseプロジェクトを作成します。

ターゲット プロジェクト名
開発用 XFFirebaseMultiSample-dev
本番用 XFFirebaseMultiSample-prod

Firebaseプロジェクトの作成(開発用)

Firebaseプロジェクトの作成(本番用)

Android アプリの対応

ライブラリの追加

NuGetパッケージのXamarin.Firebase.AnalyticsをAndroidプロジェクトにインストールします。

google-services.json の取得

開発用のFirebaseプロジェクトでアプリ追加を行い、開発用のgoogle-services.jsonをダウンロードします。

開発用のgoogle-services.jsonをダウンロードする

ここでキャンセルし、本番用のFirebaseプロジェクトに移動し、同じように本番用のgoogle-services.jsonをダウンロードします。

google-services.json の追加

Visual Studioで下記のようにgoogle-services.jsonを追加します。

  • Configs\Debug\google-services.json
  • Configs\Release\google-services.json

google-services.jsonを配置する

追加後、google-services.jsonのビルドアクションをそれぞれGoogleServicesJsonにします。 この項目が存在しない場合は、Visual Studioを再起動したり、ソリューションのリビルドをすれば現れます。

.gitignoreの修正

下記を追加しておきます。

!/*.Android/Configs/*

ビルド条件の対応

Visual Studioを一度終了させ、Androidプロジェクト配下のXFFirebaseMultiSample.Android.csprojをテキストエディタで開きます。

google-services.jsonの記述を下記のように書き換えます。

<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
  <GoogleServicesJson Include="Configs\Debug\google-services.json" />
</ItemGroup>
<ItemGroup Condition=" '$(Configuration)' == 'Release' ">
  <GoogleServicesJson Include="Configs\Release\google-services.json" />
</ItemGroup>

初期化コードの追加

MainActivity.csに初期化とイベント送信をお試し実装します。 ハイライト部分が追加したコードです。

using Android.App;
using Android.Content.PM;
using Android.Runtime;
using Android.OS;

using Firebase.Analytics;

namespace XFFirebaseMultiSample.Droid
{
    [Activity(Label = "XFFirebaseMultiSample", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            var analytics = FirebaseAnalytics.GetInstance(this);

            base.OnCreate(savedInstanceState);

            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());

            var bundle = new Bundle();
            bundle.PutString(FirebaseAnalytics.Param.ItemCategory, "Monday");
            bundle.PutString(FirebaseAnalytics.Param.ItemName, "21:54");
            bundle.PutInt(FirebaseAnalytics.Param.ItemId, 2154);
            analytics.LogEvent(FirebaseAnalytics.Event.SelectContent, bundle);
        }
        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
}

Firebase プロジェクトで接続確認

開発用

開発用のFirebaseプロジェクトを開き、「SDKの設定を続ける」を選択します。

「SDKの設定を続ける」を選択する

ポチポチと進めていき、接続待機の画面を表示しておきます。

接続待機画面を表示しておく

アプリをDebugビルドし、実行します。

Debugビルドでアプリを実行する

接続成功すればOKです!!

接続成功!

本番用

本番用のFirebaseプロジェクトに移動し、同様の手順を実施します。

ここでは、アプリをReleaseビルドし、実行します。

Releaseビルドでアプリを実行する

こちらも、接続成功すればOKです!!!

動作確認

こちらを参考にDebugViewの設定を行います。

まずは、アプリをDebugビルドで実行します。開発用のFirebaseプロジェクトで表示されました!!!

開発用のFirebaseプロジェクトのDebugViewで表示された様子

続けて、アプリをReleseビルドで実行します。

本番用のFirebaseプロジェクトで表示されました!!!

本番用のFirebaseプロジェクトのDebugViewで表示された様子

iOS アプリの対応

ライブラリの追加

NuGetパッケージのXamarin.Firebase.iOS.AnalyticsをiOSプロジェクトにインストールします。

GoogleService-Info.plist の取得

Androidと同じように、開発用と本番用のアプリを追加し、開発用と本番用のGoogleService-Info.plistを取得します。

GoogleService-Info.plist の追加

ファイルのみを追加

iOSプロジェクトに下記のようにファイルを追加します。 この操作は、Visual Studio上で行わず、ローカルでファイル追加を行います。(Visual Studio上で追加してもOKです)

  • hoge.iOS\Configs\Debug\GoogleService-Info.plist
  • hoge.iOS\Configs\Release\GoogleService-Info.plist

続いて、GoogleService-Info.plistIS_ANALYTICS_ENABLEDTrueに変更します。(2ファイルとも)

<key>IS_ANALYTICS_ENABLED</key>
<true></true>

Visual Studioで追加

Visual StudioでiOSプロジェクト直下GoogleService-Info.plistを追加します。

ここで追加するGoogleService-Info.plistは、hoge.iOS\Configs\Debug\GoogleService-Info.plistをコピーしたファイルです。

GoogleService-Info.plistを配置する

追加後、GoogleService-Info.plistのビルドアクションをBundleResourceにします。

.gitignoreの修正

下記を追加しておきます。

!/*.iOS/Configs/*

ビルド前イベントの追加

共通プロジェクトのプロパティを開き、「ビルド前イベントのコマンドライン」に下記を追加します。 細かいPathは各自の環境に合わせてください。

cp "$(ProjectDir)..\$(ProjectName).iOS\Configs\$(ConfigurationName)\GoogleService-Info.plist" "$(ProjectDir)..\$(ProjectName).iOS\GoogleService-Info.plist"
touch "$(ProjectDir)..\$(ProjectName).iOS\GoogleService-Info.plist"

「ビルド前イベントのコマンドライン」の設定

これにより、Debug/Releaseビルド時、それぞれのGoogleService-Info.plistiOSプロジェクト直下にコピーされます。

※「iOSプロジェクト」のビルド前イベントだとうまく出来ませんでした。

※Androidと同じようにやると、アプリ実行時にGoogleService-Info.plistが無いと怒られました。iOSではプロジェクト直下にファイルが必要みたいです。

初期化コードの追加

AppDelegate.csに初期化とイベント送信をお試し実装します。 ハイライト部分が追加したコードです。

using System.Collections.Generic;
using System.Linq;
using Foundation;
using UIKit;

using Firebase.Analytics;

namespace XFFirebaseMultiSample.iOS
{
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            // https://github.com/xamarin/GoogleApisForiOSComponents/issues/158#issuecomment-483194061
            var foo = Firebase.Core.Configuration.SharedInstance;

            Firebase.Core.App.Configure();

            global::Xamarin.Forms.Forms.Init();
            LoadApplication(new App());


            var events = new Dictionary<string, string>
            {
                {
                    ParameterNamesConstants.ItemCategory,
                    "Friday"
                },
                {
                    ParameterNamesConstants.ItemName,
                    "17:08"
                },
            };

            var sendParams = NSDictionary<NSString, NSObject>.FromObjectsAndKeys(
                events.Values.ToArray(),
                events.Keys.ToArray()
            );

            Analytics.LogEvent(EventNamesConstants.SelectContent, sendParams);

            return base.FinishedLaunching(app, options);
        }
    }
}

Firebase プロジェクトで接続確認

DebugとReleaseを切り替える場合は、念のためリビルドを行ってください。

開発用

こちらもAndroidと同じように進めます。

開発用のFirebaseプロジェクトを開き、「SDKの設定を続ける」を選択し、接続待機させておきます。

接続待機画面を表示させておく

アプリをDebugビルドし、実行します。

Debugビルドでアプリを実行する

接続成功すればOKです!!

接続成功!!

本番用

本番用のFirebaseプロジェクトに移動し、同様の手順を実施します。

ここでは、アプリをReleaseビルドし、実行します。こちらも、接続成功すればOKです!!!

動作確認

こちらこちらを参考に--argument=-FIRDebugEnabledを追加します。

DebugView用の設定

DebugとReleaseを切り替える場合は、リビルドを行ってください。

まずは、アプリをDebugビルドで実行します。開発用のFirebaseプロジェクトで表示されました!!!

開発用のFirebaseプロジェクトのDebugViewで表示された様子

続けて、アプリをReleseビルドで実行します。本番用のFirebaseプロジェクトで表示されました!!!

本番用のFirebaseプロジェクトのDebugViewで表示された様子

さいごに

「手動運用(リリースビルド前に自分でコピー)」でも出来ますが、負けた気になるので頑張りました。

他にもやり方がありそうです。

参考