| 
									
										
										
										
											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; | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |      | 
					
						
							|  |  |  |     public partial class GuruSDK: MonoBehaviour | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-03-12 02:35:00 +00:00
										 |  |  |         public const string Version = "1.0.9"; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  |         private Action<bool> _onCompleteCallback; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private static GuruSDKModel _model; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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-01-17 12:46:23 +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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             Dictionary<string, object> defaultRemoteData = null, | 
					
						
							|  |  |  |             byte[] googleKeys = null, | 
					
						
							|  |  |  |             byte[] appleRootCerts = null) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var config = GuruSDKInitConfig.Build(useCustomConsent, autoLoadAds, iapEnabled,  | 
					
						
							| 
									
										
										
										
											2024-01-18 09:03:53 +00:00
										 |  |  |                 autoRecordFinishedLevels, debugMode, defaultRemoteData, googleKeys, appleRootCerts); | 
					
						
							| 
									
										
										
										
											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-01-07 14:59:02 +00:00
										 |  |  |             LogI($"---- Guru SDK init ----\n{config.ToString()}"); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |             Instance.StartWithConfig(config, onComplete); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /// <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; | 
					
						
							|  |  |  |             _onCompleteCallback = onComplete; | 
					
						
							| 
									
										
										
										
											2024-01-17 12:46:23 +00:00
										 |  |  |             _isDebugEnabled = config.DebugMode; | 
					
						
							| 
									
										
										
										
											2024-02-04 13:10:25 +00:00
										 |  |  |             GuruRepoter.Install(); //  Install Crashlytics Logger  | 
					
						
							| 
									
										
										
										
											2024-03-08 12:16:57 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             bool isDebug = false; | 
					
						
							|  |  |  | #if DEBUG | 
					
						
							|  |  |  |             isDebug = true; | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  |             Analytics.InstallGuruAnalytics(isDebug); // 提前初始化 GuruAnalytics | 
					
						
							| 
									
										
										
										
											2024-01-08 07:01:04 +00:00
										 |  |  |             //--- 之后的逻辑放在 Start 方法内 --- | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         void Start() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             //---- Init All tools ---- | 
					
						
							| 
									
										
										
										
											2024-03-06 11:38:22 +00:00
										 |  |  |             LogI($"--- InitFirebase ---"); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |             //---------- Start Firebase ------------ | 
					
						
							|  |  |  |             FirebaseUtil.InitFirebase(OnFirebaseReady); | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             // FirebaseUtil.OnFetchRemoteSuccess+= OnFetchRemoteCallback; | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |             //---------- Start Facebook ------------ | 
					
						
							|  |  |  |             FBService.Instance.StartService(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-01-08 07:01:04 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 开始各种组件初始化 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         private void OnFirebaseReady() | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-06 11:38:22 +00:00
										 |  |  |             LogI($"--- OnFirebaseReady ---"); | 
					
						
							| 
									
										
										
										
											2024-01-08 07:01:04 +00:00
										 |  |  |             IsInitialSuccess = true; | 
					
						
							| 
									
										
										
										
											2023-12-28 08:33:12 +00:00
										 |  |  |              | 
					
						
							|  |  |  |             if(!string.IsNullOrEmpty(IPMConfig.IPM_UID)) SetUID(IPMConfig.IPM_UID); | 
					
						
							| 
									
										
										
										
											2024-03-06 11:38:22 +00:00
										 |  |  |             LogI($"--- UID:{IPMConfig.IPM_UID} ---"); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             LogI($"--- Init RemoteConfig ---"); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  |             // 延迟执行 SDK 回调 | 
					
						
							| 
									
										
										
										
											2024-03-08 13:40:18 +00:00
										 |  |  |             // Delay(0, () => | 
					
						
							|  |  |  |             // { | 
					
						
							|  |  |  |             LogI($"--- SDK Init Complete  ->  Callback: { (_onCompleteCallback == null ? "Null" : "NotNull") } ---"); | 
					
						
							|  |  |  |             _onCompleteCallback?.Invoke(true); | 
					
						
							|  |  |  |             // }); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2024-03-06 11:38:22 +00:00
										 |  |  |             LogI($"--- Apply online services config ---"); | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             // 根据上次的云控配置来初始化参数 | 
					
						
							|  |  |  |             SetupServicesConfig(); | 
					
						
							| 
									
										
										
										
											2024-03-06 11:38:22 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2024-03-06 04:36:41 +00:00
										 |  |  |             var sp = DateTime.Now.ToUniversalTime() - _initTime; | 
					
						
							|  |  |  |             LogSDKInitTime(sp.TotalSeconds); | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +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) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             LogI($"--- Remote fetch complete: {success} ---"); | 
					
						
							|  |  |  |             ABTestManager.Init(); // 启动AB测试解析器 | 
					
						
							|  |  |  |             Callbacks.Remote._onRemoteFetchComplete?.Invoke(success); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         #endregion | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #region App Remote Update | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 10:51:49 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// Apply Cloud guru-service configs for sdk assets | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |         private void SetupServicesConfig() | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  |             bool useKeywords = false; | 
					
						
							| 
									
										
										
										
											2023-12-28 08:33:12 +00:00
										 |  |  |             bool useIAP = true; | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  |             bool appleReview = false; | 
					
						
							| 
									
										
										
										
											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-01-31 04:54:03 +00:00
										 |  |  |                 useIAP = _appServicesConfig.IsIAPEnabled(); | 
					
						
							| 
									
										
										
										
											2023-12-28 08:33:12 +00:00
										 |  |  |                  | 
					
						
							| 
									
										
										
										
											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-03-08 09:05:36 +00:00
										 |  |  |                     LogI($"--- Init apply services ---"); | 
					
						
							|  |  |  |                     //-------------------------------- | 
					
						
							|  |  |  |                      | 
					
						
							|  |  |  |                     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
										 |  |  |                  | 
					
						
							|  |  |  |                     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, | 
					
						
							|  |  |  |                                 _appServicesConfig.app_settings.ios_store); | 
					
						
							|  |  |  |                         } | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  |                     } | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                     //--------------------------------- | 
					
						
							|  |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     Debug.LogError($"--- ERROR on apply services: {ex.Message}"); | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |            | 
					
						
							|  |  |  |                  | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-01-08 02:22:56 +00:00
										 |  |  |              | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  |             if (useIAP) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 // InitIAP(_initConfig.GoogleKeys, _initConfig.AppleRootCerts); // 初始化IAP | 
					
						
							|  |  |  |                 Try(() => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     LogI($"--- Init IAP ---"); | 
					
						
							|  |  |  |                     InitIAP(_initConfig.GoogleKeys, _initConfig.AppleRootCerts); // 初始化IAP | 
					
						
							|  |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     Debug.LogError($"--- ERROR on useIAP: {ex.Message}"); | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |                  | 
					
						
							| 
									
										
										
										
											2023-12-28 08:33:12 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2024-01-31 04:54:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (useKeywords) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 // KeywordsManager.Install(Model.IsIAPUser, Model.SuccessLevelCount); // 启动Keyword管理器 | 
					
						
							|  |  |  |                 Try(() => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     LogI($"--- Init Keywords ---"); | 
					
						
							|  |  |  |                     KeywordsManager.Install(Model.IsIAPUser, Model.SuccessLevelCount); // 启动Keyword管理器 | 
					
						
							|  |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     Debug.LogError($"--- ERROR on Keywords: {ex.Message}"); | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											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
										 |  |  |                 { | 
					
						
							|  |  |  |                     LogI($"---  StartAppleReviewFlow ---"); | 
					
						
							|  |  |  |                     StartAppleReviewFlow(); // 直接显示 ATT 弹窗, 跳过 Consent 流程 | 
					
						
							|  |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     Debug.LogError($"--- ERROR on StartAppleReviewFlow: {ex.Message}"); | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  |             if (!InitConfig.UseCustomConsent && !appleReview) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 // LogI($"--- #3 Start Consent Flow ---"); | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                 // StartConsentFlow(); | 
					
						
							|  |  |  |                 Try(() => | 
					
						
							|  |  |  |                 { | 
					
						
							| 
									
										
										
										
											2024-03-08 11:27:55 +00:00
										 |  |  |                     LogI($"--- #1. StartConsentFlow ---"); | 
					
						
							| 
									
										
										
										
											2024-03-08 09:05:36 +00:00
										 |  |  |                     StartConsentFlow(); | 
					
						
							|  |  |  |                 }, ex => | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     Debug.LogError($"--- ERROR on StartConsentFlow: {ex.Message}"); | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2024-03-01 05:13:26 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +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-11 10:51:49 +00:00
										 |  |  |             string key = ServicesConfigKey; | 
					
						
							|  |  |  |             if (!string.IsNullOrEmpty(_initConfig.CustomServiceKey)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 key = _initConfig.CustomServiceKey; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             var json = GetRemoteString(key); | 
					
						
							| 
									
										
										
										
											2023-12-27 12:24:16 +00:00
										 |  |  |             if (!string.IsNullOrEmpty(json)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 return JsonParser.ToObject<GuruServicesConfig>(json); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             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 Misc | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 打开页面 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="url"></param> | 
					
						
							|  |  |  |         public static void OpenURL(string url) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             GuruWebview.OpenPage(url); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-01-10 10:22:02 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         #endregion | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #region Logging | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2024-01-08 03:31:58 +00:00
										 |  |  |         internal static void LogI(object message) | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             Debug.Log($"{Tag} {message}"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2024-01-08 03:31:58 +00:00
										 |  |  |         internal static void LogW(object message) | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             Debug.LogWarning($"{Tag} {message}"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2024-01-08 03:31:58 +00:00
										 |  |  |         internal static void LogE(object message) | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |         { | 
					
						
							|  |  |  |             Debug.LogError($"{Tag} {message}"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |         { | 
					
						
							|  |  |  |             Debug.LogException(e); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2024-02-04 13:10:25 +00:00
										 |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 上报崩溃信息 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="message"></param> | 
					
						
							|  |  |  |         public static void Report(string message) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             GuruRepoter.Log(message); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 上报异常 | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="message"></param> | 
					
						
							|  |  |  |         public static void ReportException(string message) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             GuruRepoter.LogException(message); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         /// <summary> | 
					
						
							|  |  |  |         /// 上报异常 Exception | 
					
						
							|  |  |  |         /// </summary> | 
					
						
							|  |  |  |         /// <param name="ex"></param> | 
					
						
							|  |  |  |         public static void ReportException(Exception ex) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             GuruRepoter.LogException(ex); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-01-07 14:59:02 +00:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2023-12-26 03:40:48 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | } |