2022-05-23 13:39:59 +00:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
|
|
|
|
|
|
using GameAnalyticsSDK;
|
|
|
|
|
|
using GameAnalyticsSDK.Events;
|
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
|
|
using GameAnalyticsSDK.Wrapper;
|
|
|
|
|
|
using Touka.GameLogic;
|
2022-05-27 16:06:04 +00:00
|
|
|
|
using System;
|
|
|
|
|
|
#if UNITY_IOS
|
|
|
|
|
|
using UnityEngine.iOS;
|
|
|
|
|
|
#endif
|
2022-05-23 13:39:59 +00:00
|
|
|
|
|
|
|
|
|
|
namespace Touka
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 数据统计类
|
|
|
|
|
|
///
|
|
|
|
|
|
/// 包含Umeng、GA、Tenjin的初始化及打点;Umeng在线参数初始化;
|
|
|
|
|
|
/// ** 需在 StaticStringKey 类里修改对应ID
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class ToukaAnalyticsManager : ToukaSingletonMonoBehaviour<ToukaAnalyticsManager>
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Init
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
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(); // 记录首次登录游戏时间
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-27 16:06:04 +00:00
|
|
|
|
#region Inits
|
2022-05-23 13:39:59 +00:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化Umeng
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Umeng在线参数回调
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public void GetRemoteConfigOnline()
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.Log("[ToukaAnalyticsManager] get remote config from online");
|
|
|
|
|
|
|
|
|
|
|
|
StaticOnlineParams.Instance.parseGameOnlineConfig();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化GA
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
private void InitGA()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (UnityEngine.Object.FindObjectOfType(typeof(GameAnalytics)) == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
GameObject ga = new GameObject();
|
|
|
|
|
|
ga.name = "GameAnalytics";
|
|
|
|
|
|
ga.transform.parent = transform;
|
|
|
|
|
|
ga.AddComponent<GA_SpecialEvents>();
|
|
|
|
|
|
ga.AddComponent<GameAnalytics>();
|
|
|
|
|
|
}
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 初始化Tenjin
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
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
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 实际调用初始化Tenjin
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public void InitTenjinInner()
|
|
|
|
|
|
{
|
2022-06-08 13:23:44 +00:00
|
|
|
|
#if !IOS_CN && !ANDROID_CN && !ANDROID_TW
|
2022-05-23 13:39:59 +00:00
|
|
|
|
Debug.Log("[ToukaAnalyticsManager] init tenjin inner");
|
2022-05-27 16:06:04 +00:00
|
|
|
|
// Sends install/open event to Tenjin
|
2022-05-23 13:39:59 +00:00
|
|
|
|
BaseTenjin instance = Tenjin.getInstance(StaticStringsKey.TENJIN_KEY);
|
2022-05-27 16:06:04 +00:00
|
|
|
|
#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);
|
2022-05-23 13:39:59 +00:00
|
|
|
|
|
2022-05-27 16:06:04 +00:00
|
|
|
|
// Sends install/open event to Tenjin
|
|
|
|
|
|
instance.Connect();
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
instance.Connect();
|
|
|
|
|
|
}
|
|
|
|
|
|
#else
|
2022-05-23 13:39:59 +00:00
|
|
|
|
instance.Connect();
|
2022-05-27 16:06:04 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
|
2022-05-23 13:39:59 +00:00
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-05-27 16:06:04 +00:00
|
|
|
|
|
2022-06-08 13:23:44 +00:00
|
|
|
|
#endregion
|
2022-05-23 13:39:59 +00:00
|
|
|
|
|
|
|
|
|
|
#region Events
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 打点事件 Tenjin / GA
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="_logType"> Tenjin / GA </param>
|
|
|
|
|
|
/// <param name="_eventName"> 事件名称 </param>
|
|
|
|
|
|
/// <param name="_label"> 事件属性(可选) </param>
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// umeng打点 - 事件名字
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="_eventSort">事件名字</param>
|
|
|
|
|
|
public void LogEventByUmeng(string _eventSort)
|
|
|
|
|
|
{
|
|
|
|
|
|
#if !NO_SDK
|
|
|
|
|
|
Debug.Log("Touka LogEventByUmeng _eventSort : " + _eventSort);
|
|
|
|
|
|
|
|
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
|
|
return;
|
|
|
|
|
|
#endif
|
|
|
|
|
|
Umeng.Analytics.Event(_eventSort);
|
|
|
|
|
|
#endif
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// umeng 打点 - 事件名字 + 一个事件属性(key:value)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="_eventSort">事件名字</param>
|
|
|
|
|
|
/// <param name="_key">属性key</param>
|
|
|
|
|
|
/// <param name="_value">属性value</param>
|
|
|
|
|
|
public void LogEventByUmeng(string _eventSort, string _key, string _value)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!string.IsNullOrEmpty(_eventSort) && !string.IsNullOrEmpty(_key) && !string.IsNullOrEmpty(_value))
|
|
|
|
|
|
{
|
|
|
|
|
|
LogEventByUmeng(_eventSort, new Dictionary<string, string>() { { _key, _value } });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// umeng 打点 - 事件名字 + 两个事件属性(key:value)
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="_eventSort">事件名字</param>
|
|
|
|
|
|
/// <param name="_key01"> 属性1-key </param>
|
|
|
|
|
|
/// <param name="_value01"> 属性1-value </param>
|
|
|
|
|
|
/// <param name="_key02"> 属性2-key </param>
|
|
|
|
|
|
/// <param name="_value02"> 属性2-value </param>
|
|
|
|
|
|
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<string, string>() { { _key01, _value01 }, { _key02, _value02 } });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// umeng 打点 - 事件名字 + 事件属性字典
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="_eventSort"> 事件名字 </param>
|
|
|
|
|
|
/// <param name="_eventDic"> 事件属性字典 </param>
|
|
|
|
|
|
public void LogEventByUmeng(string _eventSort, Dictionary<string, string> _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
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Umeng 打点广告按钮展示
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="_adShow"></param>
|
|
|
|
|
|
public void LogEventByUmengAdShow(string _adShow)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (!string.IsNullOrEmpty(_adShow))
|
|
|
|
|
|
{
|
|
|
|
|
|
LogEventByUmeng(StaticStringsEvent.Event_Sort_TKInner_ad_button_show, new System.Collections.Generic.Dictionary<string, string>() { { StaticStringsEvent.Event_Type_TKInner_ad_position, _adShow } });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public enum ToukaLogType
|
|
|
|
|
|
{
|
|
|
|
|
|
GA = 1,
|
|
|
|
|
|
Tenjin = 1 << 6,
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|