web-dev-qa-db-fra.com

Firebase Analytics dans les formulaires Xamarin

Pouvons-nous obtenir des événements personnalisés tels que, par exemple, le bouton 1 a été appuyé à l'aide de Firebase Analytics dans un projet Xamarin Forms?

14
Ashish Kumar

Réponse Mise à jour pour la nouvelle version des composants Xamarin Firebase et pour résoudre divers problèmes

Bien sûr, vous devez DI (injection de dépendance) pour appeler le code de la plate-forme.

  • Configurez votre application Firebase: https://firebase.google.com/docs/projects/learn-more
  • Référencez les packages de nuget appropriés pour Firebase Analytics:

    Projet Android

    • Xamarin.FireBase.Analytics
    • Xamarin.FireBase.Analytics.Impl
    • Plugin.CurrentActivity (utilisé pour obtenir le contexte actuel commeForms.Context est déconseillé)

    Projet iOS

    • Xamarin.FireBase.iOS.Analytics (projet iOS)
  • Dans votre projet PCL (ou .NETStandard) créez l'interface

  • Dans le projet Android et iOS, écrivez le code spécifique plaftorm
  • Dans vos modèles d'affichage, utilisez DI dans le projet PCL (ou .NETStandard) pour appeler la méthode LogEvent pour stocker votre événement

Remarque: Les événements personnalisés sont lents à apparaître dans Firebase, d'après mon expérience, ils ont besoin de 24 heures pour apparaître dans la console Web. Si vous souhaitez tester correctement la journalisation personnalisée, utilisez votre téléphone et activez le débogage d'analyse (afin que vous puissiez voir vos événements dans debugView dans la console Firebase) *


Note2: attention à la propriété eventId: les noms peuvent contenir jusqu'à 40 caractères, ne peuvent contenir que des caractères alphanumériques et des traits de soulignement (" "), et doit commencer par un caractère alphabétique. Les préfixes "firebase", "google_" et "ga_" sont réservés et ne doivent pas être utilisés. J'ai inclus une fonction utilitaire smal pour corriger automatiquement eventId, vous pouvez l'ignorer si vous le souhaitez


Projet PCL ou .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

Assurez-vous d'avoir l'autorisation INTERNET dans votre manifeste.

Importez votre google-services.json (généré à partir de votre compte Firebase) avec l'action de compilation définie sur "GoogleServicesJson"

N'oubliez pas d'appeler CrossCurrentActivity méthode init dans votre AppDelegate OnCreate:

CrossCurrentActivity.Current.Init(this, bundle);

Voici le 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));
        }

    }
}

Vue de débogage sur Android

Pour activer debugView dans la base de données, exécutez cette commande à partir de l'invite de commande de votre console adb (généralement c:\WINDOWS\System32, Mais vous pouvez y accéder via Visual Studio dans tools --> Android --> Android adb command Prompt):

adb Shell setprop debug.firebase.analytics.app <package_name>

Pour désactiver l'utilisation de debugView:

adb Shell setprop debug.firebase.analytics.app .none.

Journalisation détaillée

La journalisation détaillée est utile pour surveiller la journalisation des événements par le SDK afin de vérifier que les événements sont correctement enregistrés. Cela inclut les événements enregistrés automatiquement et manuellement.

Vous pouvez activer la journalisation détaillée avec une série de commandes adb:

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

Remarque importante

Certaines bibliothèques externes (comme MS AppCenter) incluent déjà Firebase et désactivent explicitement les analyses dans leur manifeste.

Dans ces cas, vous devez modifier votre AndroidManifest.xml En ajoutant cette ligne juste avant la balise </application>:

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

Assurez-vous également d'avoir cette propriété dans votre balise <manifest>:

xmlns:tools="http://schemas.Android.com/tools"

iOS

Assurez-vous de tester la journalisation des événements sur votre téléphone! Cela ne fonctionnera plus sur les émulateurs

Initialisez le composant dans votre AppDelegate, juste avant la base.

Firebase.Core.App.Configure();

Importez ensuite votre GoogleService-Info.plist (généré à partir de votre compte Firebase) avec l'action de compilation définie sur "BundleResource".

Voici le code de service de la plateforme 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));
        }
    }
}

Vue de débogage dans iOS

Pour activer debugView dans la console firebase, ajoutez l'argument suivant aux arguments Extra mlaunch dans les propriétés de votre projet iOS:

--argument=-FIRDebugEnabled

Pour désactiver l'utilisation de debugView:

--argument=-FIRDebugDisabled

Remarque importante ( merci à Ken de l'avoir signalé)

Si vous obtenez une exception appelant Firebase.Core.App.Configure(); dans votre AppDelegate, modifiez vos paramètres GoogleService-Info.plistIS_ANALYTICS_ENABLED En true

Dans votre ViewModel, vous pouvez suivre n'importe quel événement que vous souhaitez

Par exemple:

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

J'ai suivi cette directive avec succès.
J'ai cependant un petit commentaire utile: dans le fichier GoogleService-Info.plist, J'ai dû définir IS_ANALYTICS_ENABLED Sur true. Sinon, j'ai eu une exception lors de l'appel de Firebase.Core.App.Configure();

0
Ken

votre Android est erroné

Votre code ci-dessous

var bundle = new Bundle();

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

doit être remplacé par ce qui suit pour suivre tous les paramètres:

var bundle = new Bundle();

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