web-dev-qa-db-ja.com

XamarinフォームでのFirebase Analytics

XamarinフォームプロジェクトでFirebase Analyticsを使用してボタン1が押されたなどのカスタムイベントを取得できますか?

14
Ashish Kumar

Xamarin Firebaseコンポーネントの新しいバージョン用に更新され、さまざまな問題を修正しました

もちろん、プラットフォームコードを呼び出すにはDI(依存性注入)が必要です。

  • Firebaseアプリを設定します: https://firebase.google.com/docs/projects/learn-more
  • Firebase Analyticsの適切なnugetパッケージを参照します。

    Androidプロジェクト

    • Xamarin.FireBase.Analytics
    • Xamarin.FireBase.Analytics.Impl
    • Plugin.CurrentActivity(現在のコンテキストを取得するために使用されます_Forms.Context_is deprecated)

    iOSプロジェクト

    • Xamarin.FireBase.iOS.Analytics(iOSプロジェクト)
  • PCL(または.NETStandard)プロジェクトでインターフェースを作成します

  • AndroidおよびiOSプロジェクトで、プラットフォーム固有のコードを記述します
  • ビューモデルで、PCL(または.NETStandard)プロジェクトのDIを使用してLogEventメソッドを呼び出し、イベントを保存します

注:カスタムイベントがFirebaseに表示されるまでに時間がかかります。私の経験では、Webコンソールに表示されるまでに24時間必要です。カスタムロギングを適切にテストする場合は、電話を使用して分析デバッグをアクティブ化します(これにより、FirebaseコンソールのdebugViewでイベントを確認できます)*


注2:eventIdプロパティに注意してください:名前は最大40文字で、英数字とアンダースコア( " ")、そしてアルファベット文字で始まる必要があります。 「firebase」、「google _」、「ga_」の接頭辞は予約されているため、使用しないでください。 eventIdを自動的に修正する小さなユーティリティ関数を含めましたが、必要に応じてそれをスキップできます


PCLまたは.NETStandardプロジェクト

_using System.Collections.Generic;

namespace MobileApp.Services
{
    public interface IAnalyticsService
    {
        void LogEvent(string eventId);
        void LogEvent(string eventId, string paramName, string value);
        void LogEvent(string eventId, IDictionary<string, string> parameters);
    }
}
_

Android

マニフェストにINTERNET権限があることを確認してください。

コンパイルアクションを「GoogleServicesJson」に設定して、google-services.json(firebaseアカウントから生成)をインポートします

AppDelegateでCrossCurrentActivity initメソッドを呼び出すことを忘れないでくださいOnCreate

_CrossCurrentActivity.Current.Init(this, bundle);
_

これはAndroidプラットフォームサービスコード:です。

_using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Android.OS;
using Firebase.Analytics;
using Plugin.CurrentActivity;
using MobileApp.Services;

namespace MobileApp.Droid.Services
{
    [Assembly: Dependency (typeof(AnalyticsServiceDroid))]
    public class AnalyticsServiceDroid : IAnalyticsService
    {

        public void LogEvent(string eventId)
        {
            LogEvent(eventId, null);
        }

        public void LogEvent(string eventId, string paramName, string value)
        {
            LogEvent(eventId, new Dictionary<string, string>
            {
                {paramName, value}
            });
        }

        public void LogEvent(string eventId, IDictionary<string, string> parameters)
        {

            //utility method to fix eventId, you can skip it if you are sure to always pass valid eventIds
            eventId = FixEventId(eventId);

            var fireBaseAnalytics = FirebaseAnalytics.GetInstance(CrossCurrentActivity.Current.AppContext);

            if (parameters == null)
            {
                fireBaseAnalytics.LogEvent(eventId, null);
                return;
            }

            var bundle = new Bundle();

            foreach (var item in parameters)
            {
                bundle.PutString(item.Key, item.Value);
            }

            fireBaseAnalytics.LogEvent(eventId, bundle);
        }

        //utility method to fix eventId, you can skip it if you are sure to always pass valid eventIds
        private string FixEventId(string eventId)
        {
            if (string.IsNullOrWhiteSpace(eventId))
                return "unknown";

            //remove unwanted characters
            eventId = Regex.Replace(eventId, @"[^a-zA-Z0-9_]+", "_", RegexOptions.Compiled);

            //trim to 40 if needed
            return eventId.Substring(0, Math.Min(40, eventId.Length));
        }

    }
}
_

Androidのデバッグビュー

FirebaseでdebugViewを有効にするには、adbコンソールコマンドプロンプトからこのコマンドを実行します(通常は_c:\WINDOWS\System32_ですが、Visual Studioから_tools --> Android --> Android adb command Prompt_でアクセスできます)。

_adb Shell setprop debug.firebase.analytics.app <package_name>
_

DebugViewを無効にするには:

_adb Shell setprop debug.firebase.analytics.app .none.
_

詳細なロギング

詳細ログはusefykであり、SDKによるイベントのログを監視して、イベントが適切にログに記録されていることを確認します。これには、自動および手動で記録されたイベントの両方が含まれます。

一連のadbコマンドを使用して詳細ログを有効にできます。

_adb Shell setprop log.tag.FA VERBOSE
adb Shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC
_

重要な注意事項

一部の外部ライブラリ(MS AppCenterなど)にはすでにFirebaseが含まれており、マニフェストで分析を明示的に無効にしています。

これらの場合、_AndroidManifest.xml_タグの直前に次の行を追加して、_</application>_を変更する必要があります。

_<meta-data Android:name="firebase_analytics_collection_deactivated" Android:value="false" tools:replace="Android:value"/>
_

また、このプロパティが_<manifest>_タグ内にあることを確認してください:

_xmlns:tools="http://schemas.Android.com/tools"
_

iOS

電話でイベントログをテストしてください!これはエミュレータでは機能しなくなります

AppDelegateで、base.FinishedLaunchingの直前にコンポーネントを初期化します。

_Firebase.Core.App.Configure();
_

次に、コンパイルアクションを "BundleResource"に設定して、(Firebaseアカウントから生成された)GoogleService-Info.plistをインポートします。

これはiOSプラットフォームサービスコードです:

_using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using Firebase.Analytics;
using Firebase.Core;
using Foundation;
using MobileApp.Services;

namespace MobileApp.iOS.Services
{
    [Assembly: Dependency (typeof(AnalyticsServiceIOS))]
    public class AnalyticsServiceIOS : IAnalyticsService
    {

        public void LogEvent(string eventId)
        {
            LogEvent(eventId, (IDictionary<string, string>)null);
        }

        public void LogEvent(string eventId, string paramName, string value)
        {
            LogEvent(eventId, new Dictionary<string, string>
            {
                { paramName, value }
            });
        }

        public void LogEvent(string eventId, IDictionary<string, string> parameters)
        {

            //utility method to fix eventId, you can skip it if you are sure to always pass valid eventIds
            eventId = FixEventId(eventId);

            if (parameters == null)
            {
                Analytics.LogEvent(eventId, parameters: null);
                return;
            }

            var keys = new List<NSString>();
            var values = new List<NSString>();
            foreach (var item in parameters)
            {
                keys.Add(new NSString(item.Key));
                values.Add(new NSString(item.Value));
            }

            var parametersDictionary =
                NSDictionary<NSString, NSObject>.FromObjectsAndKeys(values.ToArray(), keys.ToArray(), keys.Count);
            Analytics.LogEvent(eventId, parametersDictionary);

        }

        //utility method to fix eventId, you can skip it if you are sure to always pass valid eventIds
        private string FixEventId(string eventId)
        {
            if (string.IsNullOrWhiteSpace(eventId))
                return "unknown";

            //remove unwanted characters
            eventId = Regex.Replace(eventId, @"[^a-zA-Z0-9_]+", "_", RegexOptions.Compiled);

            //trim to 40 if needed
            return eventId.Substring(0, Math.Min(40, eventId.Length));
        }
    }
}
_

iOSのデバッグビュー

Firebase consoleでdebugViewを有効にするには、iOSプロジェクトプロパティのExtramlaunch引数に次の引数を追加します。

_--argument=-FIRDebugEnabled
_

DebugViewを無効にするには:

_--argument=-FIRDebugDisabled
_

重要な注意これを指摘してくれた Ken に感謝

AppDelegateでFirebase.Core.App.Configure();を呼び出す例外が発生した場合は、_GoogleService-Info.plist_設定_IS_ANALYTICS_ENABLED_をtrueに変更します

ViewModelでは、必要なイベントを追跡できます

例えば:

_public class MenuPageViewModel{
    public MenuPageViewModel(){
         var analyticsService= DependencyService.Get<IAnalyticsService>();
         //You can use any of the LogEvent Overloads, for example:
         analyticsService.LogEvent("Event");

    }
}
_
39
GiampaoloGabba

私はこのガイドラインに従って成功しました。
ただし、少し便利なコメントが1つあります。ファイル_GoogleService-Info.plist_では、_IS_ANALYTICS_ENABLED_をtrueに設定する必要がありました。そうでない場合、Firebase.Core.App.Configure();を呼び出すと例外が発生しました

0
Ken

あなたのAndroidサービスファイルが間違っています

以下のコード

var bundle = new Bundle();

foreach (var item in parameters)
{
    bundle.PutString(FirebaseAnalytics.Param.ItemId, item.Key);
    bundle.PutString(FirebaseAnalytics.Param.ItemName, item.Value);
}

すべてのパラメータを追跡するには、次のものに置き換える必要があります。

var bundle = new Bundle();

foreach (var item in parameters)
{
    bundle.PutString(item.Key, item.Value);
}
0
t3h Exi