#region copyright // ------------------------------------------------------- // Copyright (C) Dmitriy Yukhanov [https://codestage.net] // ------------------------------------------------------- #endregion #if !UNITY_WEBGL #define ACTK_ASYNC #endif namespace CodeStage.AntiCheat.Common { using Storage; using UnityEngine; using Utils; /// /// User-friendly wrapper around few internally used Unity APIs which can't be accessed from background threads. /// /// You only need to touch this if you are going to use ObscuredFile / ObscuredFilePrefs from the background threads. public static class UnityApiResultsHolder { #if UNITY_IPHONE private static string deviceVendorIdentifier; #endif private static string deviceUniqueIdentifier; private static string persistentDataPath; private static bool? isMobilePlatform; /// /// Call this from the main thread before using ObscuredFile / ObscuredFilePrefs from the background threads. /// /// Calling this method avoids getting exceptions while working with ObscuredFile / ObscuredFilePrefs from the /// background threads. /// Pass true to init API needed for the Lock To Device feature /// (SystemInfo.deviceUniqueIdentifier). /// You need this to be true only when using ObscuredFile / ObscuredFilePrefs from the background threads /// with DeviceLock enabled and without custom DeviceID set. /// Passing true is similar to the DeviceIdHolder.ForceLockToDeviceInit() call, please read that API docs for /// more information about possible side effects. public static void InitForAsyncUsage(bool warmUpDeviceIdentifier) { #if ACTK_ASYNC if (System.Threading.SynchronizationContext.Current == null) { Debug.LogError($"Please call {nameof(InitForAsyncUsage)} from main thread!"); return; } #endif GetPersistentDataPath(); if (warmUpDeviceIdentifier) GetDeviceUniqueIdentifier(); _ = AppEventsDispatcher.Instance; IsMobilePlatform(); } internal static string GetDeviceUniqueIdentifier() { if (string.IsNullOrEmpty(deviceUniqueIdentifier)) { #if ACTK_ASYNC if (System.Threading.SynchronizationContext.Current != null) deviceUniqueIdentifier = GetDeviceID(); else throw new DeviceUniqueIdentifierException(); #else deviceUniqueIdentifier = GetDeviceID(); #endif } return deviceUniqueIdentifier; string GetDeviceID() { var result = string.Empty; #if UNITY_IPHONE result = UnityEngine.iOS.Device.vendorIdentifier; #endif #if !ACTK_PREVENT_READ_PHONE_STATE if (string.IsNullOrEmpty(result)) result = SystemInfo.deviceUniqueIdentifier; #endif return result; } } internal static string GetPersistentDataPath() { if (string.IsNullOrEmpty(persistentDataPath)) { #if ACTK_ASYNC if (System.Threading.SynchronizationContext.Current != null) persistentDataPath = Application.persistentDataPath; else throw new PersistentDataPathException(); #else persistentDataPath = Application.persistentDataPath; #endif } return persistentDataPath; } #if !ACTK_DISABLE_FILEPREFS_AUTOSAVE internal static bool IsMobilePlatform() { if (isMobilePlatform == null) { #if UNITY_EDITOR isMobilePlatform = UnityEditorInternal.InternalEditorUtility.IsMobilePlatform(UnityEditor.EditorUserBuildSettings.activeBuildTarget); #else isMobilePlatform = Application.isMobilePlatform; #endif } return isMobilePlatform.Value; } #endif } }