#if ENABLE_CLOUD_SERVICES_ANALYTICS using System; using System.Text; using UnityEngine.Networking; namespace UnityEngine.Analytics { public class DataPrivacy { [Serializable] internal struct UserPostData { public string appid; public string userid; public long sessionid; public string platform; public UInt32 platformid; public string sdk_ver; public bool debug_device; public string deviceid; public string plugin_ver; } [Serializable] internal struct TokenData { public string url; public string token; } const string kVersion = "3.0.0"; const string kVersionString = "DataPrivacyPackage/" + kVersion; internal const string kBaseUrl = "https://data-optout-service.uca.cloud.unity3d.com"; const string kTokenUrl = kBaseUrl + "/token"; internal static UserPostData GetUserData() { var postData = new UserPostData { appid = Application.cloudProjectId, userid = AnalyticsSessionInfo.userId, sessionid = AnalyticsSessionInfo.sessionId, platform = Application.platform.ToString(), platformid = (UInt32)Application.platform, sdk_ver = Application.unityVersion, debug_device = Debug.isDebugBuild, deviceid = SystemInfo.deviceUniqueIdentifier, plugin_ver = kVersionString }; return postData; } static string GetUserAgent() { var message = "UnityPlayer/{0} ({1}/{2}{3} {4})"; return String.Format(message, Application.unityVersion, Application.platform.ToString(), (UInt32)Application.platform, Debug.isDebugBuild ? "-dev" : "", kVersionString); } static String getErrorString(UnityWebRequest www) { var json = www.downloadHandler.text; var error = www.error; if (String.IsNullOrEmpty(error)) { // 5.5 sometimes fails to parse an error response, and the only clue will be // in www.responseHeadersString, which isn't accessible. error = "Empty response"; } if (!String.IsNullOrEmpty(json)) { error += ": " + json; } return error; } public static void FetchPrivacyUrl(Action success, Action failure = null) { string postJson = JsonUtility.ToJson(GetUserData()); byte[] bytes = Encoding.UTF8.GetBytes(postJson); var uploadHandler = new UploadHandlerRaw(bytes); uploadHandler.contentType = "application/json"; var www = UnityWebRequest.Post(kTokenUrl, ""); www.uploadHandler = uploadHandler; #if !UNITY_WEBGL www.SetRequestHeader("User-Agent", GetUserAgent()); #endif var async = www.SendWebRequest(); async.completed += (AsyncOperation async2) => { var json = www.downloadHandler.text; if (!String.IsNullOrEmpty(www.error) || String.IsNullOrEmpty(json)) { var error = getErrorString(www); if (failure != null) { failure(error); } } else { TokenData tokenData; tokenData.url = ""; // Just to quell "possibly unassigned" error try { tokenData = JsonUtility.FromJson(json); } catch (Exception e) { if (failure != null) { failure(e.ToString()); } } success(tokenData.url); } }; } } } #endif //ENABLE_CLOUD_SERVICES_ANALYTICS