using UnityEngine; using System.Collections.Generic; #if UNITY_ANDROID using System; #endif #if UNITY_IPHONE using System.Runtime.InteropServices; using System.Collections; #endif public enum TalkingDataAccountType { ANONYMOUS = 0, REGISTERED = 1, SINA_WEIBO = 2, QQ = 3, QQ_WEIBO = 4, ND91 = 5, WEIXIN = 6, TYPE1 = 11, TYPE2 = 12, TYPE3 = 13, TYPE4 = 14, TYPE5 = 15, TYPE6 = 16, TYPE7 = 17, TYPE8 = 18, TYPE9 = 19, TYPE10 = 20 } public static class TalkingDataPlugin { #if UNITY_ANDROID private static readonly string APP_ANALYTICS_CLASS = "com.tendcloud.tenddata.TCAgent"; private static AndroidJavaClass appAnalyticsClass; private static AndroidJavaClass unityPlayerClass; #endif #if UNITY_IPHONE [DllImport("__Internal")] private static extern string TDAAGetDeviceId(); [DllImport("__Internal")] private static extern void TDAASetLogEnabled(bool enable); [DllImport("__Internal")] private static extern void TDAABackgroundSessionEnabled(); [DllImport("__Internal")] private static extern void TDAASessionStarted(string appId, string channelId); [DllImport("__Internal")] private static extern void TDAASetExceptionReportEnabled(bool enable); [DllImport("__Internal")] private static extern void TDAASetLocation(double latitude, double longitude); [DllImport("__Internal")] private static extern void TDAAOnRegister(string accountId, int type, string name); [DllImport("__Internal")] private static extern void TDAAOnLogin(string accountId, int type, string name); #if TDAA_STANDARD [DllImport("__Internal")] private static extern void TDAAOnViewItem(string itemId, string category, string name, int unitPrice); [DllImport("__Internal")] private static extern void TDAAOnAddItemToShoppingCart(string item, string category, string name, int unitPrice, int amount); [DllImport("__Internal")] private static extern void TDAAOnViewShoppingCart(string shoppingCartJson); [DllImport("__Internal")] private static extern void TDAAOnPlaceOrder(string account, string orderJson); [DllImport("__Internal")] private static extern void TDAAOnOrderPaySucc(string account, string payType, string orderJson); #endif #if TDAA_CUSTOM [DllImport("__Internal")] private static extern void TDAATrackEvent(string eventId); [DllImport("__Internal")] private static extern void TDAATrackEventLabel(string eventId, string eventLabel); [DllImport("__Internal")] private static extern void TDAATrackEventParameters(string eventId, string eventLabel, string parameters); #endif #if TDAA_PAGE [DllImport("__Internal")] private static extern void TDAATrackPageBegin(string pageName); [DllImport("__Internal")] private static extern void TDAATrackPageEnd(string pageName); #endif #if TDAA_PUSH [DllImport("__Internal")] private static extern void TDAASetDeviceToken(byte[] deviceToken, int length); [DllImport("__Internal")] private static extern void TDAAHandlePushMessage(string message); private static bool hasTokenBeenObtained = false; #endif #endif #if UNITY_ANDROID private static AndroidJavaObject GetCurrentActivity() { if (unityPlayerClass == null) { unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); } AndroidJavaObject activity = unityPlayerClass.GetStatic("currentActivity"); return activity; } #endif private static string deviceId = null; public static string GetDeviceId() { if (deviceId == null && Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass == null) { appAnalyticsClass = new AndroidJavaClass(APP_ANALYTICS_CLASS); } deviceId = appAnalyticsClass.CallStatic("getDeviceId", GetCurrentActivity()); #endif #if UNITY_IPHONE deviceId = TDAAGetDeviceId(); #endif } return deviceId; } private static string oaid = null; public static string GetOAID() { if (oaid == null && Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass == null) { appAnalyticsClass = new AndroidJavaClass(APP_ANALYTICS_CLASS); } oaid = appAnalyticsClass.CallStatic("getOAID", GetCurrentActivity()); #endif } return oaid; } public static void SetLogEnabled(bool enable) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass == null) { appAnalyticsClass = new AndroidJavaClass(APP_ANALYTICS_CLASS); } appAnalyticsClass.SetStatic("LOG_ON", enable); #endif #if UNITY_IPHONE TDAASetLogEnabled(enable); #endif } } public static void BackgroundSessionEnabled() { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_IPHONE TDAABackgroundSessionEnabled(); #endif } } public static void SessionStarted(string appId, string channelId) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { Debug.Log("TalkingData App Analytics Unity SDK."); #if UNITY_ANDROID using (AndroidJavaClass dz = new AndroidJavaClass("com.tendcloud.tenddata.dz")) { dz.SetStatic("a", 2); } if (appAnalyticsClass == null) { appAnalyticsClass = new AndroidJavaClass(APP_ANALYTICS_CLASS); } AndroidJavaObject activity = GetCurrentActivity(); appAnalyticsClass.CallStatic("init", activity, appId, channelId); appAnalyticsClass.CallStatic("onResume", activity); #endif #if UNITY_IPHONE TDAASessionStarted(appId, channelId); #endif } } public static void SessionStoped() { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onPause", GetCurrentActivity()); appAnalyticsClass = null; unityPlayerClass = null; } #endif } } public static void SetExceptionReportEnabled(bool enable) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("setReportUncaughtExceptions", enable); } #endif #if UNITY_IPHONE TDAASetExceptionReportEnabled(enable); #endif } } public static void SetLocation(double latitude, double longitude) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_IPHONE TDAASetLocation(latitude, longitude); #endif } } public static void OnRegister(string accountId, TalkingDataAccountType type, string name) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { AndroidJavaClass enumClass = new AndroidJavaClass("com.tendcloud.tenddata.TDAccount$AccountType"); AndroidJavaObject typeObj = enumClass.CallStatic("valueOf", type.ToString()); appAnalyticsClass.CallStatic("onRegister", accountId, typeObj, name); enumClass.Dispose(); } #endif #if UNITY_IPHONE TDAAOnRegister(accountId, (int)type, name); #endif } } public static void OnLogin(string accountId, TalkingDataAccountType type, string name) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { AndroidJavaClass enumClass = new AndroidJavaClass("com.tendcloud.tenddata.TDAccount$AccountType"); AndroidJavaObject typeObj = enumClass.CallStatic("valueOf", type.ToString()); appAnalyticsClass.CallStatic("onLogin", accountId, typeObj, name); enumClass.Dispose(); } #endif #if UNITY_IPHONE TDAAOnLogin(accountId, (int)type, name); #endif } } #if TDAA_STANDARD public static void OnViewItem(string itemId, string category, string name, int unitPrice) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onViewItem", itemId, category, name, unitPrice); } #endif #if UNITY_IPHONE TDAAOnViewItem(itemId, category, name, unitPrice); #endif } } public static void OnAddItemToShoppingCart(string itemId, string category, string name, int unitPrice, int amount) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onAddItemToShoppingCart", itemId, category, name, unitPrice, amount); } #endif #if UNITY_IPHONE TDAAOnAddItemToShoppingCart(itemId, category, name, unitPrice, amount); #endif } } public static void OnViewShoppingCart(TalkingDataShoppingCart shoppingCart) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onViewShoppingCart", shoppingCart.javaObj); } #endif #if UNITY_IPHONE TDAAOnViewShoppingCart(shoppingCart.ToString()); #endif } } public static void OnPlaceOrder(string accountId, TalkingDataOrder order) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onPlaceOrder", accountId, order.javaObj); } #endif #if UNITY_IPHONE TDAAOnPlaceOrder(accountId, order.ToString()); #endif } } public static void OnOrderPaySucc(string accountId, string payType, TalkingDataOrder order) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onOrderPaySucc", accountId, payType, order.javaObj); } #endif #if UNITY_IPHONE TDAAOnOrderPaySucc(accountId, payType, order.ToString()); #endif } } #endif #if TDAA_CUSTOM public static void TrackEvent(string eventId) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onEvent", GetCurrentActivity(), eventId); } #endif #if UNITY_IPHONE TDAATrackEvent(eventId); #endif } } public static void TrackEventWithLabel(string eventId, string eventLabel) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onEvent", GetCurrentActivity(), eventId, eventLabel); } #endif #if UNITY_IPHONE TDAATrackEventLabel(eventId, eventLabel); #endif } } public static void TrackEventWithParameters(string eventId, string eventLabel, Dictionary parameters) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { if (parameters != null && parameters.Count > 0) { int count = parameters.Count; AndroidJavaObject map = new AndroidJavaObject("java.util.HashMap", count); IntPtr method_Put = AndroidJNIHelper.GetMethodID(map.GetRawClass(), "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"); object[] args = new object[2]; foreach (KeyValuePair kvp in parameters) { args[0] = new AndroidJavaObject("java.lang.String", kvp.Key); args[1] = typeof(string).IsInstanceOfType(kvp.Value) ? new AndroidJavaObject("java.lang.String", kvp.Value) : new AndroidJavaObject("java.lang.Double", "" + kvp.Value); AndroidJNI.CallObjectMethod(map.GetRawObject(), method_Put, AndroidJNIHelper.CreateJNIArgArray(args)); } appAnalyticsClass.CallStatic("onEvent", GetCurrentActivity(), eventId, eventLabel, map); map.Dispose(); } else { appAnalyticsClass.CallStatic("onEvent", GetCurrentActivity(), eventId, eventLabel, null); } } #endif #if UNITY_IPHONE if (parameters != null && parameters.Count > 0) { string parameterStr = "{"; foreach (KeyValuePair kvp in parameters) { if (kvp.Value is string) { parameterStr += "\"" + kvp.Key + "\":\"" + kvp.Value + "\","; } else { try { double tmp = System.Convert.ToDouble(kvp.Value); parameterStr += "\"" + kvp.Key + "\":" + tmp + ","; } catch (System.Exception) { } } } parameterStr = parameterStr.TrimEnd(','); parameterStr += "}"; TDAATrackEventParameters(eventId, eventLabel, parameterStr); } else { TDAATrackEventParameters(eventId, eventLabel, null); } #endif } } #endif #if TDAA_PAGE public static void TrackPageBegin(string pageName) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onPageStart", GetCurrentActivity(), pageName); } #endif #if UNITY_IPHONE TDAATrackPageBegin(pageName); #endif } } public static void TrackPageEnd(string pageName) { if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { #if UNITY_ANDROID if (appAnalyticsClass != null) { appAnalyticsClass.CallStatic("onPageEnd", GetCurrentActivity(), pageName); } #endif #if UNITY_IPHONE TDAATrackPageEnd(pageName); #endif } } #endif #if TDAA_PUSH public static void SetDeviceToken() { #if UNITY_IPHONE if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { if (!hasTokenBeenObtained) { byte[] deviceToken = UnityEngine.iOS.NotificationServices.deviceToken; if (deviceToken != null) { TDAASetDeviceToken(deviceToken, deviceToken.Length); hasTokenBeenObtained = true; } } } #endif } public static void HandlePushMessage() { #if UNITY_IPHONE if (Application.platform != RuntimePlatform.OSXEditor && Application.platform != RuntimePlatform.WindowsEditor) { UnityEngine.iOS.RemoteNotification[] notifications = UnityEngine.iOS.NotificationServices.remoteNotifications; if (notifications != null) { UnityEngine.iOS.NotificationServices.ClearRemoteNotifications(); foreach (UnityEngine.iOS.RemoteNotification rn in notifications) { foreach (DictionaryEntry de in rn.userInfo) { if (de.Key.ToString().Equals("sign")) { string sign = de.Value.ToString(); TDAAHandlePushMessage(sign); } } } } } #endif } #endif }