diff --git a/Assets/Script/SDKManager/AdjustManager/AdjustManager.cs b/Assets/Script/SDKManager/AdjustManager/AdjustManager.cs index 9e803c1..0e3231c 100644 --- a/Assets/Script/SDKManager/AdjustManager/AdjustManager.cs +++ b/Assets/Script/SDKManager/AdjustManager/AdjustManager.cs @@ -59,6 +59,7 @@ public class AdjustManager : D_MonoSingleton if (!string.IsNullOrEmpty(network)) { RushSDKManager.Instance.OnUserSourceListener?.Invoke(IsOrganic(network), network); + TransferManager.Instance.OnAdjustCallbackReceived(); } } @@ -176,6 +177,7 @@ public class AdjustManager : D_MonoSingleton PlayerPrefsUtils.SavePlayerPrefsString(_adjustAdgroup, adgroup); PlayerPrefsUtils.SavePlayerPrefsString(_adjustCreative, creative); PlayerPrefsUtils.SavePlayerPrefsString(_adjustClickLabel, attribution?.ClickLabel); + TransferManager.Instance.OnAdjustCallbackReceived(); ShuShuEvent.Instance.UserSet(new Dictionary { { "user_ad_network", network ?? "" }, @@ -219,7 +221,7 @@ public class AdjustManager : D_MonoSingleton return PlayerPrefsUtils.GetPlayerPrefsString(_adjustClickLabel); } - private bool IsOrganic(string _network) + public bool IsOrganic(string _network) { if (string.IsNullOrEmpty(_network) || _network.Equals("Organic") || _network.Equals("Untrusted Devices")) { diff --git a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs index 60d4791..87e8db9 100644 --- a/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs +++ b/Assets/Script/SDKManager/AdsSDKManager/AdmobAdsManager/AdmobAdsManager.cs @@ -48,7 +48,6 @@ namespace WZ _nativeAdUnits = config.admob_native_units; _rewardedAdUnits = config.admob_rewarded_units; _splashAdUnits = config.admob_splash_units; - Initialize(); } public void Initialize() diff --git a/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs b/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs index e4624b0..293a62a 100644 --- a/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs +++ b/Assets/Script/SDKManager/AdsSDKManager/TpnAdsManager/TpnAdsManager.cs @@ -32,7 +32,6 @@ namespace WZ _topon_app_key = config.topon_app_key; _topon_interstitial_units = config.topon_interstitial_units.FirstOrDefault(); _topon_rewarded_units = config.topon_rewarded_units.FirstOrDefault(); - Initialize(); } public void Initialize() diff --git a/Assets/Script/SDKManager/TransferManager/TransferData.cs b/Assets/Script/SDKManager/TransferManager/TransferData.cs new file mode 100644 index 0000000..0bbd47c --- /dev/null +++ b/Assets/Script/SDKManager/TransferManager/TransferData.cs @@ -0,0 +1,23 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace WZ +{ + public static class TransferData + { + public static bool HasVpnPermission + { + get => PlayerPrefs.GetInt("vpn_permission",0) == 1; + set => PlayerPrefs.SetInt("vpn_permission", value == true ? 1 : 0); + } + + public static bool HasReqVpnPermission + { + get => PlayerPrefs.GetInt("req_vpn_permission",0) == 1; + set => PlayerPrefs.SetInt("req_vpn_permission", value == true ? 1 : 0); + } + + } + +} diff --git a/Assets/Script/SDKManager/TransferManager/TransferData.cs.meta b/Assets/Script/SDKManager/TransferManager/TransferData.cs.meta new file mode 100644 index 0000000..9b359e2 --- /dev/null +++ b/Assets/Script/SDKManager/TransferManager/TransferData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0da66283b018c441ca81f16b65bae008 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Script/SDKManager/TransferManager/TransferManager.cs b/Assets/Script/SDKManager/TransferManager/TransferManager.cs new file mode 100644 index 0000000..b4ecc23 --- /dev/null +++ b/Assets/Script/SDKManager/TransferManager/TransferManager.cs @@ -0,0 +1,279 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +namespace WZ +{ + + public class TransferManager : D_MonoSingleton + { + private AdInitState currentState = AdInitState.Idle; + private bool isFirebaseActivated = false; + private bool hasReceivedAdjustCallback = false; + private Coroutine waitingCoroutine = null; + public event Action OnAdInitStateChanged; + + // 状态枚举 + public enum AdInitState + { + Idle, // 空闲 + WaitingForAdjustCallback, // 等待Adjust回调 + WaitingForFirebase, // 等待Firebase激活 + CheckingPromotion, // 检查推广状态 + InitializingTransfer, // 初始化Transfer SDK + CheckingVpnPermission, // 检查VPN权限 + RequestingVpnPermission, // 请求VPN权限 + CheckingAdMobAvailability, // 检查AdMob可用性 + InitializingAdMob, // 初始化AdMob + InitializingTopOn, // 初始化TopOn + Completed, // 完成 + Failed // 失败 + } + + public void OnAdjustCallbackReceived() + { + Debug.Log("收到Adjust回调,开始处理广告初始化"); + hasReceivedAdjustCallback = true; + // 开始广告初始化流程 + StartAdInitialization(); + } + + private void StartAdInitialization() + { + if (currentState != AdInitState.WaitingForAdjustCallback) + { + Debug.LogWarning($"广告初始化状态不正确,当前状态: {currentState}"); + return; + } + + // 检查Firebase状态 + if (isFirebaseActivated) + { + Debug.Log("Firebase已激活,直接执行广告初始化"); + ExecuteAdInitialization(); + } + else + { + Debug.Log("Firebase未激活,等待激活后再执行广告初始化"); + ChangeState(AdInitState.WaitingForFirebase, "等待Firebase激活"); + + // 开始等待Firebase激活 + waitingCoroutine = StartCoroutine(WaitForFirebaseAndInitialize()); + } + } + + /// + /// 等待Firebase激活并初始化广告 + /// + private IEnumerator WaitForFirebaseAndInitialize() + { + Debug.Log("开始等待Firebase激活..."); + + float startTime = Time.time; + const float timeout = 360f; + + // 等待Firebase激活 + while (!isFirebaseActivated && Time.time - startTime < timeout) + { + yield return new WaitForSeconds(0.5f); + + // 检查Firebase状态(可能是外部初始化的) + CheckFirebaseStatus(); + + if (Time.time - startTime >= 5f && !isFirebaseActivated) + { + Debug.Log($"已等待{Time.time - startTime:F1}秒,Firebase仍未激活"); + } + } + + if (isFirebaseActivated) + { + Debug.Log($"Firebase激活成功,等待时间: {Time.time - startTime:F1}秒"); + ExecuteAdInitialization(); + } + else + { + Debug.LogWarning($"Firebase激活等待超时({timeout}秒),继续初始化广告"); + ExecuteAdInitialization(); + } + + waitingCoroutine = null; + } + + /// + /// 执行广告初始化流程 + /// + private void ExecuteAdInitialization() + { + Debug.Log("开始执行广告初始化流程"); + StartCoroutine(AdInitializationCoroutine()); + } + + /// + /// 广告初始化协程 + /// + private IEnumerator AdInitializationCoroutine() + { + // 状态1: 检查是否为推广用户 + ChangeState(AdInitState.CheckingPromotion, "检查推广用户状态"); + + if (!IsPromoteUser()) + { + Debug.Log("非推广用户,直接初始化TopOn广告"); + ChangeState(AdInitState.InitializingTopOn, "初始化TopOn广告"); + InitializeTopOnAds(); + yield break; + } + + Debug.Log("推广用户,开始VPN和AdMob检查流程"); + + // 状态2: 初始化Transfer SDK + ChangeState(AdInitState.InitializingTransfer, "初始化Transfer SDK"); + TransferAndroidClass.Init(); + + // 状态3: 检查VPN权限 + ChangeState(AdInitState.CheckingVpnPermission, "检查VPN权限"); + if (TransferData.HasVpnPermission) + { + Debug.Log("已有VPN权限,检查AdMob可用性"); + yield return StartCoroutine(CheckAndInitializeAdsWithVpnPermission()); + } + else + { + Debug.Log("无VPN权限,检查是否已请求过权限"); + yield return StartCoroutine(HandleNoVpnPermission()); + } + } + + /// + /// 已有VPN权限时的广告初始化流程 + /// + private IEnumerator CheckAndInitializeAdsWithVpnPermission() + { + ChangeState(AdInitState.CheckingAdMobAvailability, "检查AdMob可用性"); + + bool checkCompleted = false; + bool isAdMobAllowed = false; + string message = ""; + + TransferAndroidClass.IsAllowAdMob((res, msg) => + { + isAdMobAllowed = res; + message = msg; + checkCompleted = true; + }); + + // 等待检查完成 + yield return new WaitUntil(() => checkCompleted); + + if (isAdMobAllowed) + { + Debug.Log($"AdMob可用: {message},初始化AdMob广告"); + ChangeState(AdInitState.InitializingAdMob, "初始化AdMob广告"); + InitializeAdMobAds(); + } + else + { + Debug.Log($"AdMob不可用: {message},初始化TopOn广告"); + ChangeState(AdInitState.InitializingTopOn, "初始化TopOn广告"); + InitializeTopOnAds(); + } + } + + /// + /// 处理无VPN权限的情况 + /// + private IEnumerator HandleNoVpnPermission() + { + // 已请求过VPN权限但用户拒绝 + if (TransferData.HasReqVpnPermission) + { + Debug.Log("已请求过VPN权限但用户拒绝,初始化TopOn广告"); + ChangeState(AdInitState.InitializingTopOn, "初始化TopOn广告"); + InitializeTopOnAds(); + yield break; + } + + // 首次请求VPN权限 + Debug.Log("首次请求VPN权限,弹出引导"); + ChangeState(AdInitState.RequestingVpnPermission, "请求VPN权限"); + + bool permissionRequestCompleted = false; + bool permissionGranted = false; + + TransferAndroidClass.RequestVpnPermission((res, msg) => + { + TransferData.HasReqVpnPermission = true; + permissionGranted = res; + permissionRequestCompleted = true; + + Debug.Log($"VPN权限请求结果: {res}, 消息: {msg}"); + }); + + // 等待权限请求完成 + yield return new WaitUntil(() => permissionRequestCompleted); + + if (permissionGranted) + { + Debug.Log("VPN权限已授予,更新权限状态并检查AdMob"); + TransferData.HasVpnPermission = true; + yield return StartCoroutine(CheckAndInitializeAdsWithVpnPermission()); + } + else + { + Debug.Log("VPN权限被拒绝,初始化TopOn广告"); + ChangeState(AdInitState.InitializingTopOn, "初始化TopOn广告"); + InitializeTopOnAds(); + } + } + + + private void InitializeAdMobAds() + { + AdmobAdsManager.Instance.Initialize(); + } + + private void InitializeTopOnAds() + { + TpnAdsManager.Instance.Initialize(); + } + + private void ChangeState(AdInitState newState, string message) + { + var oldState = currentState; + currentState = newState; + + Debug.Log($"广告初始化状态: {oldState} -> {newState} ({message})"); + } + + private void CheckFirebaseStatus() + { + if(FireBaseRemoteConfigManager.Instance.IsInitialized) + { + Debug.Log("Firebase激活完成事件收到"); + isFirebaseActivated = true; + + // 如果正在等待Firebase,继续广告初始化 + if (currentState == AdInitState.WaitingForFirebase && waitingCoroutine != null) + { + // 停止等待协程,直接继续 + if (waitingCoroutine != null) + { + StopCoroutine(waitingCoroutine); + waitingCoroutine = null; + } + + Debug.Log("从Firebase等待状态恢复,继续广告初始化"); + ExecuteAdInitialization(); + } + } + } + + public bool IsPromoteUser() + { + return !AdjustManager.Instance.IsOrganic(AdjustNetwork.GetNetwork()); + } + } +} + diff --git a/Assets/Script/SDKManager/TransferManager/TransferManager.cs.meta b/Assets/Script/SDKManager/TransferManager/TransferManager.cs.meta new file mode 100644 index 0000000..d5b0ddf --- /dev/null +++ b/Assets/Script/SDKManager/TransferManager/TransferManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4398ac70ce9f84bd185689fb3be0e898 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: