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 !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,
}
}