[Xamarin] Firebaseプロジェクトを開発用と本番用で使い分けてみた
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の修正
下記を追加しておきます。
!/*.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の設定を続ける」を選択します。
ポチポチと進めていき、接続待機の画面を表示しておきます。
アプリを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ファイルとも)
<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の修正
下記を追加しておきます。
!/*.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
に初期化とイベント送信をお試し実装します。
ハイライト部分が追加したコードです。
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プロジェクトで表示されました!!!
さいごに
「手動運用(リリースビルド前に自分でコピー)」でも出来ますが、負けた気になるので頑張りました。
他にもやり方がありそうです。