この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Firebase Analytics等を使うとき、アプリの環境(開発用と本番用)でFirebaseプロジェクトを変更したくなりました。
- 開発用アプリ: 開発用のFirebaseプロジェクト
- 本番用アプリ: 本番用のFirebaseプロジェクト
そこで、開発用アプリと本番用アプリで、google-services.json
とGoogleService-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 |
Android アプリの対応
ライブラリの追加
NuGetパッケージのXamarin.Firebase.Analytics
をAndroidプロジェクトにインストールします。
google-services.json の取得
開発用のFirebaseプロジェクトでアプリ追加を行い、開発用の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
のビルドアクションをそれぞれGoogleServicesJson
にします。
この項目が存在しない場合は、Visual Studioを再起動したり、ソリューションのリビルドをすれば現れます。
.gitignoreの修正
下記を追加しておきます。
.gitignore
!/*.Android/Configs/*
ビルド条件の対応
Visual Studioを一度終了させ、Androidプロジェクト配下のXFFirebaseMultiSample.Android.csproj
をテキストエディタで開きます。
google-services.json
の記述を下記のように書き換えます。
XFFirebaseMultiSample.Android.csproj
<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
に初期化とイベント送信をお試し実装します。
ハイライト部分が追加したコードです。
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の設定を続ける」を選択します。
ポチポチと進めていき、接続待機の画面を表示しておきます。
アプリをDebugビルドし、実行します。
接続成功すればOKです!!
本番用
本番用のFirebaseプロジェクトに移動し、同様の手順を実施します。
ここでは、アプリをReleaseビルドし、実行します。
こちらも、接続成功すればOKです!!!
動作確認
こちらを参考にDebugViewの設定を行います。
まずは、アプリをDebugビルドで実行します。開発用のFirebaseプロジェクトで表示されました!!!
続けて、アプリをReleseビルドで実行します。
本番用のFirebaseプロジェクトで表示されました!!!
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.plist
のIS_ANALYTICS_ENABLED
をTrue
に変更します。(2ファイルとも)
GoogleService-Info.plist
<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
のビルドアクションをBundleResource
にします。
.gitignoreの修正
下記を追加しておきます。
.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.plist
がiOSプロジェクト直下にコピーされます。
※「iOSプロジェクト」のビルド前イベントだとうまく出来ませんでした。
※Androidと同じようにやると、アプリ実行時にGoogleService-Info.plist
が無いと怒られました。iOSではプロジェクト直下にファイルが必要みたいです。
初期化コードの追加
AppDelegate.cs
に初期化とイベント送信をお試し実装します。
ハイライト部分が追加したコードです。
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ビルドし、実行します。
接続成功すればOKです!!
本番用
本番用のFirebaseプロジェクトに移動し、同様の手順を実施します。
ここでは、アプリをReleaseビルドし、実行します。こちらも、接続成功すればOKです!!!
動作確認
こちらとこちらを参考に--argument=-FIRDebugEnabled
を追加します。
DebugとReleaseを切り替える場合は、リビルドを行ってください。
まずは、アプリをDebugビルドで実行します。開発用のFirebaseプロジェクトで表示されました!!!
続けて、アプリをReleseビルドで実行します。本番用のFirebaseプロジェクトで表示されました!!!
さいごに
「手動運用(リリースビルド前に自分でコピー)」でも出来ますが、負けた気になるので頑張りました。
他にもやり方がありそうです。