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

448 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

namespace Guru
{
using UnityEngine;
using com.adjust.sdk;
using System;
using System.Threading.Tasks;
public class AdjustService
{
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
{
get
{
if(string.IsNullOrEmpty(_googleAdId)) FetchGoogleAdIdAsync();
return _googleAdId; // Google AdId
}
}
public string IDFA => Adjust.getIdfa();
public string IDFV => Adjust.getIdfv();
private string _adjustId = "";
public string AdjustId
{
get
{
if (string.IsNullOrEmpty(_adjustId)) _adjustId = Adjust.getAdid();
return _adjustId; // Adjust AdId;
}
}
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;
}
}
#region 启动服务
/// <summary>
/// Adjust启动服务
/// </summary>
/// <param name="appToken"></param>
/// <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)
{
if (string.IsNullOrEmpty(appToken))
{
LogE(LOG_TAG, "Adjust没有设置token无法进行初始化");
return;
}
_onInitComplete = onInitComplete;
_onGetGoogleAdidHandler = onGetGoogleAdIdCallback;
InstallEvent(firebaseId, deviceId); // 注入启动参数
AdjustEnvironment environment = GetAdjustEnvironment();
AdjustConfig config = new AdjustConfig(appToken, environment);
config.setPreinstallTrackingEnabled(true); // Adjust Preinstall
config.setLogLevel(GetLogLevel(showLogs));
config.setDelayStart(delayTime);
#if UNITY_ANDROID
if (!string.IsNullOrEmpty(fbAppId)) config.setFbAppId(fbAppId); // 注入 MIR ID
#endif
// Deeplink Callback
if(onDeeplinkCallback != null)
config.setDeferredDeeplinkDelegate(onDeeplinkCallback);
/*
#if UNITY_EDITOR || DEBUG
config.setSessionSuccessDelegate(OnSessionSuccessCallback); // SessionSuccess
config.setSessionFailureDelegate(OnSessionFailureCallback); // SessionFailed
config.setLogDelegate(log => LogI(LOG_TAG, log));
config.setEventSuccessDelegate(OnEventSuccessCallback);
config.setEventFailureDelegate(OnEventFailureCallback);
config.setAttributionChangedDelegate(OnAttributionChangedCallback);
#endif
*/
// SetupInstance(); // 初始化场景示例
Adjust.start(config); // 启动服务
// 异步加载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 =>
{
if (!string.IsNullOrEmpty(gid))
{
_googleAdId = gid; // 获取Google AD ID
_onGetGoogleAdidHandler?.Invoke(_googleAdId); // 返回 GoogleAdid
}
});
}
/// <summary>
/// 确保 Adjust 实例在场景中
/// </summary>
private void SetupInstance()
{
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;
}
}
#endregion
#region 关键属性上报
/// <summary>
/// 安装事件上报
/// 该事件只有第一次上报有效
/// pseudoId 为空时不上报
/// deviceId 为空时也不上报 (一般不会为空)
/// </summary>
/// <param name="pseudoId"></param>
/// <param name="deviceId"></param>
private static void InstallEvent(string pseudoId, string deviceId)
{
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}");
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)
{
LogI(LOG_TAG, "Attribution changed!");
if (attributionData.trackerName != null)
{
LogI(LOG_TAG, "Tracker name: " + attributionData.trackerName);
}
if (attributionData.trackerToken != null)
{
LogI(LOG_TAG, "Tracker token: " + attributionData.trackerToken);
}
if (attributionData.network != null)
{
LogI(LOG_TAG, "Network: " + attributionData.network);
}
if (attributionData.campaign != null)
{
LogI(LOG_TAG, "Campaign: " + attributionData.campaign);
}
if (attributionData.adgroup != null)
{
LogI(LOG_TAG, "Adgroup: " + attributionData.adgroup);
}
if (attributionData.creative != null)
{
LogI(LOG_TAG, "Creative: " + attributionData.creative);
}
if (attributionData.clickLabel != null)
{
LogI(LOG_TAG , "Click label: " + attributionData.clickLabel);
}
if (attributionData.adid != null)
{
LogI(LOG_TAG, "ADID: " + attributionData.adid);
}
}
private void OnEventSuccessCallback(AdjustEventSuccess eventSuccessData)
{
LogI(LOG_TAG, "Event tracked successfully!");
if (eventSuccessData.Message != null)
{
LogI(LOG_TAG, "Message: " + eventSuccessData.Message);
}
if (eventSuccessData.Timestamp != null)
{
LogI(LOG_TAG, "Timestamp: " + eventSuccessData.Timestamp);
}
if (eventSuccessData.Adid != null)
{
LogI(LOG_TAG, "Adid: " + eventSuccessData.Adid);
}
if (eventSuccessData.EventToken != null)
{
LogI(LOG_TAG, "EventToken: " + eventSuccessData.EventToken);
}
if (eventSuccessData.CallbackId != null)
{
LogI(LOG_TAG, "CallbackId: " + eventSuccessData.CallbackId);
}
if (eventSuccessData.JsonResponse != null)
{
LogI(LOG_TAG, "JsonResponse: " + eventSuccessData.GetJsonResponse());
}
}
private void OnEventFailureCallback(AdjustEventFailure eventFailureData)
{
LogI(LOG_TAG, "Event tracking failed!");
if (eventFailureData.Message != null)
{
LogI(LOG_TAG, "Message: " + eventFailureData.Message);
}
if (eventFailureData.Timestamp != null)
{
LogI(LOG_TAG, "Timestamp: " + eventFailureData.Timestamp);
}
if (eventFailureData.Adid != null)
{
LogI(LOG_TAG, "Adid: " + eventFailureData.Adid);
}
if (eventFailureData.EventToken != null)
{
LogI(LOG_TAG, "EventToken: " + eventFailureData.EventToken);
}
if (eventFailureData.CallbackId != null)
{
LogI(LOG_TAG, "CallbackId: " + eventFailureData.CallbackId);
}
if (eventFailureData.JsonResponse != null)
{
LogI(LOG_TAG, "JsonResponse: " + eventFailureData.GetJsonResponse());
}
LogI(LOG_TAG, "WillRetry: " + eventFailureData.WillRetry.ToString());
}
private void OnSessionFailureCallback(AdjustSessionFailure sessionFailureData)
{
LogE(LOG_TAG,"Session tracking failed!");
if (sessionFailureData.Message != null)
{
LogI(LOG_TAG,"Message: " + sessionFailureData.Message);
}
if (sessionFailureData.Timestamp != null)
{
LogI(LOG_TAG,"Timestamp: " + sessionFailureData.Timestamp);
}
if (sessionFailureData.Adid != null)
{
LogI(LOG_TAG,"Adid: " + sessionFailureData.Adid);
}
if (sessionFailureData.JsonResponse != null)
{
LogI(LOG_TAG,"JsonResponse: " + sessionFailureData.GetJsonResponse());
}
LogI(LOG_TAG,"WillRetry: " + sessionFailureData.WillRetry.ToString());
}
*/
#endregion
#region IAP收入上报
/// <summary>
/// IAP支付事件上报
/// </summary>
/// <param name="revenue"></param>
/// <param name="productID"></param>
public void TrackIAPPurchase(double revenue, string productID)
{
string tokenID = Analytics.GetAdjustEventToken(K_IAP_PURCHASE);
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);
adjustEvent.AddEventParameter("product_id", productID);
adjustEvent.AddEventParameter("value", $"{revenue}");
Adjust.trackEvent(adjustEvent);
}
/// <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)
{
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);
Adjust.trackAdRevenue(adRevenue);
}
#endregion
#region 工具接口
private static AdjustEnvironment GetAdjustEnvironment()
{
#if UNITY_EDITOR || DEBUG
return AdjustEnvironment.Sandbox;
#else
return AdjustEnvironment.Production;
#endif
}
private static AdjustLogLevel GetLogLevel(bool showLogs)
{
#if UNITY_EDITOR || DEBUG
return AdjustLogLevel.Verbose;
#endif
return showLogs? AdjustLogLevel.Verbose : AdjustLogLevel.Suppress;
}
private static void LogI(string tag, object content)
{
Debug.Log($"{tag} {content}");
}
private static void LogE(string tag, object content)
{
Debug.LogError($"{tag} {content}");
}
#endregion
}
}