com.guru.unity.sdk.core/Runtime/GuruCore/Runtime/Analytics/Analytics.cs

268 lines
6.7 KiB
C#

namespace Guru
{
using System;
using System.Collections.Generic;
using com.adjust.sdk;
using Facebook.Unity;
using Firebase.Analytics;
using Firebase.Crashlytics;
//打点模块初始化和基础接口封装
public static partial class Analytics
{
public class EventSetting
{
public bool EnableFirebaseAnalytics = false;
public bool EnableAdjustAnalytics = false;
public bool EnableFacebookAnalytics = false;
}
private static EventSetting _defaultEventSetting;
private static bool _isInited; //Analytics是否初始化完成
public static bool EnableDebugAnalytics; //允许Debug包上报打点
private static bool IsEnable
{
get
{
//Firebase服务没有初始化完成不上报打点
if (!FirebaseUtil.IsFirebaseInitialized)
return false;
//Analytics没有初始化不上报打点
if (!_isInited)
return false;
//开发环境打点不上报
if (PlatformUtil.IsDebug() && !EnableDebugAnalytics)
return false;
return true;
}
}
#region 初始化
public static void InitAnalytics()
{
if (_isInited) return;
_isInited = true;
Crashlytics.IsCrashlyticsCollectionEnabled = true;
if (_defaultEventSetting == null)
{
var analyticsSetting = GuruSettings.Instance.AnalyticsSetting;
_defaultEventSetting = new EventSetting
{
EnableFirebaseAnalytics = analyticsSetting.EnalbeFirebaseAnalytics,
EnableFacebookAnalytics = analyticsSetting.EnalbeFacebookAnalytics,
EnableAdjustAnalytics = analyticsSetting.EnalbeAdjustAnalytics
};
}
if (_defaultEventSetting.EnableFirebaseAnalytics)
{
FirebaseAnalytics.SetAnalyticsCollectionEnabled(true);
FirebaseAnalytics.SetSessionTimeoutDuration(new TimeSpan(0, 30, 0));
SetUserProperty(FirebaseAnalytics.UserPropertySignUpMethod, "Google");
SetUserProperty(PropertyDeviceID, IPMConfig.IPM_DEVICE_ID);
SetUserProperty(PropertyFirstOpenTime, FirstOpenTime);
}
}
#endregion
#region 屏幕(场景)名称
public static void SetCurrentScreen(string screenName, string className)
{
Log.I(TAG,$"SetCurrentScreen -> screenName:{screenName}, className:{className}");
GuruAnalytics.SetScreen(screenName);
if (!IsEnable) return;
FirebaseAnalytics.LogEvent(FirebaseAnalytics.EventScreenView,
new Parameter(FirebaseAnalytics.ParameterScreenClass, className),
new Parameter(FirebaseAnalytics.ParameterScreenName, screenName)
);
}
#endregion
#region 用户属性上报
/// <summary>
/// Firebase上报用户ID
/// </summary>
/// <param name="userID">通过Auth认证地用户ID</param>
public static void SetUserIDProperty(string userID)
{
Log.I(TAG,$"SetUserIDProperty -> userID:{userID}");
if (!IsEnable) return;
FirebaseAnalytics.SetUserId(userID);
}
/// <summary>
/// Firebase上报用户属性
/// </summary>
public static void SetUserProperty(string propertyName, string propertyValue)
{
Log.I(TAG,$"SetUserProperty -> propertyName:{propertyName}, propertyValue:{propertyValue}");
if (!IsEnable)
return;
FirebaseAnalytics.SetUserProperty(propertyName, propertyValue);
CustomSetUserProperty(propertyName, propertyValue);
}
#endregion
#region 打点上报
/// <summary>
/// 打点上报
/// </summary>
/// <param name="eventName"></param>
/// <param name="eventSetting"></param>
internal static void LogEvent(string eventName, EventSetting eventSetting = null)
{
Log.I(TAG, $"eventName:{eventName}");
CustomLogEvent(eventName); // 自定义打点上报
if (!IsEnable) return;
eventSetting ??= _defaultEventSetting;
if (eventSetting.EnableFirebaseAnalytics)
{
FirebaseAnalytics.LogEvent(eventName);
}
if (eventSetting.EnableAdjustAnalytics)
{
Adjust.trackEvent(CreateAdjustEvent(eventName));
}
if (eventSetting.EnableFacebookAnalytics)
{
FB.LogAppEvent(eventName);
}
}
/// <summary>
/// 打点上报 (带参数)
/// </summary>
/// <param name="eventName"></param>
/// <param name="extras"></param>
/// <param name="eventSetting"></param>
internal static void LogEvent(string eventName, Dictionary<string, dynamic> extras, EventSetting eventSetting = null)
{
Log.I(TAG, $"eventName:{eventName}, params:{string.Join(",", extras)}");
CustomLogEvent(eventName, extras); // 自定义打点上报
if (!IsEnable) return;
eventSetting ??= _defaultEventSetting;
if (eventSetting.EnableFirebaseAnalytics)
{
List<Parameter> parameters = new List<Parameter>();
foreach (var kv in extras)
{
if(kv.Value is string strValue)
parameters.Add(new Parameter(kv.Key, strValue));
else if (kv.Value is int intValue)
parameters.Add(new Parameter(kv.Key, intValue));
else if (kv.Value is long longValue)
parameters.Add(new Parameter(kv.Key, longValue));
else if (kv.Value is float floatValue)
parameters.Add(new Parameter(kv.Key, floatValue));
else if (kv.Value is double doubleValue)
parameters.Add(new Parameter(kv.Key, doubleValue));
else if (kv.Value is decimal decimalValue)
parameters.Add(new Parameter(kv.Key, decimal.ToDouble(decimalValue)));
}
FirebaseAnalytics.LogEvent(eventName, parameters.ToArray());
}
Dictionary<string, object> dict = new Dictionary<string, object>(extras);
if (eventSetting.EnableAdjustAnalytics)
{
AdjustEvent adjustEvent = Analytics.CreateAdjustEvent(eventName);
if (adjustEvent != null)
{
foreach (var kv in dict)
{
adjustEvent.AddEventParameter(kv.Key, kv.Value.ToString());
}
Adjust.trackEvent(adjustEvent);
}
}
if (eventSetting.EnableFacebookAnalytics)
{
FB.LogAppEvent(eventName, null, dict);
}
}
#endregion
#region 通用打点
/// <summary>
/// 一般的事件上报通用接口
/// </summary>
/// <param name="key"></param>
/// <param name="data"></param>
/// <param name="setting"></param>
public static void Track(string key, Dictionary<string, dynamic> data = null, EventSetting setting = null)
{
if (null != data)
{
LogEvent(key, data, setting);
}
else
{
LogEvent(key, setting);
}
}
/// <summary>
/// Crashlytics 上报
/// </summary>
/// <param name="msg"></param>
/// <param name="isException"></param>
public static void LogCrashlytics(string msg, bool isException = true)
{
if (!_isInited) return;
if (isException)
{
LogCrashlytics(new Exception(msg));
}
else
{
Crashlytics.Log(msg);
}
}
public static void LogCrashlytics(Exception exp)
{
if (!_isInited) return;
Crashlytics.LogException(exp);
Crashlytics.SetUserId(IPMConfig.IPM_UID);
}
#endregion
}
}