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?
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.
Référencez les packages de nuget appropriés pour Firebase Analytics:
Projet Android
Forms.Context
est déconseillé)Projet iOS
Dans votre projet PCL (ou .NETStandard) créez l'interface
LogEvent
pour stocker votre événementRemarque: 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
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);
}
}
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"
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ètresGoogleService-Info.plist
IS_ANALYTICS_ENABLED
Entrue
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");
}
}
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();
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);
}