using System.Collections.Generic; using GameAnalyticsSDK; using GameAnalyticsSDK.Events; using UnityEngine; using GameAnalyticsSDK.Wrapper; using Touka.GameLogic; using System; #if UNITY_IOS using UnityEngine.iOS; #endif namespace Touka { /// /// 数据统计类 /// /// 包含Umeng、GA、Tenjin的初始化及打点;Umeng在线参数初始化; /// ** 需在 StaticStringKey 类里修改对应ID /// public class ToukaAnalyticsManager : ToukaSingletonMonoBehaviour { /// /// Init /// public void Init() { Debug.Log("[ToukaAnalyticsManager] Init"); StaticOnlineParams.Instance.InitData(); // 初始化在线参数列表 #if UNITY_EDITOR StaticOnlineParams.GetInstance().Init(); // 初始化在线参数 return; #else #endif InitUmeng(); // 初始化umeng InitGA(); // 初始化ga InitTenjin(); // 初始化tenjin StaticOnlineParams.GetInstance().Init(); // 初始化在线参数 ToukaUtilsInner.Instance.Check2DaysLogin(); // 检查次日登录 ToukaUtilsInner.Instance.SaveFirstLoginTime(); // 记录首次登录游戏时间 } #region Inits /// /// 初始化Umeng /// private void InitUmeng() { #if UNITY_IOS TGTools.Instance.onRemoteConfigHandler = GetRemoteConfigOnline; TGTools.Instance.InitSdk(StaticStringsKey.UMENG_APPKEY, StaticStringsKey.UMENG_CHANNELID); Umeng.Analytics.SetLogEnabled(true); #elif UNITY_ANDROID Umeng.Analytics.StartWithAppKeyAndChannelId (StaticStringsKey.UMENG_APPKEY, StaticStringsKey.UMENG_CHANNELID); Umeng.Analytics.SetLogEnabled (false); #endif } /// /// Umeng在线参数回调 /// public void GetRemoteConfigOnline() { Debug.Log("[ToukaAnalyticsManager] get remote config from online"); StaticOnlineParams.Instance.parseGameOnlineConfig(); } /// /// 初始化GA /// private void InitGA() { if (UnityEngine.Object.FindObjectOfType(typeof(GameAnalytics)) == null) { GameObject ga = new GameObject(); ga.name = "GameAnalytics"; ga.transform.parent = transform; ga.AddComponent(); ga.AddComponent(); } else { Debug.LogWarning("A GameAnalytics object already exists in this scene - you should never have more than one per scene!"); } GameAnalytics.Initialize(); GA_Wrapper.SetBuild(Application.version); GA_Wrapper.Initialize(StaticStringsKey.GA_gameKey, StaticStringsKey.GA_secretKey); Debug.Log("[ToukaAnalyticsManager] GA: init :GA_gameKey=" + StaticStringsKey.GA_gameKey + "GA_secretKey=" + StaticStringsKey.GA_secretKey + " Application.version=" + Application.version); } /// /// 初始化Tenjin /// private void InitTenjin() { #if IOS_CN if (!StaticOtherConfig.InitTenjinLater_Switch) // 启动就初始化tenjin { InitTenjinInner(); } else // 延时初始化tenjin { if (ToukaUtils.GetPlayerPrefsIntByKey(StaticStringsPlayerPrefs.HasInitTenjinFirst, 0) == 1) { Debug.Log("首次初始化过tenjin了,之后都可以正常初始了"); InitTenjinInner(); } else { Debug.Log("需要延迟,启动处不能初始化tenjin"); } } #else InitTenjinInner(); #endif } /// /// 实际调用初始化Tenjin /// public void InitTenjinInner() { #if !IOS_CN && !ANDROID_CN && !ANDROID_TW Debug.Log("[ToukaAnalyticsManager] init tenjin inner"); // Sends install/open event to Tenjin BaseTenjin instance = Tenjin.getInstance(StaticStringsKey.TENJIN_KEY); #if UNITY_IOS if (new Version(Device.systemVersion).CompareTo(new Version("14.0")) >= 0) { // Tenjin wrapper for requestTrackingAuthorization instance.RequestTrackingAuthorizationWithCompletionHandler((status) => { Debug.Log("===> App Tracking Transparency Authorization Status: " + status); // Sends install/open event to Tenjin instance.Connect(); }); } else { instance.Connect(); } #else instance.Connect(); #endif #endif } #endregion #region Events /// /// 打点事件 Tenjin / GA /// /// Tenjin / GA /// 事件名称 /// 事件属性(可选) public void LogEvent(ToukaLogType _logType, string _eventName, string _label = null) { Debug.Log("[ToukaAnalyticsManager] LogEvent, logType : " + _logType.ToString() + " , eventName " + _eventName + " label:" + _label); #if UNITY_EDITOR return; #endif if (string.IsNullOrEmpty(_eventName)) return; // ga if ((_logType & ToukaLogType.GA) > 0) { if (string.IsNullOrEmpty(_label)) { GameAnalytics.NewDesignEvent("event:" + _eventName); } else { GameAnalytics.NewDesignEvent("event:" + _eventName + "_" + _label); } } // tenjin if ((_logType & ToukaLogType.Tenjin) > 0) { if (string.IsNullOrEmpty(_label)) { #if ANDROID_TW TGAndroidAnalytics.Instance.onEvent(_eventName); #else Tenjin.getInstance(StaticStringsKey.TENJIN_KEY).SendEvent(_eventName); #endif } else { #if ANDROID_TW TGAndroidAnalytics.Instance.onEvent(_eventName + _label); #else Tenjin.getInstance(StaticStringsKey.TENJIN_KEY).SendEvent(_eventName + _label); #endif } Debug.Log("Touka LogEventWithLabel Tenjin: " + _eventName + " label:" + _label); } } /// /// umeng打点 - 事件名字 /// /// 事件名字 public void LogEventByUmeng(string _eventSort) { #if !NO_SDK Debug.Log("Touka LogEventByUmeng _eventSort : " + _eventSort); #if UNITY_EDITOR return; #endif Umeng.Analytics.Event(_eventSort); #endif } /// /// umeng 打点 - 事件名字 + 一个事件属性(key:value) /// /// 事件名字 /// 属性key /// 属性value public void LogEventByUmeng(string _eventSort, string _key, string _value) { if (!string.IsNullOrEmpty(_eventSort) && !string.IsNullOrEmpty(_key) && !string.IsNullOrEmpty(_value)) { LogEventByUmeng(_eventSort, new Dictionary() { { _key, _value } }); } } /// /// umeng 打点 - 事件名字 + 两个事件属性(key:value) /// /// 事件名字 /// 属性1-key /// 属性1-value /// 属性2-key /// 属性2-value public void LogEventByUmeng(string _eventSort, string _key01, string _value01, string _key02, string _value02) { if (!string.IsNullOrEmpty(_eventSort) && !string.IsNullOrEmpty(_key01) && !string.IsNullOrEmpty(_value01) && !string.IsNullOrEmpty(_key02) && !string.IsNullOrEmpty(_value02)) { LogEventByUmeng(_eventSort, new Dictionary() { { _key01, _value01 }, { _key02, _value02 } }); } } /// /// umeng 打点 - 事件名字 + 事件属性字典 /// /// 事件名字 /// 事件属性字典 public void LogEventByUmeng(string _eventSort, Dictionary _eventDic = null) { string eventStr = "UMENG LOG _eventSort : " + _eventSort + " -> "; if (_eventDic != null) { foreach (var kvp in _eventDic) { eventStr += string.Format(" (Key = {0}, Value = {1} ) , ", kvp.Key, kvp.Value); } } Debug.Log(eventStr); #if !NO_SDK #if UNITY_EDITOR return; #endif if (!string.IsNullOrEmpty(_eventSort)) { if (_eventDic != null && _eventDic.Count == 0) { Umeng.Analytics.Event(_eventSort); } else if (_eventDic != null && _eventDic.Count > 0) { Umeng.Analytics.Event(_eventSort, _eventDic); } else if (_eventDic == null) { Umeng.Analytics.Event(_eventSort); } } else { Debug.LogError("UMENG Event Sort is Empty!"); } #endif } /// /// Umeng 打点广告按钮展示 /// /// public void LogEventByUmengAdShow(string _adShow) { if (!string.IsNullOrEmpty(_adShow)) { LogEventByUmeng(StaticStringsEvent.Event_Sort_TKInner_ad_button_show, new System.Collections.Generic.Dictionary() { { StaticStringsEvent.Event_Type_TKInner_ad_position, _adShow } }); } } #endregion } public enum ToukaLogType { GA = 1, Tenjin = 1 << 6, } }