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

451 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.Collections;
public class AdjustService
{
public const string Version = "1.6.1";
public const string AdjustVersion = "4.38.0"; // Adjust SDK Version
public static readonly string LOG_TAG = "Adjust";
public static readonly float DelayTime = 1f; // 延迟启动时间
public const string K_IAP_PURCHASE = "iap_purchase"; // 固定点位事件
public const string K_SUB_PURCHASE = "sub_purchase"; // 固定点位事件
private static Action<string> _onInitComplete;
private static string _adId = "";
public static string AdId
{
get
{
if(string.IsNullOrEmpty(_adId)) FetchGoogleAdId();
return _adId; // Google AdId
}
}
public static string IDFA => Adjust.getIdfa();
private static string _adjustId = "";
public static string AdjustId
{
get
{
if (string.IsNullOrEmpty(_adjustId)) _adjustId = Adjust.getAdid();
return _adjustId; // Adjust AdId;
}
}
private static bool _isReady = false;
public static bool IsReady => _isReady;
#region 启动服务
/// <summary>
/// Adjust启动服务
/// </summary>
/// <param name="appToken"></param>
/// <param name="fbAppId">MIR 追踪 AppID</param>
/// <param name="onInitComplete"></param>
/// <param name="onDeeplinkCallback"></param>
public static void StartService(string appToken, string fbAppId = "", Action<string> onInitComplete = null, Action<string> onDeeplinkCallback = null)
{
if (string.IsNullOrEmpty(appToken))
{
LogE(LOG_TAG, "Adjust没有设置token无法进行初始化");
return;
}
_onInitComplete = onInitComplete;
InstallEvent(IPMConfig.FIREBASE_ID, IPMConfig.IPM_DEVICE_ID); // 注入启动参数
AdjustEnvironment environment = GetAdjustEnvironment();
AdjustConfig config = new AdjustConfig(appToken, environment);
config.setLogLevel(GetAdjustLogLevel());
config.setDelayStart(DelayTime);
config.setPreinstallTrackingEnabled(true); // Adjust Preinstall
config.setSessionSuccessDelegate(OnSessionSuccessCallback); // SessionSuccess
if(onDeeplinkCallback != null)
config.setDeferredDeeplinkDelegate(onDeeplinkCallback);
#if UNITY_ANDROID
if (!string.IsNullOrEmpty(fbAppId)) config.setFbAppId(fbAppId); // 注入 MIR ID
#endif
#if UNITY_EDITOR || DEBUG
config.setLogDelegate(log => LogI(LOG_TAG, log));
config.setEventSuccessDelegate(OnEventSuccessCallback);
config.setEventFailureDelegate(OnEventFailureCallback);
config.setSessionFailureDelegate(OnSessionFailureCallback);
config.setAttributionChangedDelegate(OnAttributionChangedCallback);
#endif
// 检查场景实例
SetupInstance();
Adjust.start(config);
// 异步加载AdId
FetchGoogleAdId();
LogI(LOG_TAG, $"----- Start AdjustService[{Version}] AdjustVer:{AdjustVersion} -----");
}
public static void FetchGoogleAdId()
{
Adjust.getGoogleAdId(gid =>
{
if (!string.IsNullOrEmpty(gid))
{
_adId = gid; // 获取Google AD ID
}
});
}
/// <summary>
/// 确保 Adjust 实例在场景中
/// </summary>
private static 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>
public 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 static void OnSessionSuccessCallback(AdjustSessionSuccess sessionSuccessData)
{
LogI(LOG_TAG,$"{LOG_TAG} --- Session tracked successfully!");
var adid = sessionSuccessData.Adid;
_adjustId = adid;
_isReady = true;
_onInitComplete?.Invoke(adid);
}
private static 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 static 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 static 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 static void OnSessionFailureCallback(AdjustSessionFailure sessionFailureData)
{
LogI(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 static 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 static 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 static 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 关键属性上报
/// <summary>
/// 上报PseudoId
/// </summary>
/// <param name="firebaseId"></param>
public static void ReportPseudoID(string firebaseId)
{
if (!string.IsNullOrEmpty(firebaseId))
{
Adjust.addSessionCallbackParameter("user_pseudo_id", firebaseId); // 关联 user_pseudo_id
}
}
/// <summary>
/// 上报DeviceId
/// </summary>
/// <param name="deviceId"></param>
public static void ReportDeviceId(string deviceId)
{
if (!string.IsNullOrEmpty(deviceId))
{
Adjust.addSessionCallbackParameter("device_id", deviceId); // 关联 user_pseudo_id
}
}
#endregion
#region 工具接口
private static AdjustEnvironment GetAdjustEnvironment()
{
#if UNITY_EDITOR || DEBUG
return AdjustEnvironment.Sandbox;
#else
return AdjustEnvironment.Production;
#endif
}
private static AdjustLogLevel GetAdjustLogLevel()
{
#if UNITY_EDITOR || DEBUG
return AdjustLogLevel.Verbose;
#else
return AdjustLogLevel.Suppress;
#endif
}
public static void LogI(string tag, object conent)
{
Debug.Log($"{tag} {conent}");
}
public static void LogE(string tag, object conent)
{
Debug.LogError($"{tag} {conent}");
}
#endregion
}
}