From cc5d36fea6efd4044e1c5fa8408c305e76cefb2d Mon Sep 17 00:00:00 2001 From: huyufei Date: Thu, 8 Aug 2024 20:06:20 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E4=BF=AE=E5=A4=8D=E8=87=AA=E6=89=93?= =?UTF-8?q?=E7=82=B9=E5=B1=9E=E6=80=A7=E9=87=8D=E5=A4=8D=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=8C=20=E8=B0=83=E6=95=B4=E4=BA=86=20iOS?= =?UTF-8?q?=20=E6=A1=A5=E6=8E=A5=20NULL=20=E5=88=A4=E5=AE=9A=EF=BC=8C=20?= =?UTF-8?q?=E5=B0=BD=E9=87=8F=E5=AF=B9=E9=BD=90=20Flutter=20=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E8=BF=98=E5=8E=9F=20Android=20=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=9A=84=E4=B8=8A=E6=8A=A5=E4=BA=8B=E4=BB=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: huyufei --- Editor/BuildTool/AppBuilder.cs | 4 +- .../Plugins/Android/U3DAnalytics-1.12.0.aar | Bin 13247 -> 12595 bytes .../Plugins/iOS/U3DAnalytics_1.12.0.mm | 83 ++++--- .../Runtime/Script/GuruAnalytics.cs | 234 +++++++++++------- .../Script/GuruAnalyticsConfigManager.cs | 8 +- .../Runtime/Script/IAnalyticsAgent.cs | 3 + .../Script/Impl/AnalyticsAgentAndroid.cs | 6 +- .../Runtime/Script/Impl/AnalyticsAgentIOS.cs | 27 +- .../Runtime/Script/Impl/AnalyticsAgentMock.cs | 22 +- .../Runtime/Analytics/Analytics.Property.cs | 33 ++- 10 files changed, 261 insertions(+), 159 deletions(-) diff --git a/Editor/BuildTool/AppBuilder.cs b/Editor/BuildTool/AppBuilder.cs index 73515b8..ab4b98c 100644 --- a/Editor/BuildTool/AppBuilder.cs +++ b/Editor/BuildTool/AppBuilder.cs @@ -451,7 +451,7 @@ namespace Guru.Editor string strMon = nowDate.Month.ToString("00"); string strDay = nowDate.Day.ToString("00"); string strQuarter = ((nowDate.Hour * 60 + nowDate.Minute) / 15).ToString("00"); - // 2024-08-01 08:00:00 to version string: 240801 + // 2024-08-01 08:00:00 to version string: 24080130 string strBuildNumber = $"{strYear}{strMon}{strDay}{strQuarter}"; return strBuildNumber; } @@ -539,7 +539,7 @@ namespace Guru.Editor string strMon = nowDate.Month.ToString("00"); string strDay = nowDate.Day.ToString("00"); string strQuarter = ((nowDate.Hour * 60 + nowDate.Minute) / 15).ToString("00"); - // 2024-08-01 08:00:00 to version string: 240801 + // 2024-08-01 00:00:00 to version string: 24080100 string strBuildNumber = $"{strYear}{strMon}{strDay}{strQuarter}"; Debug.Log($"Get BuildVersion Code: {strBuildNumber}"); } diff --git a/Runtime/GuruAnalytics/Plugins/Android/U3DAnalytics-1.12.0.aar b/Runtime/GuruAnalytics/Plugins/Android/U3DAnalytics-1.12.0.aar index 26bfd4df0b9bd7b7feb230990aa3c3b85985751d..52e9e650f93b8875629d13ffb968d24431a164f8 100644 GIT binary patch delta 11945 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%0A~5Iu73r>7eP8P+Od*JCKS^i$N1-KLy%>Kdmfvyq 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

7o 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 diff --git a/Runtime/GuruAnalytics/Plugins/iOS/U3DAnalytics_1.12.0.mm b/Runtime/GuruAnalytics/Plugins/iOS/U3DAnalytics_1.12.0.mm index a79dfbb..d34fd7f 100644 --- a/Runtime/GuruAnalytics/Plugins/iOS/U3DAnalytics_1.12.0.mm +++ b/Runtime/GuruAnalytics/Plugins/iOS/U3DAnalytics_1.12.0.mm @@ -1,7 +1,7 @@ // ============================================== // U3DAnalytics 1.12.0 // Native Framework Version 0.3.6 -// update date: 2024-08-06 -- by HuYufei +// update date: 2024-08-08 -- by HuYufei // // Created by HuYufei on 2022/11/17. // Copyright © 2022 guru. All rights reserved. @@ -68,11 +68,15 @@ NSString * const TchError = @"tch_error"; // 获取最终字符串 +(char*) finalChar: (NSString *) string { - const char *tmpChar = [string cStringUsingEncoding:NSASCIIStringEncoding]; - - if (string == NULL) + if(string == NULL){ return NULL; + } + const char *tmpChar = [string cStringUsingEncoding:NSASCIIStringEncoding]; + + if(tmpChar == NULL){ + return NULL; + } char* res = (char*)malloc(strlen(tmpChar) + 1); strcpy(res, tmpChar); @@ -86,15 +90,16 @@ NSString * const TchError = @"tch_error"; // 设置是否启用日志错误上报 +(void) setEnableErrorLog: (bool) value{ - if(enableErrorLog == false && value){ - - enableErrorLog = value; - + if(value){ + // 注册事件 + enableErrorLog = true; [GuruAnalytics registerInternalEventObserverWithReportCallback:^(NSInteger code, NSString * info){ [U3DAnalytics onEventCallback:code andInfo:info]; }]; - + return; } + // 否则只赋值 + enableErrorLog = value; } @@ -108,29 +113,33 @@ NSString * const TchError = @"tch_error"; }]; } - - // 设置 BaseUrl +(void) setBaseUrl: (const char *) baseUrl{ - if (baseUrl != nullptr && strlen(baseUrl) == 0) { return; // baseUrl 为空 } - [GuruAnalytics setEventsUploadEndPointWithHost:[U3DAnalytics charToString:baseUrl]]; } - - // 事件上报回调 -+(void) onEventCallback: (NSInteger)code andInfo:(NSString *) info{ - [U3DAnalytics sendMessage: [U3DAnalytics buildLogEventString: code andMessage:info]]; ++(void) onEventCallback: (NSInteger)code andInfo:(NSString *) info { + if(enableErrorLog == false) { + return; // 开关关闭不报 + } + if(info == nil){ + return; // 空字符串不报 + } + NSString *msg = [U3DAnalytics buildLogEventString: code andMessage:info]; + if(msg != NULL){ + return; + } + [U3DAnalytics sendMessageToUnity: msg]; } - // 构建数据 +(NSString *) buildLogEventString: (NSInteger)status andMessage: (NSString *)msg{ NSString *jsonString = [NSString stringWithFormat: @"{\"action\":\"logger_error\",\"data\":{\"code\":%d,\"msg\":\"%@\"}}", (int)status, msg]; + NSLog(@"[ANI][Error]: %@", jsonString); return jsonString; } @@ -158,7 +167,7 @@ NSString * const TchError = @"tch_error"; if([t isEqual: @"i"]){ // int [dict setValue:@([v integerValue]) forKey:k]; - }else if([t isEqual: @"d"]){ + } else if ([t isEqual: @"d"]){ // double [dict setValue:@([v doubleValue]) forKey:k]; } else { @@ -211,26 +220,31 @@ NSString * const TchError = @"tch_error"; // 不存在 ad_paltform [U3DAnalytics onTchErrorEvent:@"no_ad_platform" andRaw:json andOther:@""]; } else { + if(![[_platform stringValue] isEqual:@"appstore"]){ + return; + } + // 非IAP订单 - if(![[_platform stringValue] isEqual:@"appstore"] ) - { - if([U3DAnalytics isNullObject: _value] ){ + if([U3DAnalytics isNullObject: _value] ){ + [dict setValue: [NSNumber numberWithDouble: targetValue] forKey:@"value"]; + [U3DAnalytics onTchErrorEvent:@"no_value" andRaw:json andOther:@""]; + } else { + if([_value doubleValue] < targetValue){ [dict setValue: [NSNumber numberWithDouble: targetValue] forKey:@"value"]; - [U3DAnalytics onTchErrorEvent:@"no_value" andRaw:json andOther:@""]; - } else { - if([_value doubleValue] < targetValue){ - [dict setValue: [NSNumber numberWithDouble: targetValue] forKey:@"value"]; - [U3DAnalytics onTchErrorEvent:@"value_error" - andRaw:json andOther: [_value stringValue]]; - } + [U3DAnalytics onTchErrorEvent:@"value_error" + andRaw:json andOther: [_value stringValue]]; } } + } } // 向Unity发送数据 -+(void) sendMessage: (NSString *)msg ++(void) sendMessageToUnity: (NSString *)msg { + if (msg == NULL) { + return; + } // NSLog(@"--- unityInitSDK222: %@:%@", gameObjectName, callbackName); if(gameObjectName != nil && callbackName != nil){ char *t1 = [U3DAnalytics finalChar: gameObjectName]; @@ -277,7 +291,7 @@ NSString * const TchError = @"tch_error"; extern "C" { - // 请求GDPR + // 初始化自打点 void unityInitAnalytics(const char *appId, const char *deviceInfo, bool isDebug, const char *baseUrl, const char *uploadIpAddressStr) { // NSLog(@"--- [iOS] init Analytics libs"); @@ -296,7 +310,8 @@ extern "C" { // 设置 uploadIpAddress // TODO: 当前的版本并不支持 uploadIpAddress, 后面的版本将 uploadIpAddressStr 转化为 Array 传入接口 } - + + // 初始化回调对象和参数 void unityInitCallback(const char *gameObject, const char *method){ // NSLog(@"--- unityInitSDK111: %s:%s", gameObject, method); gameObjectName = [NSString stringWithUTF8String:gameObject]; @@ -308,7 +323,7 @@ extern "C" { [GuruAnalytics setUserID:[U3DAnalytics charToString:uid]]; } - // 设置用户ID + // 设置Screen void unitySetScreen(const char *screenName){ [GuruAnalytics setScreen:[U3DAnalytics charToString:screenName]]; } @@ -349,7 +364,7 @@ extern "C" { parameters:[U3DAnalytics buildDataWithJson:json andKey:evtName]]; // JSON转换 } - // 上报事件 + // 设置 Tch02 的上限值(即将废弃) void unitySetTch02Value(const double value){ [U3DAnalytics setTch02MaxValue:value]; } diff --git a/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs b/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs index e414d2e..dac2c2f 100644 --- a/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs +++ b/Runtime/GuruAnalytics/Runtime/Script/GuruAnalytics.cs @@ -1,3 +1,4 @@ +// ReSharper disable ReplaceSubstringWithRangeIndexer namespace Guru { using System; @@ -78,14 +79,11 @@ namespace Guru } } - ///

- /// 错误 code 表 - /// - private readonly List _errorCodeList = new List(); private bool _enableErrorLog; private string _experimentGroupId; public string ExperimentGroupId => _experimentGroupId; + private DateTime _lastReportTime; /// /// 启动日志错误上报 @@ -144,7 +142,8 @@ namespace Guru // 初始化参数 Agent.Init(appId, deviceInfo, baseUrl, uploadIpAddress, onInitComplete, isDebug); - + + _lastReportTime = new DateTime(1970, 1, 1); _isReady = true; Debug.Log($"{Tag} --- Guru Analytics [{Version}] initialized."); Debug.Log($"{Tag} --- GroupId: {groupId}"); @@ -403,7 +402,7 @@ namespace Guru { if (string.IsNullOrEmpty(raw)) return; if (!raw.Contains($"\"{ActionName}\"")) return; // 不对其他行为的日志进行过滤 - ParseWithJson(raw); + ParseJsonAndSendEvent(raw); } /// @@ -411,72 +410,64 @@ namespace Guru /// /// /// - private void OnLoggerErrorEvent(int code, string errorInfo = "") + /// + /// + private void ReportDevAuditEvent(int code, string errorInfo = "", string category = "", Dictionary extra = null) { // Debug.Log($"{Tag} --- OnLoggerErrorEvent: code:{code}\t info:{errorInfo}"); var codeString = ((AnalyticsCode)code).ToString(); - if (string.IsNullOrEmpty(codeString) || codeString == AnalyticsCode.Unknown.ToString()) codeString = $"ErrorCode:{code}"; + if (string.IsNullOrEmpty(codeString)) codeString = $"ErrorCode:{code}"; + if (string.IsNullOrEmpty(errorInfo)) errorInfo = "Empty"; - Dictionary parameters = new Dictionary() + var parameters = new Dictionary() { - {"item_category", "error_event"}, {"item_name", codeString}, {"country", IPMConfig.IPM_COUNTRY_CODE}, {"network", Application.internetReachability.ToString()}, + {"exp", _experimentGroupId} }; + + if (!string.IsNullOrEmpty(category)) + { + parameters[Analytics.ParameterItemCategory] = category; + } + + int len = 96; + if (errorInfo.Length > len) + errorInfo = errorInfo.TrimStart().Substring(0, len); + if (!string.IsNullOrEmpty(errorInfo)) + parameters["err"] = errorInfo; + + if (extra != null) { - // if (errorInfo.Contains("\"")) errorInfo = errorInfo.Replace("\"", "\\\""); - - int len = 96; - if (errorInfo.Length > len) errorInfo = errorInfo.TrimStart().Substring(0, len); + foreach (var kvp in extra) + { + parameters[kvp.Key] = kvp.Value; + } } - else - { - errorInfo = "empty error info"; - } - - parameters["err"] = errorInfo; - - Debug.Log($"{Tag} ------ ErrorLogInfo:: code:{codeString}\tinfo:{errorInfo}"); // Only for firebase GA Analytics.TrackEvent("dev_audit", parameters, new Analytics.EventSetting() { EnableFirebaseAnalytics = true }); } - - - private void ParseWithJson(string json) + + private void ParseJsonAndSendEvent(string json) { Debug.Log($"{Tag} ------ ParseWithJson: json:\n{json}"); - int code = (int)AnalyticsCode.Unknown; + int code = (int)AnalyticsCode.UNITY_INTERNAL_ERROR; string info = json; try { var dict = JsonConvert.DeserializeObject(json); - if(dict != null && dict.TryGetValue("data", out var jData)) - { - var j = jData.Value(); - if (j != null && j.TryGetValue("code", out var jCode)) - { - code = jCode.Value(); - - if (j.TryGetValue("msg", out var jMsg)) - { - info = jMsg.Value(); - } - else - { - info = $"wrong msg format: {json}"; - } - } - } - else - { - info = "no data property"; - } - ReportCodeInfo(code, info); + if (dict == null || !dict.TryGetValue("data", out var jData)) return; + var j = jData.Value(); + if (j == null || !j.TryGetValue("code", out var jCode)) return; + code = jCode.Value(); + if (!j.TryGetValue("msg", out var jMsg)) return; + info = jMsg.Value(); + ReportWithCodeAndInfo(code, info); } catch (Exception) { @@ -487,85 +478,141 @@ namespace Guru // Debug.Log($"{Tag} --- {info}"); Analytics.LogCrashlytics(json, false); Analytics.LogCrashlytics(info); - ReportCodeInfo(code, info); + ReportWithCodeAndInfo(code, info); } } - private void ReportCodeInfo(int code, string info) + /// + /// 上报异常 + /// 上报条件:上报总数 > 30 条, 上报成功率小于 0.7, 且间隔 5 分钟 + /// Native 已经处理数量和成功率判断 + /// + /// + /// + private void ReportWithCodeAndInfo(int code, string info) { + if (Agent == null) return; + if (Application.internetReachability == NetworkReachability.NotReachable) return; // 网络不可用时不上报 + + ReportAnalyticsAudit(); // 上报 + + // 源码:https://github.com/castbox/flutter_jigsort/blob/3.2.0V2/lib/data/jigsort_compliance_protocol.dart + var ac = (AnalyticsCode)code; Debug.Log($"{Tag} ------ Get Code And Info: code:{code}[{ac}] \tinfo:{info}"); - bool canCatch = false; switch (ac) { - case AnalyticsCode.Unknown: - case AnalyticsCode.DELETE_EXPIRED: - case AnalyticsCode.UPLOAD_FAIL: - case AnalyticsCode.NETWORK_LOST: - case AnalyticsCode.CRONET_INIT_FAIL: - case AnalyticsCode.CRONET_INIT_EXCEPTION: - case AnalyticsCode.ERROR_API: - case AnalyticsCode.ERROR_RESPONSE: - case AnalyticsCode.ERROR_CACHE_CONTROL: - case AnalyticsCode.ERROR_DELETE_EXPIRED: - case AnalyticsCode.ERROR_LOAD_MARK: - case AnalyticsCode.ERROR_DNS: - case AnalyticsCode.ERROR_ZIP: - case AnalyticsCode.ERROR_DNS_CACHE: - case AnalyticsCode.CRONET_INTERCEPTOR: - case AnalyticsCode.EVENT_LOOKUP: - case AnalyticsCode.EVENT_SESSION_ACTIVE: - canCatch = true; + case AnalyticsCode.UNITY_INTERNAL_ERROR: // -1 + ReportUnityErrorEvent(code, info); + break; + // case AnalyticsCode.DELETE_EXPIRED: + case AnalyticsCode.UPLOAD_FAIL: //14 + ReportUploadFailEvent(code, info); + break; + // case AnalyticsCode.NETWORK_LOST: + // case AnalyticsCode.CRONET_INIT_FAIL: + // case AnalyticsCode.CRONET_INIT_EXCEPTION: + // case AnalyticsCode.ERROR_API: + // case AnalyticsCode.ERROR_RESPONSE: + // case AnalyticsCode.ERROR_CACHE_CONTROL: + // case AnalyticsCode.ERROR_DELETE_EXPIRED: + case AnalyticsCode.ERROR_LOAD_MARK: // 105 + ReportRuntimeErrorEvent(code, info); + break; + // case AnalyticsCode.ERROR_DNS: + // case AnalyticsCode.ERROR_ZIP: + // case AnalyticsCode.ERROR_DNS_CACHE: + // case AnalyticsCode.CRONET_INTERCEPTOR: + // case AnalyticsCode.ERROR_SESSION_START_ERROR: + case AnalyticsCode.EVENT_LOOKUP: // 1003 + ReportDNSErrorEvent(code, info); + break; + case AnalyticsCode.EVENT_SESSION_ACTIVE: // 1004 + ReportSessionActiveErrorEvent(code, info); break; } - if (!canCatch && code is > 100 and <= 200) - { - // 100 < code <= 200 - canCatch = true; - } + } + + private int _reportUploadFailCount = 0; + /// + /// 上报失败事件 (14) + /// + /// + /// + private void ReportUploadFailEvent(int code, string info) + { + if (Agent.GetEventCountTotal() < 50) return; // 数量太少不报 + if ((float)Agent.GetEventCountUploaded() / Agent.GetEventCountTotal() > 0.6f) return; // 成功率太高也不报 + if (_reportUploadFailCount >= 5) return; // N 次之后不再上报 + ReportDevAuditEvent(code, info); + _reportUploadFailCount++; + } - if (_errorCodeList != null && _errorCodeList.Count > 0) - { - if (_errorCodeList[0] == -1) - { - canCatch = true; - } - else - { - canCatch = _errorCodeList.Contains(code); - } - } + private int _reportRuntimeExceptionTimes = 0; + // 105 + private void ReportRuntimeErrorEvent(int code, string info) + { + if (_reportRuntimeExceptionTimes >= 5) return; // N 次之后不再上报 + ReportDevAuditEvent(code, info); + _reportRuntimeExceptionTimes++; + } + + // 1003 + private void ReportDNSErrorEvent(int code, string info) + { + ReportDevAuditEvent(code, info, "ga_dns"); + } + // 1004 + private void ReportSessionActiveErrorEvent(int code, string info) + { + ReportDevAuditEvent(code, info, "session_active"); + } + // -1 + private void ReportUnityErrorEvent(int code, string info) + { + ReportDevAuditEvent(code, info, "unity"); + } - if(canCatch) OnLoggerErrorEvent(code, info); + // 上报 Snapshot 数据 + private void ReportAnalyticsAudit() + { + if(DateTime.UtcNow - _lastReportTime < TimeSpan.FromMinutes(5)) // 5 分钟内只上报一次 + return; + + var snapshot = Agent.GetAuditSnapshot(); + if (string.IsNullOrEmpty(snapshot)) return; // 空字段不报 + + var data = JsonParser.ToObject>(snapshot); + if (data == null) return; // 解析失败不报 + + // 上报事件 + ReportDevAuditEvent(0, "","analytics_audit", data); + _lastReportTime = DateTime.UtcNow; } #endregion #region UNIT_TEST - - + #if UNITY_EDITOR public static void TestOnCallback(string msg) { Instance.OnSDKCallback(msg); } - #endif #endregion - } - - /// /// 网络状态枚举 + /// 详见 guru_analytics 库 guru.core.analytics.handler.AnalyticsCode 类 /// public enum AnalyticsCode { - Unknown = -1, + UNITY_INTERNAL_ERROR = -1, // unity 内部错误 DELETE_EXPIRED = 12, // 删除过期事件 UPLOAD_FAIL = 14, // 上报事件失败 @@ -582,6 +629,7 @@ namespace Guru ERROR_ZIP = 107, // zip 错误 ERROR_DNS_CACHE = 108, // zip 错误 CRONET_INTERCEPTOR = 109, // cronet拦截器 + ERROR_SESSION_START_ERROR = 110, EVENT_LOOKUP = 1003, EVENT_SESSION_ACTIVE = 1004, diff --git a/Runtime/GuruAnalytics/Runtime/Script/GuruAnalyticsConfigManager.cs b/Runtime/GuruAnalytics/Runtime/Script/GuruAnalyticsConfigManager.cs index 456485c..fdcd9bf 100644 --- a/Runtime/GuruAnalytics/Runtime/Script/GuruAnalyticsConfigManager.cs +++ b/Runtime/GuruAnalytics/Runtime/Script/GuruAnalyticsConfigManager.cs @@ -69,6 +69,7 @@ namespace Guru /// /// 默认的本地配置 + /// 2024-08-08 经后台确认,只保留 B 组,C 组已经被废弃 /// private const string DEFAULT_GURU_ANALYTICS_EXP = @"{ ""enable"": true, @@ -76,12 +77,7 @@ namespace Guru ""groupId"": ""B"", ""baseUrl"": ""https://collect.saas.castbox.fm"", ""uploadIpAddress"": [""13.248.248.135"", ""3.33.195.44""], - ""enableErrorLog"": true - }, { - ""groupId"": ""C"", - ""baseUrl"": ""https://collect3.saas.castbox.fm"", - ""uploadIpAddress"": [""34.107.185.54""], - ""enableErrorLog"": true + ""enableErrorLog"": false }] }"; diff --git a/Runtime/GuruAnalytics/Runtime/Script/IAnalyticsAgent.cs b/Runtime/GuruAnalytics/Runtime/Script/IAnalyticsAgent.cs index 44f839d..1de3f9d 100644 --- a/Runtime/GuruAnalytics/Runtime/Script/IAnalyticsAgent.cs +++ b/Runtime/GuruAnalytics/Runtime/Script/IAnalyticsAgent.cs @@ -21,5 +21,8 @@ namespace Guru void ReportEventSuccessRate(); // 上报任务成功率 void SetTch02Value(double value); // 设置太极02数值 void InitCallback(string objName, string method); // 设置回调对象参数 + int GetEventCountTotal(); // 获取事件总数 + int GetEventCountUploaded(); // 获取成功上报的事件数量 + string GetAuditSnapshot(); // 获取 AuditSnapshot 字段 } } \ No newline at end of file diff --git a/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentAndroid.cs b/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentAndroid.cs index 83b65ea..499d1da 100644 --- a/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentAndroid.cs +++ b/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentAndroid.cs @@ -14,7 +14,6 @@ namespace Guru #endif private static bool _isDebug = false; - public static string BaseUrl = ""; #region 工具方法 @@ -171,6 +170,11 @@ namespace Guru CallStatic("setEnableErrorLog", _enableErrorLog); } } + + public int GetEventCountTotal() => CallStatic("getEventCountAll"); + public int GetEventCountUploaded() => CallStatic("getEventCountUploaded"); + public string GetAuditSnapshot() => CallStatic("getAuditSnapshot"); + #endregion } diff --git a/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentIOS.cs b/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentIOS.cs index 2327b04..8106b66 100644 --- a/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentIOS.cs +++ b/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentIOS.cs @@ -29,6 +29,8 @@ namespace Guru [DllImport(K_INTERNAL)] private static extern void unitySetTch02Value(double value); [DllImport(K_INTERNAL)] private static extern void unitySetEnableErrorLog(bool value); [DllImport(K_INTERNAL)] private static extern void unityInitCallback(string objName, string method); + [DllImport(K_INTERNAL)] private static extern int unityGetEventsCountAll(); + [DllImport(K_INTERNAL)] private static extern int unityGetEventsCountUploaded(); #endif private static bool _isDebug = false; @@ -162,7 +164,30 @@ namespace Guru // iOS 测试用事件 public static void TestCrashEvent()=> unityTestUnrecognizedSelectorCrash(); #endif - + + public int GetEventCountTotal() + { +#if UNITY_IOS + return unityGetEventsCountAll(); +#endif + return 1; + } + + public int GetEventCountUploaded() + { +#if UNITY_IOS + return unityGetEventsCountUploaded(); +#endif + return 0; + } + + + public string GetAuditSnapshot() + { + // TODO:iOS 原生类并未实现此接口 + return ""; + } + #endregion } diff --git a/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentMock.cs b/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentMock.cs index 89c7714..01a3be9 100644 --- a/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentMock.cs +++ b/Runtime/GuruAnalytics/Runtime/Script/Impl/AnalyticsAgentMock.cs @@ -24,9 +24,12 @@ namespace Guru Debug.Log($"{TAG} EnableErrorLog:{value}"); _enableErrorLog = value; } - } + private int _eventTotalCount = 0; + private int _eventSuccessCount = 0; + + public void Init(string appId, string deviceInfo, string baseUrl, string[] uploadIpAddress, Action onInitComplete, bool isDebug = false) { #if UNITY_EDITOR @@ -148,6 +151,12 @@ namespace Guru Debug.Log($"{TAG} LogEvent: GuruAnalytics:{eventName} ({priority}) Properties:\n{sb.ToString()}"); } } + + _eventTotalCount++; + if (UnityEngine.Random.Range(0, 10) < 8) + { + _eventSuccessCount++; + } } public void ReportEventSuccessRate() @@ -160,13 +169,16 @@ namespace Guru Debug.Log($"{TAG} Tch02MaxValue: {value}"); } + public int GetEventCountTotal() => _eventTotalCount; + public int GetEventCountUploaded() => _eventSuccessCount; + public string GetAuditSnapshot() => ""; #region Editor Test API - - - + + + #endregion - + } } \ No newline at end of file diff --git a/Runtime/GuruCore/Runtime/Analytics/Analytics.Property.cs b/Runtime/GuruCore/Runtime/Analytics/Analytics.Property.cs index 60b3b6c..4e48a54 100644 --- a/Runtime/GuruCore/Runtime/Analytics/Analytics.Property.cs +++ b/Runtime/GuruCore/Runtime/Analytics/Analytics.Property.cs @@ -542,114 +542,113 @@ namespace Guru */ //-------------------- 设置所有的属性 ----------------------- - public void ReportUid(string uid) { var prop = new MidWarePropertyUid(uid); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportBLevel(string bLevel) { var prop = new MidWarePropertyBLevel(bLevel); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportBPlay(string bPlay) { var prop = new MidWarePropertyBPlay(bPlay); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportAnalyticsExperimentGroup(string groupName) { var prop = new MidWarePropertyAnalyticsExperimentGroup(groupName); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportSignUpMethod(string methodName) { var prop = new MidWarePropertySignUpMethod(methodName); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportDeviceId(string deviceId) { var prop = new MidWarePropertyDeviceId(deviceId); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportFirstOpenTime(string firstOpenTime) { var prop = new MidWarePropertyFirstOpenTime(firstOpenTime); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportIsIapUser(bool isIapUser) { var prop = new MidWarePropertyIsIapUser(isIapUser); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportNetworkStatus(string networkStatus) { var prop = new MidWarePropertyNetwork(networkStatus); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportAdjustId(string adjustId) { var prop = new MidWarePropertyAdjustId(adjustId); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportAttStatus(string attStatus) { var prop = new MidWarePropertyAttStatus(attStatus); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportNotiPerm(string notiPerm) { var prop = new MidWarePropertyNotiPerm(notiPerm); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportAndroidId(string androidId) { var prop = new MidWarePropertyAndroidId(androidId); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportGoogleAdId(string googleAdId) { var prop = new MidWarePropertyGoogleAdId(googleAdId); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportIDFV(string idfv) { var prop = new MidWarePropertyIDFV(idfv); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); } public void ReportIDFA(string idfa) { var prop = new MidWarePropertyIDFA(idfa); - _propertyMap.TryAdd(prop.key, prop); + _propertyMap[prop.key] = prop; prop.Report(); }