com.guru.unity.sdk.core/Runtime/GuruAdjust/AdjustService.cs

448 lines
12 KiB
C#
Raw Normal View History

2023-12-26 04:22:19 +00:00
namespace Guru
{
using UnityEngine;
using com.adjust.sdk;
using System;
using System.Threading.Tasks;
public class AdjustService
2023-12-26 04:22:19 +00:00
{
private const string Version = "1.6.1";
private const string AdjustVersion = "4.38.0"; // Adjust SDK Version
private const string LOG_TAG = "[ADJUST]";
private const double delayTime = 1; // 延迟启动时间(s)
private const string K_IAP_PURCHASE = "iap_purchase"; // 固定点位事件
private const string K_SUB_PURCHASE = "sub_purchase"; // 固定点位事件
private static Action<string, string, string> _onInitComplete;
private static Action<string> _onGetGoogleAdidHandler;
private string _googleAdId = "";
public string GoogleAdId // GPS = Google Play Service
2024-01-08 12:32:47 +00:00
{
get
{
if(string.IsNullOrEmpty(_googleAdId)) FetchGoogleAdIdAsync();
return _googleAdId; // Google AdId
2024-01-08 12:32:47 +00:00
}
}
public string IDFA => Adjust.getIdfa();
public string IDFV => Adjust.getIdfv();
private string _adjustId = "";
public string AdjustId
2024-01-08 12:32:47 +00:00
{
get
{
2024-01-10 05:34:45 +00:00
if (string.IsNullOrEmpty(_adjustId)) _adjustId = Adjust.getAdid();
return _adjustId; // Adjust AdId;
2024-01-08 12:32:47 +00:00
}
}
private static bool _isReady = false;
public static bool IsReady => _isReady;
private static AdjustService _instance;
public static AdjustService Instance
{
get
{
if (_instance == null) _instance = new AdjustService();
return _instance;
}
}
2023-12-26 04:22:19 +00:00
#region 启动服务
2024-01-06 05:46:25 +00:00
/// <summary>
/// Adjust启动服务
/// </summary>
2024-01-10 05:34:45 +00:00
/// <param name="appToken"></param>
2024-01-06 05:46:25 +00:00
/// <param name="fbAppId">MIR 追踪 AppID</param>
/// <param name="firebaseId"></param>
/// <param name="deviceId"></param>
/// <param name="onInitComplete">初始化完成的时候会返回 AdjustId </param>
/// <param name="onDeeplinkCallback"></param>
/// <param name="onGetGoogleAdIdCallback"></param>
/// <param name="showLogs"></param>
public void StartService(string appToken, string fbAppId = "", string firebaseId = "", string deviceId = "",
Action<string, string, string> onInitComplete = null,
Action<string> onDeeplinkCallback = null,
Action<string> onGetGoogleAdIdCallback = null,
bool showLogs = false)
2023-12-26 04:22:19 +00:00
{
if (string.IsNullOrEmpty(appToken))
{
LogE(LOG_TAG, "Adjust没有设置token无法进行初始化");
2023-12-26 04:22:19 +00:00
return;
}
2024-01-06 05:46:25 +00:00
_onInitComplete = onInitComplete;
_onGetGoogleAdidHandler = onGetGoogleAdIdCallback;
InstallEvent(firebaseId, deviceId); // 注入启动参数
2023-12-26 04:22:19 +00:00
AdjustEnvironment environment = GetAdjustEnvironment();
AdjustConfig config = new AdjustConfig(appToken, environment);
config.setPreinstallTrackingEnabled(true); // Adjust Preinstall
config.setLogLevel(GetLogLevel(showLogs));
config.setDelayStart(delayTime);
2024-01-06 05:46:25 +00:00
#if UNITY_ANDROID
2024-01-10 05:34:45 +00:00
if (!string.IsNullOrEmpty(fbAppId)) config.setFbAppId(fbAppId); // 注入 MIR ID
2024-01-06 05:46:25 +00:00
#endif
// Deeplink Callback
if(onDeeplinkCallback != null)
config.setDeferredDeeplinkDelegate(onDeeplinkCallback);
/*
2023-12-26 04:22:19 +00:00
#if UNITY_EDITOR || DEBUG
config.setSessionSuccessDelegate(OnSessionSuccessCallback); // SessionSuccess
config.setSessionFailureDelegate(OnSessionFailureCallback); // SessionFailed
config.setLogDelegate(log => LogI(LOG_TAG, log));
2023-12-26 04:22:19 +00:00
config.setEventSuccessDelegate(OnEventSuccessCallback);
config.setEventFailureDelegate(OnEventFailureCallback);
config.setAttributionChangedDelegate(OnAttributionChangedCallback);
#endif
*/
// SetupInstance(); // 初始化场景示例
Adjust.start(config); // 启动服务
2023-12-26 04:22:19 +00:00
2024-01-10 05:34:45 +00:00
// 异步加载AdId
FetchGoogleAdIdAsync();
LogI(LOG_TAG, $"----- Start AdjustService[{Version}] AdjustVer:{AdjustVersion} -----");
DelayedInitComplete(delayTime);
}
private async void DelayedInitComplete(double delaySeconds)
{
await Task.Delay(TimeSpan.FromMilliseconds(delaySeconds * 1000));
_isReady = true;
_onInitComplete?.Invoke(Adjust.getAdid(), Adjust.getIdfv(), Adjust.getIdfa());
}
/// <summary>
/// 异步拉取 Google Ad Id
/// </summary>
private void FetchGoogleAdIdAsync()
{
Adjust.getGoogleAdId(gid =>
2023-12-26 04:22:19 +00:00
{
if (!string.IsNullOrEmpty(gid))
{
_googleAdId = gid; // 获取Google AD ID
_onGetGoogleAdidHandler?.Invoke(_googleAdId); // 返回 GoogleAdid
}
2023-12-26 04:22:19 +00:00
});
}
/// <summary>
/// 确保 Adjust 实例在场景中
/// </summary>
private void SetupInstance()
2023-12-26 04:22:19 +00:00
{
var go = UnityEngine.GameObject.Find(nameof(Adjust));
if (go == null)
{
go = new GameObject(nameof(Adjust));
var ins = go.AddComponent<Adjust>();
ins.startManually = true;
ins.launchDeferredDeeplink = true;
ins.sendInBackground = true;
}
}
2024-01-10 05:34:45 +00:00
2023-12-26 04:22:19 +00:00
#endregion
#region 关键属性上报
/// <summary>
/// 安装事件上报
/// 该事件只有第一次上报有效
/// pseudoId 为空时不上报
/// deviceId 为空时也不上报 (一般不会为空)
/// </summary>
/// <param name="pseudoId"></param>
/// <param name="deviceId"></param>
private static void InstallEvent(string pseudoId, string deviceId)
2023-12-26 04:22:19 +00:00
{
if (string.IsNullOrEmpty(pseudoId))
{
Debug.LogWarning($">> Pseudo ID is Empty, skip install event reporting");
return;
}
if (string.IsNullOrEmpty(deviceId))
{
Debug.LogWarning($">> Device ID is Empty, skip install event reporting");
return;
}
Debug.LogWarning($"{LOG_TAG} --- addSessionCallbackParameter: user_pseudo_id:{pseudoId}, device_id:{deviceId}");
2023-12-26 04:22:19 +00:00
Adjust.addSessionCallbackParameter("user_pseudo_id", pseudoId);
Adjust.addSessionCallbackParameter("device_id", deviceId);
}
#endregion
#region 事件回调函数
/*
/// <summary>
/// Session 启动后回调
/// 回调中可以获取实际的 AdjustID
/// </summary>
/// <param name="sessionSuccessData"></param>
private void OnSessionSuccessCallback(AdjustSessionSuccess sessionSuccessData)
{
var adid = sessionSuccessData.Adid;
LogI(LOG_TAG,$"{LOG_TAG} --- Session tracked successfully! Get Adid: {adid}");
}
private void OnAttributionChangedCallback(AdjustAttribution attributionData)
2023-12-26 04:22:19 +00:00
{
LogI(LOG_TAG, "Attribution changed!");
2023-12-26 04:22:19 +00:00
if (attributionData.trackerName != null)
{
LogI(LOG_TAG, "Tracker name: " + attributionData.trackerName);
2023-12-26 04:22:19 +00:00
}
if (attributionData.trackerToken != null)
{
LogI(LOG_TAG, "Tracker token: " + attributionData.trackerToken);
2023-12-26 04:22:19 +00:00
}
if (attributionData.network != null)
{
LogI(LOG_TAG, "Network: " + attributionData.network);
2023-12-26 04:22:19 +00:00
}
if (attributionData.campaign != null)
{
LogI(LOG_TAG, "Campaign: " + attributionData.campaign);
2023-12-26 04:22:19 +00:00
}
if (attributionData.adgroup != null)
{
LogI(LOG_TAG, "Adgroup: " + attributionData.adgroup);
2023-12-26 04:22:19 +00:00
}
if (attributionData.creative != null)
{
LogI(LOG_TAG, "Creative: " + attributionData.creative);
2023-12-26 04:22:19 +00:00
}
if (attributionData.clickLabel != null)
{
LogI(LOG_TAG , "Click label: " + attributionData.clickLabel);
2023-12-26 04:22:19 +00:00
}
if (attributionData.adid != null)
{
LogI(LOG_TAG, "ADID: " + attributionData.adid);
2023-12-26 04:22:19 +00:00
}
}
private void OnEventSuccessCallback(AdjustEventSuccess eventSuccessData)
2023-12-26 04:22:19 +00:00
{
LogI(LOG_TAG, "Event tracked successfully!");
2023-12-26 04:22:19 +00:00
if (eventSuccessData.Message != null)
{
LogI(LOG_TAG, "Message: " + eventSuccessData.Message);
2023-12-26 04:22:19 +00:00
}
if (eventSuccessData.Timestamp != null)
{
LogI(LOG_TAG, "Timestamp: " + eventSuccessData.Timestamp);
2023-12-26 04:22:19 +00:00
}
if (eventSuccessData.Adid != null)
{
LogI(LOG_TAG, "Adid: " + eventSuccessData.Adid);
2023-12-26 04:22:19 +00:00
}
if (eventSuccessData.EventToken != null)
{
LogI(LOG_TAG, "EventToken: " + eventSuccessData.EventToken);
2023-12-26 04:22:19 +00:00
}
if (eventSuccessData.CallbackId != null)
{
LogI(LOG_TAG, "CallbackId: " + eventSuccessData.CallbackId);
2023-12-26 04:22:19 +00:00
}
if (eventSuccessData.JsonResponse != null)
{
LogI(LOG_TAG, "JsonResponse: " + eventSuccessData.GetJsonResponse());
2023-12-26 04:22:19 +00:00
}
}
private void OnEventFailureCallback(AdjustEventFailure eventFailureData)
2023-12-26 04:22:19 +00:00
{
LogI(LOG_TAG, "Event tracking failed!");
2023-12-26 04:22:19 +00:00
if (eventFailureData.Message != null)
{
LogI(LOG_TAG, "Message: " + eventFailureData.Message);
2023-12-26 04:22:19 +00:00
}
if (eventFailureData.Timestamp != null)
{
LogI(LOG_TAG, "Timestamp: " + eventFailureData.Timestamp);
2023-12-26 04:22:19 +00:00
}
if (eventFailureData.Adid != null)
{
LogI(LOG_TAG, "Adid: " + eventFailureData.Adid);
2023-12-26 04:22:19 +00:00
}
if (eventFailureData.EventToken != null)
{
LogI(LOG_TAG, "EventToken: " + eventFailureData.EventToken);
2023-12-26 04:22:19 +00:00
}
if (eventFailureData.CallbackId != null)
{
LogI(LOG_TAG, "CallbackId: " + eventFailureData.CallbackId);
2023-12-26 04:22:19 +00:00
}
if (eventFailureData.JsonResponse != null)
{
LogI(LOG_TAG, "JsonResponse: " + eventFailureData.GetJsonResponse());
2023-12-26 04:22:19 +00:00
}
LogI(LOG_TAG, "WillRetry: " + eventFailureData.WillRetry.ToString());
2023-12-26 04:22:19 +00:00
}
private void OnSessionFailureCallback(AdjustSessionFailure sessionFailureData)
2023-12-26 04:22:19 +00:00
{
LogE(LOG_TAG,"Session tracking failed!");
2023-12-26 04:22:19 +00:00
if (sessionFailureData.Message != null)
{
LogI(LOG_TAG,"Message: " + sessionFailureData.Message);
2023-12-26 04:22:19 +00:00
}
if (sessionFailureData.Timestamp != null)
{
LogI(LOG_TAG,"Timestamp: " + sessionFailureData.Timestamp);
2023-12-26 04:22:19 +00:00
}
if (sessionFailureData.Adid != null)
{
LogI(LOG_TAG,"Adid: " + sessionFailureData.Adid);
2023-12-26 04:22:19 +00:00
}
if (sessionFailureData.JsonResponse != null)
{
LogI(LOG_TAG,"JsonResponse: " + sessionFailureData.GetJsonResponse());
2023-12-26 04:22:19 +00:00
}
LogI(LOG_TAG,"WillRetry: " + sessionFailureData.WillRetry.ToString());
2023-12-26 04:22:19 +00:00
}
*/
2023-12-26 04:22:19 +00:00
#endregion
#region IAP收入上报
/// <summary>
/// IAP支付事件上报
/// </summary>
/// <param name="revenue"></param>
/// <param name="productID"></param>
public void TrackIAPPurchase(double revenue, string productID)
2023-12-26 04:22:19 +00:00
{
string tokenID = Analytics.GetAdjustEventToken(K_IAP_PURCHASE);
2023-12-26 04:22:19 +00:00
if (string.IsNullOrEmpty(tokenID))
return;
AdjustEvent adjustEvent = new AdjustEvent(tokenID);
adjustEvent.setRevenue(revenue,"USD");
adjustEvent.AddEventParameter("platform", Analytics.IAPPlatform);
adjustEvent.AddEventParameter("product_id", productID);
adjustEvent.AddEventParameter("value", $"{revenue}");
Adjust.trackEvent(adjustEvent);
}
/// <summary>
/// IAP订阅支付事件上报
/// </summary>
/// <param name="revenue"></param>
/// <param name="productID"></param>
public void TrackSubPurchase(double revenue, string productID)
{
string tokenID = Analytics.GetAdjustEventToken(K_SUB_PURCHASE);
if (string.IsNullOrEmpty(tokenID))
return;
AdjustEvent adjustEvent = new AdjustEvent(tokenID);
adjustEvent.setRevenue(revenue,"USD");
adjustEvent.AddEventParameter("platform", Analytics.IAPPlatform);
2023-12-26 04:22:19 +00:00
adjustEvent.AddEventParameter("product_id", productID);
adjustEvent.AddEventParameter("value", $"{revenue}");
Adjust.trackEvent(adjustEvent);
}
2024-01-10 05:34:45 +00:00
/// <summary>
/// 广告收入上报 (Adjust 特有的接口)
/// </summary>
/// <param name="value"></param>
/// <param name="currency"></param>
/// <param name="adSource"></param>
/// <param name="adUnitId"></param>
/// <param name="adPlacement"></param>
public void TrackADRevenue(double value, string currency, string adSource, string adUnitId, string adPlacement)
2024-01-10 05:34:45 +00:00
{
var adRevenue = new AdjustAdRevenue(AdjustConfig.AdjustAdRevenueSourceAppLovinMAX);
if (string.IsNullOrEmpty(currency)) currency = "USD";
adRevenue.setRevenue(value, currency);
adRevenue.setAdRevenueNetwork(adSource);
adRevenue.setAdRevenueUnit(adUnitId);
adRevenue.setAdRevenuePlacement(adPlacement);
2024-01-10 05:34:45 +00:00
Adjust.trackAdRevenue(adRevenue);
}
2023-12-26 04:22:19 +00:00
#endregion
2024-01-10 05:34:45 +00:00
#region 工具接口
2023-12-26 04:22:19 +00:00
private static AdjustEnvironment GetAdjustEnvironment()
{
#if UNITY_EDITOR || DEBUG
return AdjustEnvironment.Sandbox;
#else
return AdjustEnvironment.Production;
#endif
}
private static AdjustLogLevel GetLogLevel(bool showLogs)
2023-12-26 04:22:19 +00:00
{
#if UNITY_EDITOR || DEBUG
return AdjustLogLevel.Verbose;
#endif
return showLogs? AdjustLogLevel.Verbose : AdjustLogLevel.Suppress;
2023-12-26 04:22:19 +00:00
}
private static void LogI(string tag, object content)
{
Debug.Log($"{tag} {content}");
}
2023-12-26 04:22:19 +00:00
private static void LogE(string tag, object content)
{
Debug.LogError($"{tag} {content}");
}
2024-01-10 05:34:45 +00:00
#endregion
2023-12-26 04:22:19 +00:00
}
}