366 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			366 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			C#
		
	
	
| 
 | |
| 
 | |
| using System.Collections;
 | |
| 
 | |
| 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包上报打点
 | |
| 
 | |
| 		public static bool IsDebugMode => PlatformUtil.IsDebug();
 | |
| 		
 | |
| 		private static bool IsEnable 
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				//Firebase服务没有初始化完成不上报打点
 | |
| 				if (!FirebaseUtil.IsFirebaseInitialized)
 | |
| 					return false;
 | |
| 				
 | |
| 				//Analytics没有初始化不上报打点
 | |
| 				if (!_isInited)
 | |
| 					return false;
 | |
| 
 | |
| 				//开发环境打点不上报
 | |
| 				if (IsDebugMode && !EnableDebugAnalytics)
 | |
| 					return false;
 | |
| 
 | |
| 				return true;
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		#region 初始化
 | |
| 
 | |
| 		public static void InitAnalytics()
 | |
| 		{
 | |
| 			if (_isInited) return;
 | |
| 			_isInited = true;
 | |
| 			
 | |
| 			// -------- 初始化 Exception ----------
 | |
| 			CrashlyticsAgent.Install();
 | |
| 			
 | |
| 			// ------- 初始化自打点 ----------
 | |
| 			InstallGuruAnalytics(IsDebug);
 | |
| 			
 | |
| 			if (_defaultEventSetting == null)
 | |
| 			{
 | |
| 				var analyticsSetting = GuruSettings.Instance.AnalyticsSetting;
 | |
| 				_defaultEventSetting = new EventSetting
 | |
| 				{
 | |
| 					EnableFirebaseAnalytics = analyticsSetting.EnalbeFirebaseAnalytics,
 | |
| 					EnableFacebookAnalytics = analyticsSetting.EnalbeFacebookAnalytics,
 | |
| 					EnableAdjustAnalytics = analyticsSetting.EnalbeAdjustAnalytics
 | |
| 				};
 | |
| 			}
 | |
| 			
 | |
| 			FirebaseUtil.onInitComplete += OnFirebaseCompleted;
 | |
| 		}
 | |
| 
 | |
| 		private static void OnFirebaseCompleted(bool success)
 | |
| 		{
 | |
| 			FirebaseUtil.onInitComplete -= OnFirebaseCompleted;
 | |
| 
 | |
| 			if (success)
 | |
| 			{
 | |
| 				Crashlytics.IsCrashlyticsCollectionEnabled = true;
 | |
| 				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); // 自定义打点上报
 | |
| 			CheckLogCache(eventName, null, eventSetting); // log缓存和消费
 | |
| 			
 | |
| 			if (!IsEnable) return;
 | |
| 
 | |
| 			eventSetting ??= _defaultEventSetting;
 | |
| 			
 | |
| 			if (eventSetting.EnableFirebaseAnalytics)
 | |
| 			{
 | |
| 				FirebaseAnalytics.LogEvent(eventName);
 | |
| 			}
 | |
| 			
 | |
| 			if (eventSetting.EnableAdjustAnalytics)
 | |
| 			{
 | |
| 				Adjust.trackEvent(CreateAdjustEvent(eventName));
 | |
| 			}
 | |
| 
 | |
| 			if (eventSetting.EnableFacebookAnalytics)
 | |
| 			{
 | |
| 				FBService.LogEvent(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); // 自定义打点上报
 | |
| 
 | |
| 			CheckLogCache(eventName, extras, eventSetting); // log缓存和消费
 | |
| 			
 | |
| 			if (!IsEnable) return;
 | |
| 
 | |
| 			if (extras == null)
 | |
| 			{
 | |
| 				LogEvent(eventName, eventSetting); // 防空判定
 | |
| 				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 bool boolValue)
 | |
| 						parameters.Add(new Parameter(kv.Key, boolValue ? "true" : "false"));
 | |
| 					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)));
 | |
| 					else
 | |
| 						parameters.Add(new Parameter(kv.Key, kv.Value.ToString()));
 | |
| 					
 | |
| 				}
 | |
| 				
 | |
| 				FirebaseAnalytics.LogEvent(eventName, parameters.ToArray());
 | |
| 			}
 | |
| 
 | |
| 			Dictionary<string, object> dict = new Dictionary<string, object>();
 | |
| 			GuruSDKUtils.MergeDictionary(dict, extras);
 | |
| 			
 | |
| 			if (eventSetting.EnableAdjustAnalytics)
 | |
| 			{
 | |
| 				AdjustEvent adjustEvent = Analytics.CreateAdjustEvent(eventName);
 | |
| 				if (adjustEvent != null)
 | |
| 				{
 | |
| 					if (dict.Count > 0)
 | |
| 					{
 | |
| 						foreach (var kv in dict)
 | |
| 						{
 | |
| 							adjustEvent.AddEventParameter(kv.Key, kv.Value.ToString());
 | |
| 						}
 | |
| 					}
 | |
| 					Adjust.trackEvent(adjustEvent);
 | |
| 				}
 | |
| 			}
 | |
| 			
 | |
| 			if (eventSetting.EnableFacebookAnalytics)
 | |
| 			{
 | |
| 				FBService.LogEvent(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
 | |
| 			{
 | |
| 				CrashlyticsAgent.Log(msg);
 | |
| 			}
 | |
| 		}
 | |
| 		
 | |
| 		
 | |
| 		public static void LogCrashlytics(Exception exp)
 | |
| 		{
 | |
| 			if (!_isInited) return;
 | |
| 			CrashlyticsAgent.LogException(exp);
 | |
| 		}
 | |
| 
 | |
| 		#endregion
 | |
| 
 | |
| 		#region 打点缓存
 | |
| 
 | |
| 		private static Queue<SavedLog> _savedLogs;
 | |
| 
 | |
| 		internal static Queue<SavedLog> SavedLogs
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				if (_savedLogs == null) _savedLogs = new Queue<SavedLog>(20);
 | |
| 				return _savedLogs;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		private static void CheckLogCache(string key, Dictionary<string, dynamic> data = null, EventSetting setting = null)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				if (!_isInited)
 | |
| 				{
 | |
| 					if (data == null) data = new Dictionary<string, dynamic>();
 | |
| 					data["log_stamp"] = TimeUtil.GetCurrentTimeStamp().ToString();
 | |
| 					SavedLogs.Enqueue(new SavedLog(key, data, setting));
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					int len = SavedLogs.Count;
 | |
| 					if (len > 0)
 | |
| 					{
 | |
| 						while (SavedLogs.Count > 0)
 | |
| 						{
 | |
| 							var log = SavedLogs.Dequeue();
 | |
| 							LogEvent(log.key, log.data, log.setting);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			catch (Exception ex)
 | |
| 			{
 | |
| 				Crashlytics.LogException(ex);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 
 | |
| 		#endregion
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	internal class SavedLog
 | |
| 	{
 | |
| 		public string key;
 | |
| 		public Dictionary<string, dynamic> data;
 | |
| 		public Analytics.EventSetting setting;
 | |
| 
 | |
| 		public SavedLog()
 | |
| 		{
 | |
| 		}
 | |
| 
 | |
| 		public SavedLog(string _key, Dictionary<string, dynamic> _data = null, Analytics.EventSetting _setting = null)
 | |
| 		{
 | |
| 			key = _key;
 | |
| 			data = _data;
 | |
| 			setting = _setting;
 | |
| 		}
 | |
| 	}
 | |
| } |