From d37c1c4216bc04110309582a50eeb7b6b0161b2f Mon Sep 17 00:00:00 2001 From: huyufei Date: Wed, 7 Aug 2024 03:28:07 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E9=87=8D=E6=9E=84=20=E8=87=AA?= =?UTF-8?q?=E6=89=93=E7=82=B9=E5=B1=9E=E6=80=A7=E4=B8=8A=E6=8A=A5=E9=80=BB?= =?UTF-8?q?=E8=BE=91=EF=BC=8C=20CodeReview?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyufei --- Runtime/GuruAdjust/AdjustService.cs | 10 +- .../Plugins/Android/U3DAnalytics-1.11.1.aar | Bin 13146 -> 0 bytes .../Plugins/Android/U3DAnalytics-1.11.2.aar | Bin 0 -> 13242 bytes ....aar.meta => U3DAnalytics-1.11.2.aar.meta} | 2 +- ...lytics_1.9.0.mm => U3DAnalytics_1.12.0.mm} | 18 +- ....0.mm.meta => U3DAnalytics_1.12.0.mm.meta} | 2 +- Runtime/GuruAnalytics/README.md | 1 - .../Runtime/Script/GuruAnalytics.cs | 2 +- .../Script/Impl/AnalyticsAgentAndroid.cs | 15 +- .../Runtime/Analytics/Analytics.Const.cs | 29 +- .../Runtime/Analytics/Analytics.Custom.cs | 208 +------ .../Runtime/Analytics/Analytics.Property.cs | 554 +++++++++++++++++- .../GuruCore/Runtime/Analytics/Analytics.cs | 20 +- .../Analytics/Events/AbstractEventDriver.cs | 191 +++++- .../Analytics/Events/AdjustEventDriver.cs | 48 ++ .../Runtime/Analytics/Events/FBEventDriver.cs | 57 +- .../Analytics/Events/FirebaseEventDriver.cs | 28 + .../Analytics/Events/GuruEventDriver.cs | 58 ++ .../GuruCore/Runtime/IPM/Scripts/IPMConfig.cs | 18 +- 19 files changed, 1017 insertions(+), 244 deletions(-) delete mode 100644 Runtime/GuruAnalytics/Plugins/Android/U3DAnalytics-1.11.1.aar create mode 100644 Runtime/GuruAnalytics/Plugins/Android/U3DAnalytics-1.11.2.aar rename Runtime/GuruAnalytics/Plugins/Android/{U3DAnalytics-1.11.1.aar.meta => U3DAnalytics-1.11.2.aar.meta} (93%) rename Runtime/GuruAnalytics/Plugins/iOS/{U3DAnalytics_1.9.0.mm => U3DAnalytics_1.12.0.mm} (96%) rename Runtime/GuruAnalytics/Plugins/iOS/{U3DAnalytics_1.9.0.mm.meta => U3DAnalytics_1.12.0.mm.meta} (94%) diff --git a/Runtime/GuruAdjust/AdjustService.cs b/Runtime/GuruAdjust/AdjustService.cs index 3da6797..e81f7f1 100644 --- a/Runtime/GuruAdjust/AdjustService.cs +++ b/Runtime/GuruAdjust/AdjustService.cs @@ -18,7 +18,7 @@ namespace Guru public const string K_IAP_PURCHASE = "iap_purchase"; // 固定点位事件 public const string K_SUB_PURCHASE = "sub_purchase"; // 固定点位事件 - private static Action _onInitComplete; + private static Action _onInitComplete; private static Action _onGetGoogleAdidHandler; private static string _googleAdId = ""; @@ -60,7 +60,7 @@ namespace Guru /// /// public static void StartService(string appToken, string fbAppId = "", string firebaseId = "", string deviceId = "", - Action onInitComplete = null, Action onDeeplinkCallback = null, Action onGetGoogleAdIdCallback = null) + Action onInitComplete = null, Action onDeeplinkCallback = null, Action onGetGoogleAdIdCallback = null) { if (string.IsNullOrEmpty(appToken)) { @@ -79,6 +79,7 @@ namespace Guru config.setDelayStart(DelayTime); config.setPreinstallTrackingEnabled(true); // Adjust Preinstall config.setSessionSuccessDelegate(OnSessionSuccessCallback); // SessionSuccess + config.setSessionFailureDelegate(OnSessionFailureCallback); // SessionFailed if(onDeeplinkCallback != null) config.setDeferredDeeplinkDelegate(onDeeplinkCallback); @@ -91,7 +92,6 @@ namespace Guru config.setLogDelegate(log => LogI(LOG_TAG, log)); config.setEventSuccessDelegate(OnEventSuccessCallback); config.setEventFailureDelegate(OnEventFailureCallback); - config.setSessionFailureDelegate(OnSessionFailureCallback); config.setAttributionChangedDelegate(OnAttributionChangedCallback); #endif // 检查场景实例 @@ -182,7 +182,7 @@ namespace Guru var adid = sessionSuccessData.Adid; _adjustId = adid; _isReady = true; - _onInitComplete?.Invoke(adid); + _onInitComplete?.Invoke(adid, Adjust.getIdfv(), Adjust.getIdfa()); } @@ -305,7 +305,7 @@ namespace Guru private static void OnSessionFailureCallback(AdjustSessionFailure sessionFailureData) { - LogI(LOG_TAG,"Session tracking failed!"); + LogE(LOG_TAG,"Session tracking failed!"); if (sessionFailureData.Message != null) { diff --git a/Runtime/GuruAnalytics/Plugins/Android/U3DAnalytics-1.11.1.aar b/Runtime/GuruAnalytics/Plugins/Android/U3DAnalytics-1.11.1.aar deleted file mode 100644 index 955b3913ce8041ef8727f5b44941d62b86a6b9f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13146 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 diff --git a/Runtime/GuruAnalytics/Plugins/Android/U3DAnalytics-1.11.2.aar b/Runtime/GuruAnalytics/Plugins/Android/U3DAnalytics-1.11.2.aar new file mode 100644 index 0000000000000000000000000000000000000000..166b415febb1a5106ab29c7dff81d621fcecbf39 GIT binary patch literal 13242 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 Hash: 1978686dbcba38b7b0421d8b6b2bef111356366b diff --git a/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs b/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs index b525d22..9eb1ba9 100644 --- a/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs +++ b/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs @@ -224,7 +224,7 @@ namespace Guru } - public void SetAndroidID(string androidId) + public void SetAndroidId(string androidId) { if (!_isReady) return; if (string.IsNullOrEmpty(androidId)) return; diff --git a/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentAndroid.cs b/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentAndroid.cs index 9a4001e..e5ecbcd 100644 --- a/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentAndroid.cs +++ b/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentAndroid.cs @@ -98,30 +98,29 @@ namespace Guru { _isDebug = isDebug; string bundleId = Application.identifier; - CallSDKInit(appId, deviceInfo, bundleId, baseUrl, uploadIpAddress , true, false, _isDebug); // 调用接口 - + CallSDKInit(appId, deviceInfo, bundleId, _isDebug, baseUrl, uploadIpAddress , true, false); // 调用接口 onInitComplete?.Invoke(); } /********* Android API ********** - public static void init(String appId, + public static void init(String appId, String deviceInfo, String bundleId, boolean debug, - boolean useWorker, - boolean enabledCronet, String baseUrl, - List uploadIpAddress) + String uploadIpAddressStr, + boolean useWorker, + boolean enabledCronet) */ private void CallSDKInit(string appId, string deviceInfo, string bundleId, + bool isDebug = false, string baseUrl = "", string[] uploadIpAddress = null, bool useWorker = true, - bool useCronet = false, - bool isDebug = false) + bool useCronet = false) { CallStatic("init", appId, deviceInfo, bundleId, isDebug, useWorker, useCronet, baseUrl, string.Join(",", uploadIpAddress ?? Array.Empty())); // 调用接口 } diff --git a/Runtime/GuruCore/Runtime/Analytics/Analytics.Const.cs b/Runtime/GuruCore/Runtime/Analytics/Analytics.Const.cs index 84ecb66..b9d42ce 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Analytics.Const.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Analytics.Const.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace Guru { public enum ELevelResult @@ -12,7 +14,7 @@ namespace Guru //打点常量定义 public static partial class Analytics { - public const string TAG = "Analytics"; + public const string TAG = "[GA]"; // 美元符号 public const string USD = "USD"; // 广告平台 @@ -113,20 +115,41 @@ namespace Guru public const string PropertyLastPlayedLevel = "last_played_level"; public const string PropertyGrade = "grade"; //当游戏玩家角色升级时触发 public const string PropertyIsIAPUser = "is_iap_user"; //付费成功后设置属性参数为true,如果没有发生付费可以不用设置该属性 + public const string PropertyNetwork = "network"; // network属性 + public const string PropertyAdjustId = "adjust_id"; // network属性 public const string PropertyIAPCoin = "iap_coin"; //付费所得的总金币数(iap获取累计值)\ public const string PropertyNonIAPCoin = "noniap_coin"; //非付费iap获取累计值 public const string PropertyCoin = "coin"; //当前金币数 public const string PropertyExp = "exp"; // 经验值 public const string PropertyHp = "hp"; // 生命值/体力 - public const string PropertyAndroidID = "android_id"; // Android 平台 AndroidID + public const string PropertyAndroidId = "android_id"; // Android 平台 AndroidID public const string PropertyIDFV = "idfv"; // iOS 平台 IDFV public const string PropertyIDFA = "idfa"; // iOS 平台 IDFA public const string PropertyPicture = "picture"; // 玩家在主线的mapid public const string PropertyNoAds = "no_ads"; // 玩家是否去广告 - public const string PropertyATTStatus = "att_status"; // ATT 状态 + public const string PropertyAttStatus = "att_status"; // ATT 状态 + public const string PropertyNotiPerm = "noti_perm"; // ATT 状态 public const string PropertyGDPR = "gdpr"; // GDPR状态 public const string PropertySignUpMethod = "sign_up_method"; // 用户登录方式 + public const string PropertyFirebaseId = "firebase_id"; // FirebaseID + public const string PropertyGoogleAdId = "ad_id"; // FirebaseID + public static HashSet PredefinedMidWareProperties = new HashSet() + { + PropertyFirstOpenTime, + PropertyDeviceID, + PropertyUserID, + PropertyIsIAPUser, + PropertyNetwork, + PropertyAdjustId, + PropertyAndroidId, + PropertyIDFV, + PropertyIDFA, + PropertyAttStatus, + PropertyNotiPerm, + PropertyFirebaseId, + PropertyGoogleAdId, + }; // 经济相关 public const string ParameterBalance = "balance"; // 用于余额 diff --git a/Runtime/GuruCore/Runtime/Analytics/Analytics.Custom.cs b/Runtime/GuruCore/Runtime/Analytics/Analytics.Custom.cs index 2a79633..d884666 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Analytics.Custom.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Analytics.Custom.cs @@ -1,24 +1,16 @@ namespace Guru { using System; - using Firebase.Analytics; using Firebase.Crashlytics; - using Firebase.Extensions; using UnityEngine; + /// /// 自打点逻辑 /// public partial class Analytics { - private static bool _hasSetFirebaseId; //已取得FirebaseId - private static bool _hasSetAdId; // 已取得AdId - private static bool _hasSetIDFA; // 已取得IDFA - private static bool _hasSetAdjustId; // 已取得AdjustId - private static bool _hasSetDeviceId; // 已取得DeviceId - private static bool _hasSetUid; // 已取得UID - private static bool _hasSetIDFV; // 已经取得 IDFV - private static bool _hasSetAndroidId; // 已取得AndroidId + private static DateTime _lastReportRateDate; //上次上报信息的日期 private static double _reportSuccessInterval; // 上报频率 #if UNITY_IOS @@ -37,12 +29,7 @@ namespace Guru { string appId = IPMConfig.IPM_X_APP_ID; string deviceInfo = new DeviceInfoData().ToString(); - - _hasSetFirebaseId = false; - _hasSetAdId = false; - _hasSetAdjustId = false; - _hasSetDeviceId = false; - _hasSetUid = false; + _lastReportRateDate = DateTime.Now; _reportSuccessInterval = 120; // 2分钟上报一次 @@ -53,7 +40,7 @@ namespace Guru OnGuruAnalyticsInitComplete(); Debug.Log($"{TAG} [guru_analytic]--- Guru EXP: GroupId: {GuruAnalytics.Instance.ExperimentGroupId}"); SetUserProperty(GuruAnalyticsConfigManager.KEY_GURU_ANALYTICS_EXP, GuruAnalytics.Instance.ExperimentGroupId); - ApplyAllUserProperties(); + ApplyAllMidWareProperties(); }, IsDebug, firebaseId); // Android 初始化 } @@ -62,193 +49,6 @@ namespace Guru LogCrashlytics(ex); } } - - - #region 各ID上报信息 - - /// - /// 设置用户ID - /// - public static void SetUid(string uid) - { - if (_hasSetUid) return; - if (string.IsNullOrEmpty(uid)) return; - - if (!IsFirebaseReady) return; - SetFirebaseUserId(uid); - - if (!GuruAnalytics.IsReady) return; - GuruAnalytics.Instance.SetUid(uid); - - Debug.Log($"---[ANA] UID: {uid}"); - _hasSetUid = true; - } - - /// - /// 设置设备ID - /// - private static void SetDeviceId(string deviceId) - { - if (_hasSetDeviceId) return; - if (string.IsNullOrEmpty(deviceId)) return; - - if (!GuruAnalytics.IsReady) return; - GuruAnalytics.Instance.SetDeviceId(deviceId); - _hasSetDeviceId = true; - } - - /// - /// 设置 AdjustId - /// - private static void SetAdjustId(string adjustId) - { - if (_hasSetAdjustId) return; - if (string.IsNullOrEmpty(adjustId)) return; - if (!GuruAnalytics.IsReady) return; - - GuruAnalytics.Instance.SetAdjustId(adjustId); - _hasSetAdjustId = true; - - - } - - /// - /// 设置 AdId - /// - private static void SetAdId(string adId) - { - if (_hasSetAdId) return; - if (string.IsNullOrEmpty(adId)) return; - if (!GuruAnalytics.IsReady) return; - GuruAnalytics.Instance.SetAdId(adId); - _hasSetAdId = true; - - } - - /// - /// 设置FirebaseId - /// - private static void SetFirebaseId(string firebaseId) - { - if (_hasSetFirebaseId) return; - if (string.IsNullOrEmpty(firebaseId)) return; - if (!GuruAnalytics.IsReady) return; - GuruAnalytics.Instance.SetFirebaseId(firebaseId); - _hasSetFirebaseId = true; - } - - /// - /// 获取FirebaseID - /// - private static void FetchFirebaseId() - { - if (!IsFirebaseReady) return; - - FirebaseAnalytics.GetAnalyticsInstanceIdAsync() - .ContinueWithOnMainThread(task => - { - if (task != null && task.IsCompleted) - { - var fid = task.Result; - if (!string.IsNullOrEmpty(fid) - && string.IsNullOrEmpty(IPMConfig.FIREBASE_ID)) - { - IPMConfig.FIREBASE_ID = fid; - } - } - }); - } - -#if UNITY_IOS - /// - /// 更新ATT状态 (Only IOS 有效) - /// - private static void ApplyATTStatus() - { - string status = ATTManager.GetStatus(); - GuruAnalytics.Instance.SetUserProperty(ParameterATTStatus, status); - } - - private static void SetIDFV(string idfv) - { - if (_hasSetIDFV) return; - if (string.IsNullOrEmpty(idfv)) return; - if (!GuruAnalytics.IsReady) return; - GuruAnalytics.Instance.SetIDFV(idfv); - _hasSetIDFV = true; - } - - private static void SetIDFA(string idfa) - { - if (_hasSetIDFA) return; - if (string.IsNullOrEmpty(idfa)) return; - if (!GuruAnalytics.IsReady) return; - - GuruAnalytics.Instance.SetIDFA(idfa); - _hasSetIDFA = true; - } -#endif - -#if UNITY_ANDROID - /// - /// 更新 Android ID 的参数 - /// - private static void SetAndroidId(string androidId) - { - if (_hasSetAndroidId) return; - if (string.IsNullOrEmpty(androidId)) return; - if (!GuruAnalytics.IsReady) return; - GuruAnalytics.Instance.SetAndroidID(androidId); - _hasSetAndroidId = true; - } -#endif - - /// - /// 上报中台打点的用户属性 - /// - private static void ApplyAllUserProperties() - { - - Debug.Log($"{TAG} --- UpdateAllValues"); - SetUid(IPMConfig.IPM_UID); - SetDeviceId(IPMConfig.IPM_DEVICE_ID); - SetAdjustId(IPMConfig.ADJUST_ID); - if (string.IsNullOrEmpty(IPMConfig.FIREBASE_ID)) - { - FetchFirebaseId(); - } - else - { - SetFirebaseId(IPMConfig.FIREBASE_ID); - } - SetAdId(IPMConfig.ADJUST_ADID); - -#if UNITY_ANDROID - SetAndroidId(DeviceIDHelper.AndroidID); -#endif - -#if UNITY_IOS - ApplyATTStatus(); - SetIDFV(IPMConfig.ADJUST_IDFV); - SetIDFA(IPMConfig.ADJUST_IDFA); -#endif - ReportEventSuccessRate(); - } - - /// - /// 上报事件成功率 - /// - private static void ReportEventSuccessRate() - { - var interval = (DateTime.Now - _lastReportRateDate).TotalSeconds; - if (interval > _reportSuccessInterval) - { - GuruAnalytics.Instance.ReportEventSuccessRate(); - _lastReportRateDate = DateTime.Now; - } - } - - #endregion #region 设置太极02 值 diff --git a/Runtime/GuruCore/Runtime/Analytics/Analytics.Property.cs b/Runtime/GuruCore/Runtime/Analytics/Analytics.Property.cs index 07d4514..14f62dd 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Analytics.Property.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Analytics.Property.cs @@ -1,11 +1,21 @@ - - namespace Guru { + using System; using UnityEngine; - + using Firebase.Analytics; + using System.Collections.Generic; + + /// + /// 上报用户属性逻辑 + /// Firebase 中台属性上报: https://docs.google.com/spreadsheets/d/1N47rXgjatRHFvzWWx0Hqv5C1D9NHHGbggi6pQ65c-zQ/edit?gid=1858695240#gid=1858695240 + /// Guru自打点 中台属性上报:https://docs.google.com/spreadsheets/d/1N47rXgjatRHFvzWWx0Hqv5C1D9NHHGbggi6pQ65c-zQ/edit?gid=1736574940#gid=1736574940 + /// public static partial class Analytics { + + + #region Old Properties + /// /// B_Level 属性 /// @@ -38,5 +48,543 @@ namespace Guru return stamp; } } + + + #endregion + + #region Update all neccessary properties + + //---------------- 设置所有必要的属性 --------------------- + + /// + /// 应用所有的中台属性 + /// + private static void ApplyAllMidWareProperties() + { + MidWarePropertiesManager.Instance.ApplyAllProperties(); + } + + + /// + /// 设置用户ID + /// + public static void SetUid(string uid) + { + MidWarePropertiesManager.Instance.ReportUid(uid); + } + + /// + /// 设置设备ID + /// (Firebase, Guru) + /// + private static void SetDeviceId(string deviceId) + { + MidWarePropertiesManager.Instance.ReportDeviceId(deviceId); + } + + /// + /// 设置首次启动时间 + /// + /// + private static void SetFirstOpenTime(string firstOpenTime) + { + MidWarePropertiesManager.Instance.ReportFirstOpenTime(firstOpenTime); + } + + /// + /// 设置 IsIapUser + /// (Firebase, Guru) + /// + public static void SetIsIapUser(bool isIapUser) + { + MidWarePropertiesManager.Instance.ReportIsIapUser(isIapUser); + } + + /// + /// 设置 Network + /// (Firebase, Guru) + /// + public static void SetNetworkStatus(string networkStatus) + { + MidWarePropertiesManager.Instance.ReportNetworkStatus(networkStatus); + } + + /// + /// 设置 AdjustId + /// (Firebase) + /// + public static void SetAdjustId(string adjustId) + { + MidWarePropertiesManager.Instance.ReportAdjustId(adjustId); + } + + /// + /// 设置 AndroidId + /// (Firebase) + /// + public static void SetAndroidId(string androidId) + { + MidWarePropertiesManager.Instance.ReportAndroidId(androidId); + } + + /// + /// 设置 AttStatus + /// (Firebase) + /// + public static void SetAttStatus(string attStatus) + { + MidWarePropertiesManager.Instance.ReportAttStatus(attStatus); + } + + /// + /// 设置 AttStatus + /// (Firebase) + /// + public static void SetNotiPerm(string notiPrem) + { + MidWarePropertiesManager.Instance.ReportNotiPerm(notiPrem); + } + + /// + /// 设置 AdId + /// + public static void SetGoogleAdId(string adId) + { + MidWarePropertiesManager.Instance.ReportGoogleAdId(adId); + } + + public static void SetIDFV(string idfv) + { + MidWarePropertiesManager.Instance.ReportIDFV(idfv); + } + + public static void SetIDFA(string idfa) + { + MidWarePropertiesManager.Instance.ReportIDFA(idfa); + } + + + #endregion + + #region 中台属性管理 + + /// + /// 中台必要用户属性对象 + /// + private abstract class AbstractMidWareProperty + { + public readonly string key; + protected readonly string value; + private readonly ReportPropertyTarget reportTarget; + private bool HasValue => !string.IsNullOrEmpty(value); + + protected AbstractMidWareProperty(string key, string value, + ReportPropertyTarget reportTarget = ReportPropertyTarget.Both) + { + this.key = key; + this.value = value; + this.reportTarget = reportTarget; + } + + + public void Report() + { + if (!HasValue) return; + BeforeReportProperty(); + ReportPropertyByTarget(); + } + + protected abstract void BeforeReportProperty(); + + private void ReportPropertyByTarget() + { + if (!HasValue) return; + switch (reportTarget) + { + case ReportPropertyTarget.Firebase: + // Firebase + _firebaseEventDriver.AddProperty(key, value); + break; + + case ReportPropertyTarget.Guru: + // Guru + _guruEventDriver.AddProperty(key, value); + break; + + case ReportPropertyTarget.Both: + // 双平台上报 + _firebaseEventDriver.AddProperty(key, value); + _guruEventDriver.AddProperty(key, value); + break; + + default: + throw new ArgumentOutOfRangeException(); + } + } + + } + + /// + /// UID + /// + private class MidWarePropertyUid : AbstractMidWareProperty + { + public MidWarePropertyUid(string value) + : base(PropertyUserID, value, ReportPropertyTarget.Both) + { + } + + protected override void BeforeReportProperty() + { + _firebaseEventDriver.SetUid(value); + _guruEventDriver.SetUid(value); + } + } + /// + /// DeviceId + /// + private class MidWarePropertyDeviceId : AbstractMidWareProperty + { + public MidWarePropertyDeviceId(string value) + : base(PropertyDeviceID, value, ReportPropertyTarget.Both) + { + + } + + protected override void BeforeReportProperty() + { + _guruEventDriver.SetDeviceId(value); + } + } + /// + /// FirstOpenTime + /// + private class MidWarePropertyFirstOpenTime : AbstractMidWareProperty + { + public MidWarePropertyFirstOpenTime(string value) + : base(PropertyFirstOpenTime, value, ReportPropertyTarget.Both) + { + + } + + protected override void BeforeReportProperty() + { + } + } + /// + /// IsIapUser + /// + private class MidWarePropertyIsIapUser : AbstractMidWareProperty + { + public MidWarePropertyIsIapUser(bool value) + : base(PropertyIsIAPUser, value?"true":"false", ReportPropertyTarget.Both) + { + + } + + protected override void BeforeReportProperty() { } + } + + /// + /// Network + /// + private class MidWarePropertyNetwork : AbstractMidWareProperty + { + public MidWarePropertyNetwork(string value) + : base(PropertyNetwork, value, ReportPropertyTarget.Both) + { + + } + + protected override void BeforeReportProperty() { } + } + /// + /// AdjustId + /// + private class MidWarePropertyAdjustId : AbstractMidWareProperty + { + public MidWarePropertyAdjustId(string value) + : base(PropertyAdjustId, value, ReportPropertyTarget.Firebase) + { + + } + + protected override void BeforeReportProperty() + { + _guruEventDriver.SetAdjustId(value); + } + } + + /// + /// AttStatus + /// + private class MidWarePropertyAttStatus : AbstractMidWareProperty + { + public MidWarePropertyAttStatus(string value) + : base(PropertyAttStatus, value, ReportPropertyTarget.Both) + { + + } + + protected override void BeforeReportProperty() + { + + } + } + + /// + /// AttStatus + /// + private class MidWarePropertyNotiPerm : AbstractMidWareProperty + { + public MidWarePropertyNotiPerm(string value) + : base(PropertyNotiPerm, value, ReportPropertyTarget.Both) + { + + } + + protected override void BeforeReportProperty() + { + + } + } + + + /// + /// AndroidId + /// + private class MidWarePropertyAndroidId : AbstractMidWareProperty + { + public MidWarePropertyAndroidId(string value) + : base(PropertyAndroidId, value, ReportPropertyTarget.Both) + { + } + + protected override void BeforeReportProperty() + { + _guruEventDriver.SetAndroidId(value); + } + } + + /// + /// FirebaseId + /// + private class MidWarePropertyGoogleAdId : AbstractMidWareProperty + { + public MidWarePropertyGoogleAdId(string value) + : base(PropertyGoogleAdId, value, ReportPropertyTarget.Both) + { + } + + protected override void BeforeReportProperty() + { + _guruEventDriver.SetGoogleAdId(value); + } + } + + /// + /// IDFV + /// + private class MidWarePropertyIDFV : AbstractMidWareProperty + { + public MidWarePropertyIDFV(string value) + : base(PropertyIDFV, value, ReportPropertyTarget.Both) + { + } + + protected override void BeforeReportProperty() + { + _guruEventDriver.SetIDFV(value); + } + } + + /// + /// IDFV + /// + private class MidWarePropertyIDFA : AbstractMidWareProperty + { + public MidWarePropertyIDFA(string value) + : base(PropertyIDFA, value, ReportPropertyTarget.Both) + { + } + + protected override void BeforeReportProperty() + { + _guruEventDriver.SetIDFA(value); + } + } + + /// + /// 必要属性上报配置 + /// + internal enum ReportPropertyTarget + { + Firebase = 1, + Guru = 2, + Both = 3, + } + + + /// + /// 全部属性集合 + /// + internal class MidWarePropertiesManager + { + + private static MidWarePropertiesManager _instance; + + public static MidWarePropertiesManager Instance + { + get + { + if (_instance == null) _instance = new MidWarePropertiesManager(); + return _instance; + } + } + + + private readonly Dictionary _propertyMap = new Dictionary(10); + + + /* + ======= 必打属性 ======== + user_id (F,G) + device_id (F,G) + first_open_time (F,G) + is_iap_user (F,G) + network (F,G) + + adjust_id (F) + att_status (F) + noti_perm (F) + ======= 必打属性 ======== + + ======= 补充属性 ======== + firebase_id + idfv + idfa + ======= 补充属性 ======== + */ + + //-------------------- 设置所有的属性 ----------------------- + + + public void ReportUid(string uid) + { + var prop = new MidWarePropertyUid(uid); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportDeviceId(string deviceId) + { + var prop = new MidWarePropertyDeviceId(deviceId); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportFirstOpenTime(string firstOpenTime) + { + var prop = new MidWarePropertyFirstOpenTime(firstOpenTime); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportIsIapUser(bool isIapUser) + { + var prop = new MidWarePropertyIsIapUser(isIapUser); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportNetworkStatus(string networkStatus) + { + var prop = new MidWarePropertyNetwork(networkStatus); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportAdjustId(string adjustId) + { + var prop = new MidWarePropertyAdjustId(adjustId); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportAttStatus(string attStatus) + { + var prop = new MidWarePropertyAttStatus(attStatus); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportNotiPerm(string notiPerm) + { + var prop = new MidWarePropertyNotiPerm(notiPerm); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportAndroidId(string androidId) + { + var prop = new MidWarePropertyAndroidId(androidId); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportGoogleAdId(string googleAdId) + { + var prop = new MidWarePropertyGoogleAdId(googleAdId); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + public void ReportIDFV(string idfv) + { + var prop = new MidWarePropertyIDFV(idfv); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + public void ReportIDFA(string idfa) + { + var prop = new MidWarePropertyIDFA(idfa); + _propertyMap.TryAdd(prop.key, prop); + prop.Report(); + } + + /// + /// 应用所有中台打点的用户属性 + /// + public void ApplyAllProperties() + { + // 应用所有用户属性 + Debug.Log($"{TAG} --- UpdateAllValues ---"); + + foreach (var prop in _propertyMap.Values) + { + prop.Report(); + } + + ReportEventSuccessRate(); + } + + /// + /// 上报事件成功率 + /// + private static void ReportEventSuccessRate() + { + var interval = (DateTime.Now - _lastReportRateDate).TotalSeconds; + if (interval > _reportSuccessInterval) + { + GuruAnalytics.Instance.ReportEventSuccessRate(); + _lastReportRateDate = DateTime.Now; + } + } + } + + + #endregion } + + } \ No newline at end of file diff --git a/Runtime/GuruCore/Runtime/Analytics/Analytics.cs b/Runtime/GuruCore/Runtime/Analytics/Analytics.cs index 333e897..04dee84 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Analytics.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Analytics.cs @@ -47,6 +47,7 @@ namespace Guru private static bool IsDebug => PlatformUtil.IsDebug(); private static bool IsFirebaseReady => FirebaseUtil.IsFirebaseInitialized; + private static bool IsGuruAnalyticsReady => GuruAnalytics.IsReady; private static AdjustEventDriver _adjustEventDriver; private static FBEventDriver _fbEventDriver; @@ -68,6 +69,9 @@ namespace Guru _fbEventDriver = new FBEventDriver(); _firebaseEventDriver = new FirebaseEventDriver(); _guruEventDriver = new GuruEventDriver(); + + SetDeviceId(IPMConfig.IPM_DEVICE_ID); + SetFirstOpenTime(IPMConfig.FIRST_OPEN_TIME); } /// @@ -100,9 +104,19 @@ namespace Guru _adjustEventDriver.TriggerFlush(); } - public static void OnGuruAnalyticsInitComplete() + + private static void OnGuruAnalyticsInitComplete() { - _guruEventDriver.TriggerFlush(); + ShouldFlushGuruEvents(); + } + + + public static void ShouldFlushGuruEvents() + { + if (!string.IsNullOrEmpty(IPMConfig.IPM_UID) && !_guruEventDriver.IsReady) + { + _guruEventDriver.TriggerFlush(); + } } @@ -166,7 +180,7 @@ namespace Guru _guruEventDriver.AddProperty(key, value); _firebaseEventDriver.AddProperty(key, value); // 更新所有必要的用户属性 - ApplyAllUserProperties(); + ApplyAllMidWareProperties(); Debug.Log($"{TAG} --- SetUserProperty -> propertyName:{key}, propertyValue:{value}"); } catch (Exception ex) diff --git a/Runtime/GuruCore/Runtime/Analytics/Events/AbstractEventDriver.cs b/Runtime/GuruCore/Runtime/Analytics/Events/AbstractEventDriver.cs index 5a6bc8a..f343179 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Events/AbstractEventDriver.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Events/AbstractEventDriver.cs @@ -1,3 +1,7 @@ +using System; +using System.Collections; +using UnityEngine; + namespace Guru { using System.Collections.Concurrent; @@ -13,15 +17,47 @@ namespace Guru void AddProperty(string key, string value); } + internal class MidWarePropertyDelayedAction + { + internal readonly string key; + private readonly string value; + private readonly Action reportAction; + + internal MidWarePropertyDelayedAction(string key, string value, Action reportAction) + { + this.key = key; + this.value = value; + this.reportAction = reportAction; + } + + internal void Execute() + { + reportAction.Invoke(value); + } + + public override bool Equals(object obj) + { + if (obj is not MidWarePropertyDelayedAction action) return false; + return key == action.key; + } + + public override int GetHashCode() + { + return key.GetHashCode(); + } + } + public abstract class AbstractEventDriver: IEventDriver, IPropertyCollector { private readonly GuruEventBuffer _eventBuffer = new GuruEventBuffer(); private readonly ConcurrentDictionary _userPropertyMap = new ConcurrentDictionary(); + private readonly HashSet _predefinedPropertyDelayedActions = new HashSet(); // Firebase 是否可用 private bool _isDriverReady; + public bool IsReady => _isDriverReady; public void TriggerFlush() { @@ -79,17 +115,26 @@ namespace Guru { while(_eventBuffer.Pop(out var trackingEvent)) { + Debug.Log($"[ANU] --- GuruAnalytics: FlushAll Events: {trackingEvent.eventName}"); FlushTrackingEvent(trackingEvent); } foreach (var key in _userPropertyMap.Keys) { + Debug.Log($"[ANU] --- GuruAnalytics: FlushAll Properties: {key}:{ _userPropertyMap[key]}"); SetUserProperty(key, _userPropertyMap[key]); } _userPropertyMap.Clear(); + + + foreach (var propertyAction in _predefinedPropertyDelayedActions) + { + Debug.Log($"[ANU] --- GuruAnalytics: FlushAll predefined Properties: {propertyAction.key}:{ propertyAction}"); + propertyAction.Execute(); + } + _predefinedPropertyDelayedActions.Clear(); } - /// /// 发送事件 /// @@ -98,7 +143,151 @@ namespace Guru protected abstract void SetUserProperty(string key, string value); + + /// + /// 设置用户ID + /// + public void SetUid(string uid) + { + if (_isDriverReady) + { + ReportUid(uid); + } + else + { + _predefinedPropertyDelayedActions.Add(new MidWarePropertyDelayedAction(Analytics.PropertyUserID, uid, ReportUid)); + } + } + public void SetDeviceId(string deviceId) + { + if (_isDriverReady) + { + ReportDeviceId(deviceId); + } + else + { + _predefinedPropertyDelayedActions.Add(new MidWarePropertyDelayedAction(Analytics.PropertyDeviceID, deviceId, ReportDeviceId)); + } + } + + /// + /// 设置 AdjustId + /// (Firebase) + /// + public void SetAdjustId(string adjustId) + { + if (_isDriverReady) + { + ReportAdjustId(adjustId); + } + else + { + _predefinedPropertyDelayedActions.Add(new MidWarePropertyDelayedAction(Analytics.PropertyAdjustId, adjustId, ReportAdjustId)); + } + + } + + /// + /// 设置 AdId + /// + public void SetGoogleAdId(string googleAdId) + { + if (_isDriverReady) + { + ReportGoogleAdId(googleAdId); + } + else + { + _predefinedPropertyDelayedActions.Add(new MidWarePropertyDelayedAction(Analytics.PropertyGoogleAdId, googleAdId, ReportGoogleAdId)); + } + + } + + /// + /// 设置 AndroidId + /// + /// + public void SetAndroidId(string androidId) + { + if (_isDriverReady) + { + ReportAndroidId(androidId); + } + else + { + _predefinedPropertyDelayedActions.Add(new MidWarePropertyDelayedAction(Analytics.PropertyAndroidId, androidId, ReportAndroidId)); + } + + } + + /// + /// 设置 IDFV + /// + public void SetIDFV(string idfv) + { + if (_isDriverReady) + { + ReportIDFV(idfv); + } + else + { + _predefinedPropertyDelayedActions.Add(new MidWarePropertyDelayedAction(Analytics.PropertyIDFV, idfv, ReportIDFV)); + } + + } + + /// + /// 设置 IDFA + /// + public void SetIDFA(string idfa) + { + if (_isDriverReady) + { + ReportIDFA(idfa); + } + else + { + _predefinedPropertyDelayedActions.Add(new MidWarePropertyDelayedAction(Analytics.PropertyIDFA, idfa, ReportIDFA)); + } + } + + /// + /// 设置用户ID + /// (Firebase, Guru) + /// + protected abstract void ReportUid(string uid); + + /// + /// 设置设备ID + /// (Firebase, Guru) + /// + protected abstract void ReportDeviceId(string deviceId); + /// + /// 设置 AdjustId + /// (Firebase) + /// + protected abstract void ReportAdjustId(string adjustId); + + /// + /// 设置 googleAdId + /// + protected abstract void ReportGoogleAdId(string googleAdId); + + /// + /// 设置 AndroidId + /// + protected abstract void ReportAndroidId(string androidId); + + /// + /// 设置 IDFV + /// + protected abstract void ReportIDFV(string idfv); + + /// + /// 设置 IDFA + /// + protected abstract void ReportIDFA(string idfa); } diff --git a/Runtime/GuruCore/Runtime/Analytics/Events/AdjustEventDriver.cs b/Runtime/GuruCore/Runtime/Analytics/Events/AdjustEventDriver.cs index 7cfe63d..db1e267 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Events/AdjustEventDriver.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Events/AdjustEventDriver.cs @@ -31,5 +31,53 @@ namespace Guru { } + + //---------------- 单独实现所有的独立属性打点 ------------------ + + /// + /// 设置用户ID + /// + protected override void ReportUid(string uid) + { + } + + protected override void ReportDeviceId(string deviceId) + { + } + + /// + /// 设置 AdjustId + /// (Firebase) + /// + protected override void ReportAdjustId(string adjustId) + { + } + + /// + /// 设置 AdId + /// + protected override void ReportGoogleAdId(string adId) + { + } + + protected override void ReportAndroidId(string androidId) + { + } + + /// + /// 设置 IDFV + /// + protected override void ReportIDFV(string idfv) + { + + } + + /// + /// 设置 IDFA + /// + protected override void ReportIDFA(string idfa) + { + + } } } \ No newline at end of file diff --git a/Runtime/GuruCore/Runtime/Analytics/Events/FBEventDriver.cs b/Runtime/GuruCore/Runtime/Analytics/Events/FBEventDriver.cs index d81d61b..08ba8ca 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Events/FBEventDriver.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Events/FBEventDriver.cs @@ -1,8 +1,9 @@ -using System; -using UnityEngine; + namespace Guru { + using UnityEngine; + public class FBEventDriver: AbstractEventDriver { /// @@ -22,5 +23,57 @@ namespace Guru { } + + //---------------- 单独实现所有的独立属性打点 ------------------ + + /// + /// 设置用户ID + /// + protected override void ReportUid(string uid) + { + + } + protected override void ReportDeviceId(string deviceId) + { + + } + + /// + /// 设置 AdjustId + /// (Firebase) + /// + protected override void ReportAdjustId(string adjustId) + { + + } + + /// + /// 设置 AdId + /// + protected override void ReportGoogleAdId(string adId) + { + + } + + protected override void ReportAndroidId(string adId) + { + + } + + /// + /// 设置 IDFV + /// + protected override void ReportIDFV(string idfv) + { + + } + + /// + /// 设置 IDFA + /// + protected override void ReportIDFA(string idfa) + { + + } } } \ No newline at end of file diff --git a/Runtime/GuruCore/Runtime/Analytics/Events/FirebaseEventDriver.cs b/Runtime/GuruCore/Runtime/Analytics/Events/FirebaseEventDriver.cs index 2e0bda7..7dbb61a 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Events/FirebaseEventDriver.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Events/FirebaseEventDriver.cs @@ -59,5 +59,33 @@ namespace Guru FirebaseAnalytics.SetUserProperty(key, value); } + protected override void ReportUid(string uid) + { + FirebaseAnalytics.SetUserId(uid); + } + + protected override void ReportDeviceId(string deviceId) + { + } + + protected override void ReportAdjustId(string adjustId) + { + } + + protected override void ReportGoogleAdId(string adId) + { + } + + protected override void ReportAndroidId(string adId) + { + } + + protected override void ReportIDFV(string idfv) + { + } + + protected override void ReportIDFA(string idfa) + { + } } } \ No newline at end of file diff --git a/Runtime/GuruCore/Runtime/Analytics/Events/GuruEventDriver.cs b/Runtime/GuruCore/Runtime/Analytics/Events/GuruEventDriver.cs index 3489d22..ff96e84 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Events/GuruEventDriver.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Events/GuruEventDriver.cs @@ -1,5 +1,7 @@ + namespace Guru { + public class GuruEventDriver: AbstractEventDriver { protected override void FlushTrackingEvent(TrackingEvent trackingEvent) @@ -16,6 +18,62 @@ namespace Guru // ReSharper disable once Unity.PerformanceCriticalCodeInvocation GuruAnalytics.Instance.SetUserProperty(key, value); } + + //---------------- 单独实现所有的独立属性打点 ------------------ + + /// + /// 设置用户ID + /// + protected override void ReportUid(string uid) + { + GuruAnalytics.Instance.SetUid(uid); + } + /// + /// 设置设备ID + /// (Firebase, Guru) + /// + protected override void ReportDeviceId(string deviceId) + { + GuruAnalytics.Instance.SetDeviceId(deviceId); + } + + /// + /// 设置 AdjustId + /// (Firebase) + /// + protected override void ReportAdjustId(string adjustId) + { + GuruAnalytics.Instance.SetAdjustId(adjustId); + } + + protected override void ReportAndroidId(string androidId) + { + GuruAnalytics.Instance.SetAndroidId(androidId); + } + + /// + /// 设置 AdId + /// + protected override void ReportGoogleAdId(string adId) + { + GuruAnalytics.Instance.SetAdId(adId); + } + + /// + /// 设置 IDFV + /// + protected override void ReportIDFV(string idfv) + { + GuruAnalytics.Instance.SetIDFV(idfv); + } + + /// + /// 设置 IDFA + /// + protected override void ReportIDFA(string idfa) + { + GuruAnalytics.Instance.SetIDFA(idfa); + } } } \ No newline at end of file diff --git a/Runtime/GuruCore/Runtime/IPM/Scripts/IPMConfig.cs b/Runtime/GuruCore/Runtime/IPM/Scripts/IPMConfig.cs index 2445af1..d3e6a22 100644 --- a/Runtime/GuruCore/Runtime/IPM/Scripts/IPMConfig.cs +++ b/Runtime/GuruCore/Runtime/IPM/Scripts/IPMConfig.cs @@ -261,12 +261,20 @@ namespace Guru get => PlayerPrefs.GetString(nameof(ADJUST_GOOGLE_ADID), ""); set => PlayerPrefs.SetString(nameof(ADJUST_GOOGLE_ADID), value); } - - - public static string FirstOpenTime + + public static string FIRST_OPEN_TIME { - get => PlayerPrefs.GetString(nameof(FirstOpenTime), ""); - set => PlayerPrefs.SetString(nameof(FirstOpenTime), value); + get + { + var value = PlayerPrefs.GetString(nameof(FIRST_OPEN_TIME), ""); + if (string.IsNullOrEmpty(value)) + { + value = TimeUtil.GetCurrentTimeStamp().ToString(); + FIRST_OPEN_TIME = value; + } + return value; + } + set => PlayerPrefs.SetString(nameof(FIRST_OPEN_TIME), value); } } } \ No newline at end of file