using UnityEngine; using System.Runtime.InteropServices; using AOT; using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Text.RegularExpressions; using System.Collections; public class Tracking: MonoBehaviour { private static Tracking _instance = null; //private static Regex regex = new Regex("^([a-zA-Z])([a-zA-Z0-9_]){0,63}$"); public static Tracking Instance { get { if (!_instance) { _instance = FindObjectOfType (typeof(Tracking)) as Tracking; if (!_instance) { GameObject am = new GameObject ("Tracking"); _instance = am.AddComponent (typeof(Tracking)) as Tracking; } } return _instance; } } private static List waitingTaskList = new List(); private static List executingTaskList = new List(); public static void PostTask(Action task) { lock (waitingTaskList) { waitingTaskList.Add(task); } } private void Update() { lock (waitingTaskList) { if (waitingTaskList.Count > 0) { executingTaskList.AddRange(waitingTaskList); waitingTaskList.Clear(); } } for (int i = 0; i < executingTaskList.Count; ++i) { Action task = executingTaskList[i]; try { task(); } catch (Exception e) { Debug.LogError(e.Message, this); } } executingTaskList.Clear(); } void Awake () { DontDestroyOnLoad (this); } public delegate void DeferredDeeplinkCallBack(string result); public delegate void AttributionCalllback(string result, int status); private DeferredDeeplinkCallBack deferredDeeplinCallback_private = null; private AttributionCalllback attributionCalllback_private = null; #if UNITY_IOS && !UNITY_EDITOR internal delegate void _internalDeferredDeeplinkCallBack(string result); internal delegate void _internalAttributionCalllback(string result, int status); [DllImport ("__Internal")] private static extern void _internalInitWithAppKeyAndChannel_Tracking (string appKey, string channelId); [DllImport ("__Internal")] private static extern void _preInit_newer (string appKey); [DllImport ("__Internal")] private static extern void _internalInitWithAppKeyAndChannel_Tracking_newer (string appKey, string channelId,string caid1,string caid2,string oid,string install_params,string startup_params); [DllImport ("__Internal")] private static extern void _internalSetRegisterWithAccountID_Tracking_newer (string account,string params_string); [DllImport ("__Internal")] private static extern void _internalSetLoginWithAccountIDAndServerId_Tracking_newer (string account,string serverId,string params_string); [DllImport ("__Internal")] private static extern void _internalSetRyzf_Tracking_newer (string ryTID, string ryzfType, string hbType, float hbAmount,string params_string); [DllImport ("__Internal")] private static extern void _internalSetDD_Tracking_newer (string ryTID, string hbType, float hbAmount,string params_string); [DllImport ("__Internal")] private static extern void _internalSetEvent_Tracking_newer (string EventName,string params_string); [DllImport ("__Internal")] private static extern void _internalSetTrackViewDuration_Tracking_newer (string viewID,long duration,string params_string); [DllImport ("__Internal")] private static extern void _internalSetAdShow_Tracking_newer(string adPlatform,string adid,int success,string params_string); [DllImport ("__Internal")] private static extern void _internalSetAdClick_Tracking_newer(string adPlatform,string adid,string params_string); [DllImport ("__Internal")] private static extern void _internalSetTrackAppDuration_Tracking_newer(long duration,string params_string); [DllImport ("__Internal")] private static extern string _internalGetDeviceId_Tracking (); [DllImport ("__Internal")] private static extern void _internalSetPrintLog_Tracking (bool printLog); [DllImport ("__Internal")] private static extern void _internalSetASAEnable_Tracking (bool enable); [DllImport("__Internal")] private static extern void _internal_SetAttributionCalllbackDelegate_Tracing(_internalAttributionCalllback callback); [DllImport("__Internal")] private static extern void _internal_SetDeferredDeeplinkCallBack_Tracking(_internalDeferredDeeplinkCallBack callback); [DllImport ("__Internal")] private static extern void _internalSetIPAdds6Enable_Tracking (bool enable); #endif #if UNITY_ANDROID && !UNITY_EDITOR public static AndroidJavaObject getApplicationContext () { using (AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer")) { using (AndroidJavaObject jo = jc.GetStatic ("currentActivity")) { return jo.Call ("getApplicationContext"); } } return null; } #endif /// /// 预初始化方法 /// public void preInit(string appKey) { #if UNITY_IOS && !UNITY_EDITOR _preInit_newer (appKey); #elif UNITY_ANDROID && !UNITY_EDITOR using (AndroidJavaClass TrackingIO = new AndroidJavaClass("com.reyun.tracking.sdk.Tracking")) { TrackingIO.CallStatic("preInit", getApplicationContext(), appKey); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// 初始化方法 /// /// appKey /// 标识推广渠道的字符 /// caid1 ios 专用字段,广告协会caid字段,默认为空 /// caid2 ios 专用字段,广告协会caid字段,默认为空 /// 自定义startup参数 /// 自定义install参数 public void init (string appKey, string channelId,string caid1 = null,string caid2 = null, Dictionary startupParams = null, Dictionary installParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring_install = DictionaryToJsonString(installParams); if (paramstring_install == null) { paramstring_install = "{}"; } string paramstring_startup = DictionaryToJsonString(startupParams); if (paramstring_startup == null) { paramstring_startup = "{}"; } _internalInitWithAppKeyAndChannel_Tracking_newer (appKey, channelId,caid1,caid2,null, paramstring_install,paramstring_startup); #elif UNITY_ANDROID && !UNITY_EDITOR string paramstring_install = DictionaryToJsonString(installParams); if (paramstring_install == null) { paramstring_install = "{}"; } string paramstring_startup = DictionaryToJsonString(startupParams); if (paramstring_startup == null) { paramstring_startup = "{}"; } using (AndroidJavaClass TrackingIO = new AndroidJavaClass ("com.reyun.tracking.sdk.Tracking")) { TrackingIO.CallStatic ("initWithKeyAndChannelId", getApplicationContext (), appKey, channelId,paramstring_startup,paramstring_install,null,false); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// 玩家服务器注册 /// /// 账号ID /// public void register (string account, Dictionary customParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); _internalSetRegisterWithAccountID_Tracking_newer(account,paramstring); #elif UNITY_ANDROID && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); if (paramstring == null) { paramstring = "{}"; } using (AndroidJavaClass TrackingIO = new AndroidJavaClass ("com.reyun.tracking.sdk.Tracking")) { TrackingIO.CallStatic ("setRegisterWithAccountID", account,paramstring); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// 玩家的账号登陆服务器 /// /// 账号 public void login (string account,string serverId = null, Dictionary customParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); _internalSetLoginWithAccountIDAndServerId_Tracking_newer (account,serverId,paramstring); #elif UNITY_ANDROID && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); if (paramstring == null) { paramstring = "{}"; } using (AndroidJavaClass TrackingIO = new AndroidJavaClass ("com.reyun.tracking.sdk.Tracking")) { TrackingIO.CallStatic ("setLoginSuccessBusiness", account,serverId,paramstring); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// 玩家的充值数据 /// /// 交易的流水号 /// 支付类型 /// 货币类型 /// 支付的真实货币的金额 public void setryzf (string ryTID, string ryzfType, string hbType, float hbAmount, Dictionary customParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); _internalSetRyzf_Tracking_newer (ryTID, ryzfType, hbType, hbAmount,paramstring); #elif UNITY_ANDROID && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); if (paramstring == null) { paramstring = "{}"; } using (AndroidJavaClass TrackingIO = new AndroidJavaClass ("com.reyun.tracking.sdk.Tracking")) { TrackingIO.CallStatic ("setPayment", ryTID, ryzfType, hbType, hbAmount,paramstring); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// 玩家的订单数据 /// /// 交易的流水号 /// 货币类型 /// 支付的真实货币的金额 public void setDD (string ryTID, string hbType, float hbAmount, Dictionary customParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); _internalSetDD_Tracking_newer (ryTID,hbType,hbAmount,paramstring); #elif UNITY_ANDROID && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); if (paramstring == null) { paramstring = "{}"; } using (AndroidJavaClass TrackingIO = new AndroidJavaClass ("com.reyun.tracking.sdk.Tracking")) { TrackingIO.CallStatic ("setOrder", ryTID, hbType, hbAmount,paramstring); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// 统计玩家的自定义事件 /// /// 事件名 必须为event_1到event_30 public void setEvent (string eventName, Dictionary customParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); _internalSetEvent_Tracking_newer (eventName,paramstring); #elif UNITY_ANDROID && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); if (paramstring == null) { paramstring = "{}"; } using (AndroidJavaClass reyun = new AndroidJavaClass ("com.reyun.tracking.sdk.Tracking")) { reyun.CallStatic ("setEvent", eventName, paramstring); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// 监测页面展示时长 /// /// 页面唯一标识 /// 页面展示时长 public void setTrackViewDuration(string pageID,long duration, Dictionary customParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); _internalSetTrackViewDuration_Tracking_newer(pageID,duration,paramstring); #elif UNITY_ANDROID && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); if (paramstring == null) { paramstring = "{}"; } using (AndroidJavaClass reyun = new AndroidJavaClass("com.reyun.tracking.sdk.Tracking")) { reyun.CallStatic("setPageDuration", pageID, duration*1000,paramstring); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// //广告展示时调用 /// /// 广告平台缩写,如穿山甲广告平台传入 "csj" /// 广告位ID /// /// 是否展示成功 public void setTrackAdShow(string adPlatform,string adId,bool playSuccess, Dictionary customParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); int successInt = playSuccess ? 1 : 2; _internalSetAdShow_Tracking_newer(adPlatform,adId,successInt,paramstring); #elif UNITY_ANDROID && !UNITY_EDITOR string successString = playSuccess ? "1" : "2"; string paramstring = DictionaryToJsonString(customParams); if (paramstring == null) { paramstring = "{}"; } using (AndroidJavaClass reyun = new AndroidJavaClass("com.reyun.tracking.sdk.Tracking")) { reyun.CallStatic("setAdShow", adPlatform, adId,successString,paramstring); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// //广告点击时调用 /// /// 广告平台缩写,如穿山甲广告平台传入 "csj" /// 广告位ID public void setTrackAdClick(string adPlatform, string adId, Dictionary customParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); _internalSetAdClick_Tracking_newer(adPlatform,adId,paramstring); #elif UNITY_ANDROID && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); if (paramstring == null) { paramstring = "{}"; } using (AndroidJavaClass reyun = new AndroidJavaClass("com.reyun.tracking.sdk.Tracking")) { reyun.CallStatic("setAdClick", adPlatform, adId,paramstring); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// 统计APP运行时长 /// /// 时间长度 public void setTrackAppDuration(long duration, Dictionary customParams = null) { #if UNITY_IOS && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); _internalSetTrackAppDuration_Tracking_newer(duration,paramstring); #elif UNITY_ANDROID && !UNITY_EDITOR string paramstring = DictionaryToJsonString(customParams); if (paramstring == null) { paramstring = "{}"; } using (AndroidJavaClass reyun = new AndroidJavaClass("com.reyun.tracking.sdk.Tracking")) { reyun.CallStatic("setAppDuration", duration*1000,paramstring); } #else Debug.LogError("Current platform not implemented!"); #endif } /// /// 获取用户的设备ID信息 /// public string getDeviceId () { #if UNITY_IOS && !UNITY_EDITOR return _internalGetDeviceId_Tracking (); #elif UNITY_ANDROID && !UNITY_EDITOR string str = "unknown"; using (AndroidJavaClass TrackingIO = new AndroidJavaClass ("com.reyun.tracking.sdk.Tracking")) { str = TrackingIO.CallStatic ("getDeviceId"); } return str; #else Debug.LogError("Current platform not implemented!"); return "unknown"; #endif } /// 开启日志打印 public void setPrintLog (bool print) { #if UNITY_IOS && !UNITY_EDITOR _internalSetPrintLog_Tracking (print); #elif UNITY_ANDROID && !UNITY_EDITOR using (AndroidJavaClass TrackingIO = new AndroidJavaClass ("com.reyun.tracking.sdk.Tracking")) { TrackingIO.CallStatic("setDebugMode", print); } #else Debug.LogError("Current platform not implemented!"); #endif } public void setASAEnable(bool enable) { #if UNITY_IOS && !UNITY_EDITOR _internalSetASAEnable_Tracking (enable); #else Debug.LogError("Current platform not implemented!"); #endif } #if UNITY_IOS && !UNITY_EDITOR [MonoPInvokeCallback(typeof(_internalDeferredDeeplinkCallBack))] private static void OnDeeplinkCallback(string msg) { PostTask(() => { if (Tracking.Instance.deferredDeeplinCallback_private != null && msg != null) { Tracking.Instance.deferredDeeplinCallback_private.Invoke(msg); } }); } [MonoPInvokeCallback(typeof(_internalAttributionCalllback))] private static void OnAttibutionCallback(string result, int status) { PostTask(() => { if (Tracking.Instance.attributionCalllback_private != null) { Tracking.Instance.attributionCalllback_private.Invoke(result, status); } }); } #endif #region iOS install Attribution public void setAttributionCalllbackDelegate(AttributionCalllback callback) { #if UNITY_IOS && !UNITY_EDITOR Tracking.Instance.attributionCalllback_private = callback; _internal_SetAttributionCalllbackDelegate_Tracing(OnAttibutionCallback); #elif UNITY_ANDROID && !UNITY_EDITOR Tracking.Instance.attributionCalllback_private = callback; using (AndroidJavaClass TrackingIO = new AndroidJavaClass("com.reyun.tracking.sdk.Tracking")) { TrackingIO.CallStatic("setAttributionQueryListener", new AndroidAttributionQuery()); } #else Debug.LogError("Current platform not implemented!"); #endif } #endregion #region iOS deferred deeplink public void setDeferredDeeplinkCalllbackDelegate(DeferredDeeplinkCallBack callback) { #if UNITY_IOS && !UNITY_EDITOR Tracking.Instance.deferredDeeplinCallback_private = callback; _internal_SetDeferredDeeplinkCallBack_Tracking(OnDeeplinkCallback); #elif UNITY_ANDROID && !UNITY_EDITOR Tracking.Instance.deferredDeeplinCallback_private = callback; using (AndroidJavaClass TrackingIO = new AndroidJavaClass("com.reyun.tracking.sdk.Tracking")) { TrackingIO.CallStatic("setDeepLinkListener", new AndroidDeferredDeeplink()); } #else Debug.LogError("Current platform not implemented!"); #endif } #endregion #if UNITY_ANDROID && !UNITY_EDITOR private sealed class AndroidAttributionQuery : AndroidJavaProxy { public AndroidAttributionQuery() : base("com.reyun.tracking.utils.IAttributionQueryListener") { } public void onComplete(int paramInt, String param_string) { Tracking.PostTask(() => { if (Tracking.Instance.attributionCalllback_private != null) { Tracking.Instance.attributionCalllback_private.Invoke(param_string, paramInt); } }); } } private sealed class AndroidDeferredDeeplink : AndroidJavaProxy { public AndroidDeferredDeeplink() : base("com.reyun.tracking.utils.IDeepLinkListener") { } public void onComplete(bool isSuccess, String dpUrl, String dpPath) { Tracking.PostTask(() => { if (Tracking.Instance.deferredDeeplinCallback_private != null) { string jsonString = ""; if (isSuccess) { jsonString += "{\"dp_url\":\"" + (dpUrl != null? dpUrl : "") + "\","; jsonString += "\"dp_path\":\"" + (dpPath != null ? dpPath : "") + "\"}"; } else { jsonString = "{}"; } Tracking.Instance.deferredDeeplinCallback_private.Invoke(jsonString); } }); } } #endif private static String DictionaryToJsonString (Dictionary dictionary) { string result = null; try { if (!CheckDictionary(dictionary)) { return result; } result = MiniJSON.Json.Serialize(dictionary); } catch (Exception e) { Debug.LogError("ToJsonString error:" + e.Message); } return result; } private static bool CheckDictionary(Dictionary dictionary) { if (dictionary == null || dictionary.Count == 0) { return false; } foreach (var entry in dictionary) { if (entry.Key == null) { return false; } if (entry.Value == null) { return false; } if (entry.Value is string stringvalue) { if (stringvalue == null || stringvalue.Length == 0) { return false; } } } return true; } //private static bool isNumber(object value) //{ // if (value == null) // { // return false; // } // if (value is float || value is int // || value is uint // || value is long // || value is sbyte // || value is byte // || value is short // || value is ushort // || value is ulong // || value is double // || value is decimal) // { // return true; // } // return false; //} }