SDK_UnityMoney/Assets/Script/SDKManager/TransferManager/TransferManager.cs

393 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace WZ
{
public class TransferManager : D_MonoSingleton<TransferManager>
{
private AdInitState currentState = AdInitState.Idle;
public bool isFirebaseActivated = false;
private Coroutine waitingCoroutine = null;
private int admobRetryCount = 0;
private const int MAX_ADMOB_RETRY_COUNT = 5;
private const float ADMOB_RETRY_INTERVAL = 30f;
private Coroutine admobRetryCoroutine = null;
private bool isRetryingAdMob = false;
private bool _afterLoading = false;
private int _level = 0;
// 状态枚举
public enum AdInitState
{
Idle, // 空闲
WaitingForAdjustCallback, // 等待Adjust回调
WaitingForFirebase, // 等待Firebase激活
CheckingPromotion, // 检查推广状态
InitializingTransfer, // 初始化Transfer SDK
CheckingVpnPermission, // 检查VPN权限
RequestingVpnPermission, // 请求VPN权限
CheckingAdMobAvailability, // 检查AdMob可用性
InitializingAdMob, // 初始化AdMob
InitializingTopOn, // 初始化TopOn
Completed, // 完成
Failed, // 失败
RetryingAdMobCheck
}
public void StartAdInitialization(bool afterLoading,int level)
{
LoggerUtils.Debug("收到Adjust回调开始处理广告初始化");
_afterLoading = afterLoading;
_level = level;
ChangeState(AdInitState.WaitingForAdjustCallback, "等待Adjust回调");
// 开始广告初始化流程
StartAdInitialization();
}
private void StartAdInitialization()
{
if (currentState != AdInitState.WaitingForAdjustCallback)
{
LoggerUtils.Warning($"广告初始化状态不正确,当前状态: {currentState}");
return;
}
// 检查Firebase状态
if (isFirebaseActivated)
{
LoggerUtils.Debug("Firebase已激活直接执行广告初始化");
ExecuteAdInitialization();
}
else
{
LoggerUtils.Debug("Firebase未激活等待激活后再执行广告初始化");
ChangeState(AdInitState.WaitingForFirebase, "等待Firebase激活");
// 开始等待Firebase激活
waitingCoroutine = StartCoroutine(WaitForFirebaseAndInitialize());
}
}
/// <summary>
/// 等待Firebase激活并初始化广告
/// </summary>
private IEnumerator WaitForFirebaseAndInitialize()
{
LoggerUtils.Debug("开始等待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)
{
LoggerUtils.Debug($"已等待{Time.time - startTime:F1}秒Firebase仍未激活");
}
}
if (isFirebaseActivated)
{
LoggerUtils.Debug($"Firebase激活成功等待时间: {Time.time - startTime:F1}秒");
ExecuteAdInitialization();
}
else
{
LoggerUtils.Warning($"Firebase激活等待超时{timeout}秒),继续初始化广告");
ExecuteAdInitialization();
}
waitingCoroutine = null;
}
/// <summary>
/// 执行广告初始化流程
/// </summary>
private void ExecuteAdInitialization()
{
LoggerUtils.Debug("开始执行广告初始化流程");
StartCoroutine(AdInitializationCoroutine());
}
/// <summary>
/// 广告初始化协程
/// </summary>
private IEnumerator AdInitializationCoroutine()
{
// 状态1: 检查是否为推广用户
ChangeState(AdInitState.CheckingPromotion, "检查推广用户状态");
if (!AdjustNetwork.Instance.InOrganic())
{
LoggerUtils.Debug("非推广用户直接初始化TopOn广告");
ChangeState(AdInitState.InitializingTopOn, "初始化TopOn广告");
InitializeTopOnAds();
yield break;
}
LoggerUtils.Debug("推广用户开始VPN和AdMob检查流程");
// 状态2: 初始化Transfer SDK
ChangeState(AdInitState.InitializingTransfer, "初始化Transfer SDK");
TransferAndroidClass.Init();
// 状态3: 检查VPN权限
ChangeState(AdInitState.CheckingVpnPermission, "检查VPN权限");
if (TransferData.HasVpnPermission)
{
LoggerUtils.Debug("已有VPN权限检查AdMob可用性");
yield return StartCoroutine(CheckAndInitializeAdsWithVpnPermission());
}
else
{
LoggerUtils.Debug("无VPN权限检查是否已请求过权限");
yield return StartCoroutine(HandleNoVpnPermission());
}
}
public static float checkAdmobStart;
/// <summary>
/// 已有VPN权限时的广告初始化流程
/// </summary>
private IEnumerator CheckAndInitializeAdsWithVpnPermission()
{
ChangeState(AdInitState.CheckingAdMobAvailability, "检查AdMob可用性");
bool checkCompleted = false;
bool isAdMobAllowed = false;
string message = "";
checkAdmobStart = Time.time;
RushSDKManager.Instance.LogEvent("isAllowAdMob_check_start");
TransferAndroidClass.IsAllowAdMob((res, msg) =>
{
isAdMobAllowed = res;
message = msg;
checkCompleted = true;
RushSDKManager.Instance.LogEvent(string.Format("isAllowAdMob_{0}",checkCompleted),new Dictionary<string, object>()
{
{"pass_time",(int)(Time.time-checkAdmobStart)},
{"reason",msg}
});
});
// 等待检查完成
yield return new WaitUntil(() => checkCompleted);
if (isAdMobAllowed)
{
LoggerUtils.Debug($"AdMob可用: {message}初始化AdMob广告");
ChangeState(AdInitState.InitializingAdMob, "初始化AdMob广告");
InitializeAdMobAds();
}
else
{
LoggerUtils.Debug($"AdMob不可用: {message}初始化TopOn广告");
ChangeState(AdInitState.InitializingTopOn, "初始化TopOn广告");
InitializeTopOnAds();
if (TransferData.HasVpnPermission)
{
LoggerUtils.Debug("权限引导流程已完成且AdMob检查失败启动重试机制");
StartAdMobRetry();
}
}
}
/// <summary>
/// 处理无VPN权限的情况
/// </summary>
private IEnumerator HandleNoVpnPermission()
{
// 已请求过VPN权限但用户拒绝
if (TransferData.HasShowedReqVpnPermissionView)
{
LoggerUtils.Debug("已请求过VPN权限但用户拒绝初始化TopOn广告");
ChangeState(AdInitState.InitializingTopOn, "初始化TopOn广告");
InitializeTopOnAds();
yield break;
}
// 首次请求VPN权限
LoggerUtils.Debug("首次请求VPN权限弹出引导");
ChangeState(AdInitState.RequestingVpnPermission, "请求VPN权限");
bool permissionRequestCompleted = false;
bool permissionGranted = false;
var vpnGuide = new VPNGuideManager();
vpnGuide.ShowConnectionRequest(_afterLoading, _level, (res, msg) =>
{
permissionGranted = res;
permissionRequestCompleted = true;
LoggerUtils.Debug($"VPN权限请求结果: {res}, 消息: {msg}");
});
// 等待权限请求完成
yield return new WaitUntil(() => permissionRequestCompleted);
if (permissionGranted)
{
LoggerUtils.Debug("VPN权限已授予更新权限状态并检查AdMob");
TransferData.HasVpnPermission = true;
yield return StartCoroutine(CheckAndInitializeAdsWithVpnPermission());
}
else
{
LoggerUtils.Debug("VPN权限被拒绝初始化TopOn广告");
ChangeState(AdInitState.InitializingTopOn, "初始化TopOn广告");
InitializeTopOnAds();
}
}
private void StartAdMobRetry()
{
if (isRetryingAdMob)
{
LoggerUtils.Debug("AdMob重试已在运行中");
return;
}
if (admobRetryCount >= MAX_ADMOB_RETRY_COUNT)
{
LoggerUtils.Debug($"已达到最大重试次数({MAX_ADMOB_RETRY_COUNT}),停止重试");
return;
}
LoggerUtils.Debug("启动AdMob重试机制");
isRetryingAdMob = true;
admobRetryCoroutine = StartCoroutine(AdMobRetryCoroutine());
}
private IEnumerator AdMobRetryCoroutine()
{
// 第一次立即检查
admobRetryCount = 0;
while (isRetryingAdMob && admobRetryCount < MAX_ADMOB_RETRY_COUNT)
{
LoggerUtils.Debug($"第{admobRetryCount + 1}次AdMob检查");
ChangeState(AdInitState.RetryingAdMobCheck, $"第{admobRetryCount + 1}次检查AdMob");
bool checkCompleted = false;
bool isAdMobAllowed = false;
string message = "";
RushSDKManager.Instance.LogEvent("isAllowAdMob_check_start");
checkAdmobStart = Time.time;
TransferAndroidClass.IsAllowAdMob((res, msg) =>
{
isAdMobAllowed = res;
message = msg;
checkCompleted = true;
RushSDKManager.Instance.LogEvent(string.Format("isAllowAdMob_{0}",checkCompleted),new Dictionary<string, object>()
{
{"pass_time",(int)(Time.time-checkAdmobStart)},
{"reason",msg}
});
});
// 等待检查完成
yield return new WaitUntil(() => checkCompleted);
if (isAdMobAllowed)
{
LoggerUtils.Debug($"第{admobRetryCount + 1}次AdMob检查成功: {message}");
StopAdMobRetry();
InitializeAdMobAds();
break;
}
else
{
LoggerUtils.Debug($"第{admobRetryCount + 1}次AdMob检查失败: {message}");
admobRetryCount++;
// 达到最大重试次数
if (admobRetryCount >= MAX_ADMOB_RETRY_COUNT)
{
LoggerUtils.Debug($"达到最大重试次数({MAX_ADMOB_RETRY_COUNT}),停止重试");
StopAdMobRetry();
break;
}
// 等待30秒后再次尝试
LoggerUtils.Debug($"等待{ADMOB_RETRY_INTERVAL}秒后重试AdMob检查");
yield return new WaitForSeconds(ADMOB_RETRY_INTERVAL);
}
}
}
private void StopAdMobRetry()
{
isRetryingAdMob = false;
if (admobRetryCoroutine != null)
{
StopCoroutine(admobRetryCoroutine);
admobRetryCoroutine = null;
}
}
private void InitializeAdMobAds()
{
StopAdMobRetry();
AdmobAdsManager.Instance.Initialize();
}
private void InitializeTopOnAds()
{
TpnAdsManager.Instance.Initialize();
}
private void ChangeState(AdInitState newState, string message)
{
var oldState = currentState;
currentState = newState;
LoggerUtils.Debug($"广告初始化状态: {oldState} -> {newState} ({message})");
}
private void CheckFirebaseStatus()
{
if(FireBaseRemoteConfigManager.Instance.IsInitialized)
{
LoggerUtils.Debug("Firebase激活完成事件收到");
isFirebaseActivated = true;
// 如果正在等待Firebase继续广告初始化
if (currentState == AdInitState.WaitingForFirebase && waitingCoroutine != null)
{
// 停止等待协程,直接继续
if (waitingCoroutine != null)
{
StopCoroutine(waitingCoroutine);
waitingCoroutine = null;
}
LoggerUtils.Debug("从Firebase等待状态恢复继续广告初始化");
ExecuteAdInitialization();
}
}
}
}
}