| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  | namespace Guru | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     using UnityEngine; | 
					
						
							|  |  |  |     using System; | 
					
						
							| 
									
										
										
										
											2023-12-28 08:33:12 +00:00
										 |  |  |     using System.Collections; | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |     using System.Collections.Generic; | 
					
						
							|  |  |  |     using System.IO; | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |     using Debug = UnityEngine.Debug; | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |      | 
					
						
							|  |  |  |     public partial class GuruSDK: MonoBehaviour | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-06-21 06:39:55 +00:00
										 |  |  |         // SDK_VERSION | 
					
						
							| 
									
										
										
										
											2024-07-25 02:17:16 +00:00
										 |  |  |         public const string Version = "1.1.0";  | 
					
						
							| 
									
										
										
										
											2024-05-31 05:41:13 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2024-06-21 06:39:55 +00:00
										 |  |  |         // Const | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         public const string Tag = "[Guru]"; | 
					
						
							|  |  |  |         public const string ServicesConfigKey = "guru_services"; | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |          | 
					
						
							|  |  |  |         private static GuruSDK _instance; | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 单利引用 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         public static GuruSDK Instance | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             get | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if(null == _instance) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     _instance = CreateInstance(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 return _instance; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private GuruSDKInitConfig _initConfig; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         internal static GuruSDKInitConfig InitConfig => Instance._initConfig; | 
					
						
							|  |  |  |         internal static GuruSDKModel Model => GuruSDKModel.Instance; | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         private static GuruServicesConfig _appServicesConfig; | 
					
						
							| 
									
										
										
										
											2024-01-10 11:16:10 +00:00
										 |  |  |         private static GuruSettings _guruSettings; | 
					
						
							|  |  |  |         private static GuruSettings GuruSettings | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             get | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (_guruSettings == null) _guruSettings = GuruSettings.Instance; | 
					
						
							|  |  |  |                 return _guruSettings; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2024-03-06 04:36:41 +00:00
										 |  |  |         private static DateTime _initTime; | 
					
						
							| 
									
										
										
										
											2024-01-17 12:46:23 +00:00
										 |  |  |         private static bool _isDebugEnabled = false; | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// Debug Mode | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         public static bool IsDebugMode | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             get | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  | #if UNITY_EDITOR || DEBUG | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2024-01-17 12:46:23 +00:00
										 |  |  |                 return _isDebugEnabled; | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-01-07 14:59:02 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 初始化成功标志位 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         public static bool IsInitialSuccess { get; private set; } = false; | 
					
						
							| 
									
										
										
										
											2024-03-22 05:20:54 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// Firebase 就绪标志位 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							| 
									
										
										
										
											2024-03-20 06:29:43 +00:00
										 |  |  |         public static bool IsFirebaseReady { get; private set; } = false; | 
					
						
							| 
									
										
										
										
											2024-03-22 05:20:54 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 服务就绪标志位 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         public static bool IsServiceReady { get; private set; } = false; | 
					
						
							| 
									
										
										
										
											2024-03-20 06:29:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         #region 初始化 | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         private static GuruSDK CreateInstance() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var go = new GameObject(nameof(GuruSDK)); | 
					
						
							|  |  |  |             DontDestroyOnLoad(go); | 
					
						
							|  |  |  |             _instance = go.AddComponent<GuruSDK>(); | 
					
						
							|  |  |  |             return _instance; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         public static GuruSDKInitConfig BuildConfig( | 
					
						
							|  |  |  |             bool useCustomConsent = false,  | 
					
						
							|  |  |  |             bool autoLoadAds = true,  | 
					
						
							|  |  |  |             bool iapEnabled = true,  | 
					
						
							|  |  |  |             bool autoRecordFinishedLevels = true,  | 
					
						
							| 
									
										
										
										
											2024-01-18 09:03:53 +00:00
										 |  |  |             bool debugMode = false, | 
					
						
							| 
									
										
										
										
											2024-03-31 10:36:47 +00:00
										 |  |  |             bool isBuyNoAds = false, | 
					
						
							| 
									
										
										
										
											2024-07-12 02:29:30 +00:00
										 |  |  |             bool useAdjustDeeplink = false, | 
					
						
							| 
									
										
										
										
											2024-03-31 10:36:47 +00:00
										 |  |  |             string bannerColor = "#00000000", | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             Dictionary<string, object> defaultRemoteData = null, | 
					
						
							|  |  |  |             byte[] googleKeys = null, | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  |             byte[] appleRootCerts = null, | 
					
						
							|  |  |  |             bool debugEnableEventLog = false) | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             var config = GuruSDKInitConfig.Build(useCustomConsent, autoLoadAds, iapEnabled,  | 
					
						
							| 
									
										
										
										
											2024-03-31 10:36:47 +00:00
										 |  |  |                 autoRecordFinishedLevels, isBuyNoAds, bannerColor, | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  |                 debugMode, useAdjustDeeplink, defaultRemoteData, googleKeys, appleRootCerts, debugEnableEventLog); | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             return config; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         public static void Init(Action<bool> onComplete) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             Init(GuruSDKInitConfig.Build(), onComplete); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         public static void Init(GuruSDKInitConfig config, Action<bool> onComplete) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-06 04:36:41 +00:00
										 |  |  |             _initTime = DateTime.Now.ToUniversalTime(); | 
					
						
							| 
									
										
										
										
											2024-05-11 02:28:58 +00:00
										 |  |  |             // ----- First Open Time ----- | 
					
						
							| 
									
										
										
										
											2024-05-28 03:34:25 +00:00
										 |  |  |             // SetFirstOpenTime(GetFirstOpenTime());  // FirstOpenTime  | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |             LogI($"#1 ---- Guru SDK [{Version}] ----\n{config.ToString()}"); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |             Instance.StartWithConfig(config, onComplete); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-05-11 02:28:58 +00:00
										 |  |  |         private static string GetFirstOpenTime() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             string firstOpenTime = IPMConfig.FirstOpenTime; | 
					
						
							|  |  |  |             if (string.IsNullOrEmpty(firstOpenTime)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 firstOpenTime = TimeUtil.GetCurrentTimeStamp().ToString(); | 
					
						
							|  |  |  |                 IPMConfig.FirstOpenTime = firstOpenTime; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-11 02:28:58 +00:00
										 |  |  |             return firstOpenTime; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 启动SDK | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="config"></param> | 
					
						
							|  |  |  |         /// <param name="onComplete"></param> | 
					
						
							|  |  |  |         private void StartWithConfig(GuruSDKInitConfig config, Action<bool> onComplete) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             Model.PropBLevel.OnValueChanged += OnBLevelChanged; | 
					
						
							|  |  |  |             Model.PropBPlay.OnValueChanged += OnBPlayChanged; | 
					
						
							|  |  |  |              | 
					
						
							| 
									
										
										
										
											2024-01-17 12:46:23 +00:00
										 |  |  |             IsInitialSuccess = false; | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |             _initConfig = config; | 
					
						
							| 
									
										
										
										
											2024-01-17 12:46:23 +00:00
										 |  |  |             _isDebugEnabled = config.DebugMode; | 
					
						
							| 
									
										
										
										
											2024-04-09 08:58:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  |             if (config.EnableDebugLogEvent) Analytics.EnableDebugAnalytics = true; // 允许 Debug 模式下打点 | 
					
						
							|  |  |  |              | 
					
						
							| 
									
										
										
										
											2024-04-09 09:24:41 +00:00
										 |  |  |             InitUpdaters(); // Updaters | 
					
						
							| 
									
										
										
										
											2024-04-09 08:58:08 +00:00
										 |  |  |             InitThreadHandler(); // 初始化线程处理器 | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  |             InitServices(); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             onComplete?.Invoke(true); | 
					
						
							| 
									
										
										
										
											2024-01-08 07:01:04 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  |         private void InitServices() | 
					
						
							| 
									
										
										
										
											2024-01-08 07:01:04 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  |             Analytics.InitAnalytics(); // 打点提前初始化 | 
					
						
							| 
									
										
										
										
											2024-04-09 08:58:08 +00:00
										 |  |  |             //---- Start All tools ---- | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |             LogI($"#2 --- InitFirebase ---"); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |             //---------- Start Firebase ------------ | 
					
						
							| 
									
										
										
										
											2024-07-12 02:29:30 +00:00
										 |  |  |             StartFirebaseService(); | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |              | 
					
						
							|  |  |  |             LogI($"#2.1 --- InitFacebook ---"); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |             //---------- Start Facebook ------------ | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  |             FBService.Instance.StartService(Analytics.OnFBInitComplete); | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2024-03-15 04:59:20 +00:00
										 |  |  |             IsInitialSuccess = true; | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-12 02:29:30 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 启动 Firebase 服务 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         private void StartFirebaseService() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             FirebaseUtil.onInitComplete += OnFirebaseReady; | 
					
						
							|  |  |  |             FirebaseUtil.OnUserAuthResult += OnUserAuthResult; | 
					
						
							|  |  |  |             FirebaseUtil.OnFirebaseAuthResult += OnFirebaseAuthResult; | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             if (InitConfig.UseAdjustDeeplink) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 FirebaseUtil.OnAdjustDeeplinkCallback = OnDeeplinkCallback; // 挂载 Deeplink 的回调 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |              | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  |             FirebaseUtil.InitFirebase(Analytics.OnFirebaseInitCompleted); // 确保所有的逻辑提前被调用到 | 
					
						
							| 
									
										
										
										
											2024-07-12 02:29:30 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-05-11 02:28:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-31 09:18:43 +00:00
										 |  |  |         private void OnUserAuthResult(bool success) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-07-08 11:10:33 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2024-03-31 09:18:43 +00:00
										 |  |  |             if (success && string.IsNullOrEmpty(IPMConfig.IPM_UID)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 success = false; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-03-31 10:08:26 +00:00
										 |  |  |             Callbacks.SDK._onUserAuthResult?.Invoke(success); | 
					
						
							| 
									
										
										
										
											2024-05-22 13:49:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (success) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-07-08 11:10:33 +00:00
										 |  |  |                 Model.UserId = IPMConfig.IPM_UID; | 
					
						
							| 
									
										
										
										
											2024-05-22 13:49:30 +00:00
										 |  |  |                 if (GuruIAP.Instance != null) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     GuruIAP.Instance.SetUID(UID); | 
					
						
							|  |  |  |                     GuruIAP.Instance.SetUUID(UUID); | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2024-05-29 11:55:30 +00:00
										 |  |  |                  | 
					
						
							|  |  |  |                 UpdateAllUserProperties(); // 同步所有用户属性打点 | 
					
						
							| 
									
										
										
										
											2024-05-22 13:49:30 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-03-31 09:18:43 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         private void OnFirebaseAuthResult(bool success) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             Callbacks.SDK._onFirebaseAuthResult?.Invoke(success); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 开始各种组件初始化 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							| 
									
										
										
										
											2024-03-15 04:59:20 +00:00
										 |  |  |         private void OnFirebaseReady(bool success) | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-15 04:59:20 +00:00
										 |  |  |             FirebaseUtil.onInitComplete -= OnFirebaseReady; | 
					
						
							| 
									
										
										
										
											2024-06-24 06:35:30 +00:00
										 |  |  |             LogI($"#3 --- On FirebaseDeps: {success} ---"); | 
					
						
							| 
									
										
										
										
											2024-03-20 06:29:43 +00:00
										 |  |  |             IsFirebaseReady = success; | 
					
						
							| 
									
										
										
										
											2024-03-15 04:59:20 +00:00
										 |  |  |             Callbacks.SDK._onFirebaseReady?.Invoke(success); | 
					
						
							| 
									
										
										
										
											2024-04-17 13:56:46 +00:00
										 |  |  |             // LogFirebaseDeps(success); | 
					
						
							| 
									
										
										
										
											2024-03-15 04:59:20 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |             LogI($"#3.5 --- Call InitRemoteConfig ---"); | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             // 开始Remote Manager初始化  | 
					
						
							|  |  |  |             RemoteConfigManager.Init(BuildDefaultRemoteData(_initConfig.DefaultRemoteData)); | 
					
						
							|  |  |  |             RemoteConfigManager.OnFetchCompleted += OnFetchRemoteCallback; | 
					
						
							| 
									
										
										
										
											2024-03-08 11:27:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |             LogI($"#4 --- Apply remote services config ---"); | 
					
						
							|  |  |  |             // 根据缓存的云控配置来初始化参数 | 
					
						
							|  |  |  |             InitAllServices(); | 
					
						
							| 
									
										
										
										
											2024-03-06 11:38:22 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |             LogI($"#5 --- sync sdk time ---"); | 
					
						
							| 
									
										
										
										
											2024-03-06 04:36:41 +00:00
										 |  |  |             var sp = DateTime.Now.ToUniversalTime() - _initTime; | 
					
						
							|  |  |  |             LogSDKInitTime(sp.TotalSeconds); | 
					
						
							| 
									
										
										
										
											2024-05-24 08:45:33 +00:00
										 |  |  |              | 
					
						
							|  |  |  |             // 上报所有初始化用户属性 | 
					
						
							| 
									
										
										
										
											2024-05-29 11:55:30 +00:00
										 |  |  |             UpdateAllUserProperties(); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-05-29 11:55:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 注入云控参数基础数据 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="dict"></param> | 
					
						
							|  |  |  |         /// <returns></returns> | 
					
						
							|  |  |  |         private Dictionary<string, object> BuildDefaultRemoteData(Dictionary<string, object> dict) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-01-07 14:59:02 +00:00
										 |  |  |             if (dict == null) dict = new Dictionary<string, object>(3); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             // 注入默认的 Services 配置值 | 
					
						
							|  |  |  |             string json = Model.LoadDefaltServicesConfigJson();  | 
					
						
							|  |  |  |             if (!string.IsNullOrEmpty(json)) dict[ServicesConfigKey] = json; | 
					
						
							|  |  |  |         | 
					
						
							|  |  |  |             return dict; | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 拉取云控参数完成 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="success"></param> | 
					
						
							|  |  |  |         private void OnFetchRemoteCallback(bool success) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |             LogI($"#6 --- Remote fetch complete: {success} ---"); | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             ABTestManager.Init(); // 启动AB测试解析器 | 
					
						
							|  |  |  |             Callbacks.Remote._onRemoteFetchComplete?.Invoke(success); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-04-09 08:58:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void Update() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             UpdateAllUpdates(); // 驱动所有的更新器 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         #endregion | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #region App Remote Update | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 10:51:49 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// Apply Cloud guru-service configs for sdk assets | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |         private void InitAllServices() | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-06-20 10:30:22 +00:00
										 |  |  |             // -------- Init Analytics --------- | 
					
						
							| 
									
										
										
										
											2024-04-07 08:17:46 +00:00
										 |  |  |             InitUserProperties(); | 
					
						
							| 
									
										
										
										
											2024-06-18 02:24:43 +00:00
										 |  |  |             SetSDKEventPriority(); | 
					
						
							| 
									
										
										
										
											2024-06-20 10:30:22 +00:00
										 |  |  |             // -------- Init Noti ----------- | 
					
						
							|  |  |  |             InitNotiPermission(); | 
					
						
							| 
									
										
										
										
											2024-04-07 08:17:46 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  |             bool useKeywords = false; | 
					
						
							| 
									
										
										
										
											2024-03-18 02:22:11 +00:00
										 |  |  |             bool useIAP = _initConfig.IAPEnabled; | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  |             bool appleReview = false; | 
					
						
							| 
									
										
										
										
											2024-04-07 08:39:07 +00:00
										 |  |  |             bool enableAnaErrorLog = false; | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2024-04-03 04:47:25 +00:00
										 |  |  |             //----------- Set GuruServices ---------------- | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             var services = GetRemoteServicesConfig(); | 
					
						
							|  |  |  |             if (services != null) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 _appServicesConfig = services; | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  |                 useKeywords = _appServicesConfig.KeywordsEnabled(); | 
					
						
							| 
									
										
										
										
											2024-03-18 01:37:28 +00:00
										 |  |  |                 // 使用初始化配置中的 IAPEnable来联合限定, 如果本地写死关闭则不走云控开启 | 
					
						
							|  |  |  |                 useIAP = _initConfig.IAPEnabled && _appServicesConfig.IsIAPEnabled();  | 
					
						
							| 
									
										
										
										
											2024-04-07 08:39:07 +00:00
										 |  |  |                 enableAnaErrorLog = _appServicesConfig.EnableAnaErrorLog(); | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  |                  | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 Try(() => | 
					
						
							| 
									
										
										
										
											2024-01-08 10:45:22 +00:00
										 |  |  |                 { | 
					
						
							| 
									
										
										
										
											2024-04-09 08:58:08 +00:00
										 |  |  |                     LogI($"#4.1 --- Start apply services ---"); | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |                     //---------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     // 自打点设置错误上报 | 
					
						
							| 
									
										
										
										
											2024-07-25 15:00:22 +00:00
										 |  |  |                     // if(enableAnaErrorLog) GuruAnalytics.EnableErrorLog = true; | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                      | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |                     // adjust 事件设置 | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                     if (null != _appServicesConfig.adjust_settings && null != GuruSettings) | 
					
						
							| 
									
										
										
										
											2024-01-10 06:02:53 +00:00
										 |  |  |                     { | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                         // 更新 Adjust Tokens | 
					
						
							|  |  |  |                         GuruSettings.UpdateAdjustTokens( | 
					
						
							|  |  |  |                             _appServicesConfig.adjust_settings.AndroidToken(), | 
					
						
							|  |  |  |                             _appServicesConfig.adjust_settings.iOSToken()); | 
					
						
							|  |  |  |                         // 更新 Adjust Events | 
					
						
							|  |  |  |                         GuruSettings.UpdateAdjustEvents(_appServicesConfig.adjust_settings.events); | 
					
						
							| 
									
										
										
										
											2024-01-10 06:02:53 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                  | 
					
						
							| 
									
										
										
										
											2024-04-09 08:58:08 +00:00
										 |  |  |                     LogI($"#4.2 --- Start GuruSttings ---"); | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |                     // GuruSettings 设置 | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                     if (null != _appServicesConfig.app_settings) | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  |                     { | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                         if (_appServicesConfig.Tch02Value() > 0) | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             Analytics.EnableTch02Event = true; | 
					
						
							|  |  |  |                             Analytics.SetTch02TargetValue(_appServicesConfig.Tch02Value()); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                       | 
					
						
							|  |  |  |                         // 设置获取设备 UUID 的方法 | 
					
						
							|  |  |  |                         if (_appServicesConfig.UseUUID()) | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             IPMConfig.UsingUUID = true; // 开始使用 UUID 作为 DeviceID 标识 | 
					
						
							|  |  |  |                         } | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-08 11:27:55 +00:00
										 |  |  | #if UNITY_IOS  | 
					
						
							|  |  |  |                         // 苹果审核标志位 | 
					
						
							|  |  |  |                         appleReview = _appServicesConfig.IsAppReview(); | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  | #endif | 
					
						
							|  |  |  |                      | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                         if (null !=  GuruSettings) | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             // 更新和升级 GuruSettings 对应的值 | 
					
						
							|  |  |  |                             GuruSettings.UpdateAppSettings( | 
					
						
							|  |  |  |                                 _appServicesConfig.app_settings.bundle_id, | 
					
						
							|  |  |  |                                 _appServicesConfig.fb_settings?.fb_app_id ?? "", | 
					
						
							|  |  |  |                                 _appServicesConfig.app_settings.support_email, | 
					
						
							|  |  |  |                                 _appServicesConfig.app_settings.privacy_url, | 
					
						
							|  |  |  |                                 _appServicesConfig.app_settings.terms_url, | 
					
						
							|  |  |  |                                 _appServicesConfig.app_settings.android_store, | 
					
						
							| 
									
										
										
										
											2024-05-11 03:34:51 +00:00
										 |  |  |                                 _appServicesConfig.app_settings.ios_store,  | 
					
						
							| 
									
										
										
										
											2024-05-31 08:19:20 +00:00
										 |  |  |                                 _appServicesConfig.parameters?.using_uuid ?? false, | 
					
						
							|  |  |  |                                 _appServicesConfig.parameters?.cdn_host ?? ""); | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |                              | 
					
						
							|  |  |  |                             _appBundleId = _appServicesConfig.app_settings.bundle_id; // 配置预设的 BundleId | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                         } | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                     //--------------------------------- | 
					
						
							|  |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |                     UnityEngine.Debug.LogError($"--- ERROR on apply services: {ex.Message}"); | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 }); | 
					
						
							|  |  |  |            | 
					
						
							|  |  |  |                  | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-04-03 04:47:25 +00:00
										 |  |  |             //----------- Set IAP ---------------- | 
					
						
							| 
									
										
										
										
											2024-05-22 13:30:05 +00:00
										 |  |  |             if (useIAP) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 // InitIAP(_initConfig.GoogleKeys, _initConfig.AppleRootCerts); // 初始化IAP | 
					
						
							|  |  |  |                 Try(() => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     LogI($"#4.3 --- Start IAP ---"); | 
					
						
							|  |  |  |                     if (_initConfig.GoogleKeys == null || _initConfig.AppleRootCerts == null) | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         LogException("[IAP] GoogleKeys is null when using IAPService! Integration failed. App will Exit"); | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     InitIAP(UID, _initConfig.GoogleKeys, _initConfig.AppleRootCerts); // 初始化IAP | 
					
						
							|  |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     UnityEngine.Debug.LogError($"--- ERROR on useIAP: {ex.Message}"); | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-04-03 04:47:25 +00:00
										 |  |  |             //----------- Set Keywords ---------------- | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  |             if (useKeywords) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-04-02 07:27:34 +00:00
										 |  |  |                 // KeywordsManager.Install(Model.IsIAPUser, Model.SuccessLevelId); // 启动Keyword管理器 | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 Try(() => | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2024-04-09 08:58:08 +00:00
										 |  |  |                     LogI($"#4.4 --- Start Keywords ---"); | 
					
						
							| 
									
										
										
										
											2024-05-17 02:28:35 +00:00
										 |  |  |                     KeywordsManager.Install(Model.IsIapUser, Model.SuccessLevelId); // 启动Keyword管理器 | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |                     UnityEngine.Debug.LogError($"--- ERROR on Keywords: {ex.Message}"); | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2023-12-28 08:33:12 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if UNITY_IOS | 
					
						
							|  |  |  |             if (appleReview) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 // StartAppleReviewFlow(); // 直接显示 ATT 弹窗, 跳过 Consent 流程 | 
					
						
							|  |  |  |                 Try(() => | 
					
						
							| 
									
										
										
										
											2024-03-08 11:27:55 +00:00
										 |  |  |                 { | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |                     LogI($"#4.5.0 ---  StartAppleReviewFlow ---"); | 
					
						
							| 
									
										
										
										
											2024-03-08 11:27:55 +00:00
										 |  |  |                     StartAppleReviewFlow(); // 直接显示 ATT 弹窗, 跳过 Consent 流程 | 
					
						
							|  |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     Debug.LogError($"--- ERROR on StartAppleReviewFlow: {ex.Message}"); | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2024-04-03 04:47:25 +00:00
										 |  |  |             //----------- Set Consent ---------------- | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  |             if (!InitConfig.UseCustomConsent && !appleReview) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 // LogI($"--- #3 Start Consent Flow ---"); | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 // StartConsentFlow(); | 
					
						
							|  |  |  |                 Try(() => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     StartConsentFlow(); | 
					
						
							|  |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |                     UnityEngine.Debug.LogError($"--- ERROR on StartConsentFlow: {ex.Message}"); | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-03-22 05:20:54 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             IsServiceReady = true; | 
					
						
							| 
									
										
										
										
											2024-03-15 09:00:40 +00:00
										 |  |  |              | 
					
						
							|  |  |  |             // 中台服务初始化结束 | 
					
						
							|  |  |  |             Callbacks.SDK._onGuruServiceReady?.Invoke(); | 
					
						
							| 
									
										
										
										
											2024-03-22 05:20:54 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  | #if UNITY_ANDROID | 
					
						
							|  |  |  |             // Android 命令行调试 | 
					
						
							|  |  |  |             StartAndroidDebugCmds();            | 
					
						
							|  |  |  | #endif | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-05-22 13:30:05 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2024-03-11 10:51:49 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// Get the guru-service cloud config value; | 
					
						
							|  |  |  |         /// User can fetch the cloud guru-service config by using Custom Service Key | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <returns></returns> | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         private GuruServicesConfig GetRemoteServicesConfig() | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-19 09:33:37 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             string defaultJson = GetRemoteString(ServicesConfigKey); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             bool useCustomKey = false; | 
					
						
							| 
									
										
										
										
											2024-03-11 10:51:49 +00:00
										 |  |  |             string key = ServicesConfigKey; | 
					
						
							|  |  |  |             if (!string.IsNullOrEmpty(_initConfig.CustomServiceKey)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 key = _initConfig.CustomServiceKey; | 
					
						
							| 
									
										
										
										
											2024-03-19 09:33:37 +00:00
										 |  |  |                 useCustomKey = true; | 
					
						
							| 
									
										
										
										
											2024-03-11 10:51:49 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-03-19 09:33:37 +00:00
										 |  |  |             var json = GetRemoteString(key); // Cloud cached data | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (string.IsNullOrEmpty(json) && useCustomKey && !string.IsNullOrEmpty(defaultJson)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 // No remote data fetched from cloud, should use default values | 
					
						
							|  |  |  |                 json = defaultJson; | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |                 UnityEngine.Debug.Log($"{Tag} --- No remote data found with: {key}  -> Using default key {ServicesConfigKey} and local data!!!"); | 
					
						
							| 
									
										
										
										
											2024-03-19 09:33:37 +00:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             if (!string.IsNullOrEmpty(json)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 return JsonParser.ToObject<GuruServicesConfig>(json); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-03-19 09:33:37 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             return null; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         private void Try(Action method, Action<Exception> onException = null, Action onFinal = null) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (method == null) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             try | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 method.Invoke(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             catch (Exception ex) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 LogException(ex); | 
					
						
							|  |  |  |                 // ignored | 
					
						
							|  |  |  |                 onException?.Invoke(ex); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             finally | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 // Finally | 
					
						
							|  |  |  |                 onFinal?.Invoke(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         #endregion | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  |         #region Apple 审核流程逻辑 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if UNITY_IOS | 
					
						
							|  |  |  |         private void StartAppleReviewFlow() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             CheckAttStatus(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  |         #endregion | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         #region 数据 | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         private void OnBLevelChanged(int blevel) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             SetUserBLevel(blevel); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void OnBPlayChanged(int bplay) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             SetUserBPlay(bplay); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-01-10 10:22:02 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         #endregion | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         #region Logging | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2024-01-08 03:31:58 +00:00
										 |  |  |         internal static void LogI(object message) | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |             UnityEngine.Debug.Log($"{Tag} {message}"); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2024-01-08 03:31:58 +00:00
										 |  |  |         internal static void LogW(object message) | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |             UnityEngine.Debug.LogWarning($"{Tag} {message}"); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2024-01-08 03:31:58 +00:00
										 |  |  |         internal static void LogE(object message) | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |             UnityEngine.Debug.LogError($"{Tag} {message}"); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2024-01-08 03:31:58 +00:00
										 |  |  |         internal static void LogException(string message) | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             LogException( new Exception($"{Tag} {message}")); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2024-01-08 03:31:58 +00:00
										 |  |  |         internal static void LogException(Exception e) | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  |             UnityEngine.Debug.LogException(e); | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2024-02-04 13:10:25 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 上报崩溃信息 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="message"></param> | 
					
						
							|  |  |  |         public static void Report(string message) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |             Analytics.LogCrashlytics(message, false); | 
					
						
							| 
									
										
										
										
											2024-02-04 13:10:25 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 上报异常 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="message"></param> | 
					
						
							|  |  |  |         public static void ReportException(string message) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |             Analytics.LogCrashlytics(message); | 
					
						
							| 
									
										
										
										
											2024-02-04 13:10:25 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 上报异常 Exception | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="ex"></param> | 
					
						
							|  |  |  |         public static void ReportException(Exception ex) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-14 03:52:14 +00:00
										 |  |  |             Analytics.LogCrashlytics(ex); | 
					
						
							| 
									
										
										
										
											2024-02-04 13:10:25 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         #endregion | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         #region 生命周期 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 暂停时处理 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="paused"></param> | 
					
						
							|  |  |  |         private void OnAppPauseHandler(bool paused) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if(paused) Model.Save(true); // 强制保存数据 | 
					
						
							|  |  |  |             Callbacks.App._onAppPaused?.Invoke(paused); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         private void OnApplicationPause(bool paused) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             OnAppPauseHandler(paused); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void OnApplicationFocus(bool hasFocus) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             OnAppPauseHandler(!hasFocus); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void OnApplicationQuit() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             Model.Save(true); | 
					
						
							|  |  |  |             Callbacks.App._onAppQuit?.Invoke(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #endregion | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #region 延迟处理 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 启动协程 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="enumerator"></param> | 
					
						
							|  |  |  |         /// <returns></returns> | 
					
						
							|  |  |  |         public static Coroutine DoCoroutine(IEnumerator enumerator) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             return Instance != null ? Instance.StartCoroutine(enumerator) : null; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public static void KillCoroutine(Coroutine coroutine) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if(coroutine != null) | 
					
						
							|  |  |  |                 Instance.StopCoroutine(coroutine); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-01-10 10:22:02 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 延时执行 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="seconds"></param> | 
					
						
							|  |  |  |         /// <param name="callback"></param> | 
					
						
							| 
									
										
										
										
											2024-03-06 04:36:41 +00:00
										 |  |  |         public static Coroutine Delay(float seconds, Action callback) | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-06 04:36:41 +00:00
										 |  |  |             return DoCoroutine(Instance.OnDelayCall(seconds, callback)); | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private IEnumerator OnDelayCall(float delay, Action callback) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (delay > 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 yield return new WaitForSeconds(delay); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 yield return null; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             callback?.Invoke(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-01-10 10:22:02 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         #endregion | 
					
						
							| 
									
										
										
										
											2024-04-09 08:58:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         #region 帧更新 Updater | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         private List<IUpdater> _updaterRunningList; | 
					
						
							|  |  |  |         private List<IUpdater> _updaterRemoveList; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void InitUpdaters() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             _updaterRunningList = new List<IUpdater>(20); | 
					
						
							|  |  |  |             _updaterRemoveList = new List<IUpdater>(20); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void UpdateAllUpdates() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             int i = 0; | 
					
						
							|  |  |  |             IUpdater updater; | 
					
						
							|  |  |  |             // ---- Updater Trigger ---- | 
					
						
							|  |  |  |             if (_updaterRunningList.Count > 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 i = 0; | 
					
						
							|  |  |  |                 while (i < _updaterRunningList.Count) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     updater = _updaterRunningList[i]; | 
					
						
							|  |  |  |                     if (updater != null)  | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         if (updater.State == UpdaterState.Running) | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             updater.OnUpdate(); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         else if(updater.State == UpdaterState.Kill) | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             _updaterRemoveList.Add(updater); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     else | 
					
						
							|  |  |  |                     { | 
					
						
							|  |  |  |                         _updaterRunningList.RemoveAt(i); | 
					
						
							|  |  |  |                         i--; | 
					
						
							|  |  |  |                     } | 
					
						
							|  |  |  |                     i++; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (_updaterRemoveList.Count > 0) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 i = 0; | 
					
						
							|  |  |  |                 while (i < _updaterRemoveList.Count) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     RemoveUpdater(_updaterRemoveList[i]); | 
					
						
							|  |  |  |                     i++; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 _updaterRemoveList.Clear(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 注册帧更新器 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="updater"></param> | 
					
						
							|  |  |  |         public static void RegisterUpdater(IUpdater updater) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             Instance.AddUpdater(updater); | 
					
						
							|  |  |  |             updater.Start(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void AddUpdater(IUpdater updater) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (_updaterRunningList == null) _updaterRunningList = new List<IUpdater>(20); | 
					
						
							|  |  |  |             _updaterRunningList.Add(updater); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void RemoveUpdater(IUpdater updater) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (_updaterRunningList != null && updater != null) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 _updaterRunningList.Remove(updater); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #endregion | 
					
						
							| 
									
										
										
										
											2024-05-07 12:37:57 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-25 02:17:16 +00:00
										 |  |  |         #region 中台推送管理 | 
					
						
							| 
									
										
										
										
											2024-05-24 06:48:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         private static int _messageRetry = 0; | 
					
						
							|  |  |  |         public static void SetPushNotificationEnabled(bool enabled) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             DeviceInfoUploadRequest request = new DeviceInfoUploadRequest() | 
					
						
							|  |  |  |                 .SetRetryTimes(1) | 
					
						
							|  |  |  |                 .SetSuccessCallBack(() => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     _messageRetry = 0; | 
					
						
							|  |  |  |                     Debug.Log($"[SDK] --- Set Push Enabled: {enabled} success"); | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 .SetFailCallBack(() => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     double retryDelay = Math.Pow(2, _messageRetry); | 
					
						
							|  |  |  |                     _messageRetry++; | 
					
						
							|  |  |  |                     CoroutineHelper.Instance.StartDelayed((float)retryDelay, ()=> SetPushNotificationEnabled(enabled)); | 
					
						
							|  |  |  |                 }) as DeviceInfoUploadRequest; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (request != null) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 request.SetPushEnabled(enabled); | 
					
						
							|  |  |  |                 request.Send(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-07-12 02:29:30 +00:00
										 |  |  |         #endregion | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #region Deeplink | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 添加回调链接 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="deeplink"></param> | 
					
						
							|  |  |  |         private void OnDeeplinkCallback(string deeplink) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |            Callbacks.SDK._onDeeplinkCallback?.Invoke(deeplink); // 尝试调用回调 | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-21 06:39:55 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2024-05-24 06:48:53 +00:00
										 |  |  |         #endregion | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } |