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 _onInitComplete; private static Action _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 启动服务 /// /// Adjust启动服务 /// /// /// MIR 追踪 AppID /// /// /// 初始化完成的时候会返回 AdjustId /// /// /// public void StartService(string appToken, string fbAppId = "", string firebaseId = "", string deviceId = "", Action onInitComplete = null, Action onDeeplinkCallback = null, Action 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()); } /// /// 异步拉取 Google Ad Id /// private void FetchGoogleAdIdAsync() { Adjust.getGoogleAdId(gid => { if (!string.IsNullOrEmpty(gid)) { _googleAdId = gid; // 获取Google AD ID _onGetGoogleAdidHandler?.Invoke(_googleAdId); // 返回 GoogleAdid } }); } /// /// 确保 Adjust 实例在场景中 /// private void SetupInstance() { var go = UnityEngine.GameObject.Find(nameof(Adjust)); if (go == null) { go = new GameObject(nameof(Adjust)); var ins = go.AddComponent(); ins.startManually = true; ins.launchDeferredDeeplink = true; ins.sendInBackground = true; } } #endregion #region 关键属性上报 /// /// 安装事件上报 /// 该事件只有第一次上报有效 /// pseudoId 为空时不上报 /// deviceId 为空时也不上报 (一般不会为空) /// /// /// 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 事件回调函数 /* /// /// Session 启动后回调 /// 回调中可以获取实际的 AdjustID /// /// 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收入上报 /// /// IAP支付事件上报 /// /// /// 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); } /// /// IAP订阅支付事件上报 /// /// /// 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); } /// /// 广告收入上报 (Adjust 特有的接口) /// /// /// /// /// /// 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 } }