Files
ft/Client/Assets/Scripts/Services/InterstitialAdHandler.cs
2026-06-29 21:18:33 +08:00

146 lines
5.6 KiB
C#

using asap.core;
using GameCore;
using System;
using System.Threading.Tasks;
namespace game
{
public class InterstitialAdHandler
{
private readonly string adUnitId;
private bool isLoadTriggered;
private int retryCount;
private AdvertPopupType currentType = AdvertPopupType.None;
public InterstitialAdHandler(string adUnitId)
{
this.adUnitId = adUnitId;
}
public void RegisterCallbacks()
{
MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnAdLoaded;
MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent += OnAdLoadFailed;
MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnAdDisplayed;
MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent += OnAdDisplayFailed;
MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnAdHidden;
MaxSdkCallbacks.Interstitial.OnAdClickedEvent += OnAdClicked;
MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnAdRevenuePaid;
}
public void UnregisterCallbacks()
{
MaxSdkCallbacks.Interstitial.OnAdLoadedEvent -= OnAdLoaded;
MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent -= OnAdLoadFailed;
MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent -= OnAdDisplayed;
MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent -= OnAdDisplayFailed;
MaxSdkCallbacks.Interstitial.OnAdHiddenEvent -= OnAdHidden;
MaxSdkCallbacks.Interstitial.OnAdClickedEvent -= OnAdClicked;
MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent -= OnAdRevenuePaid;
}
public void TryLoad()
{
if (isLoadTriggered || !CanLoadInterstitial() || MaxSdk.IsInterstitialReady(adUnitId))
return;
isLoadTriggered = true;
AdsEventLogger.LogLoadStart("interstitial", adUnitId, "internal");
AdsEventLogger.SetCrashFlag("interstitial", "load");
MaxSdk.LoadInterstitial(adUnitId);
}
public void Show(AdvertPopupType advertPopupType)
{
if (advertPopupType == AdvertPopupType.None) return;
currentType = advertPopupType;
using (var e = GEvent.GameEvent("ads_interstitial_click"))
{
e.AddContent("ad_unit_id", adUnitId);
e.AddContent("placement", advertPopupType.ToString());
}
if (MaxSdk.IsInterstitialReady(adUnitId))
{
MaxSdk.ShowInterstitial(adUnitId, advertPopupType.ToString());
}
else
{
GContext.Publish(new AdsInterstitialResult() { Type = advertPopupType });
AdsEventLogger.LogNotReady("interstitial", advertPopupType.ToString());
}
}
private bool CanLoadInterstitial()
{
SigninData signinData = GContext.container.Resolve<SigninData>();
return signinData != null && signinData.ShouldLoadSignInInterstitial();
}
private void OnAdLoaded(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
retryCount = 0;
AdsEventLogger.ClearCrashFlag();
AdsEventLogger.LogLoadSuccess("interstitial", adUnitId, adInfo.Placement);
}
private async void OnAdLoadFailed(string adUnitId, MaxSdkBase.ErrorInfo errorInfo)
{
retryCount++;
if (retryCount > 5)
{
AdsEventLogger.ClearCrashFlag();
}
int retryDelay = Math.Min(6, retryCount) * 2000;
UnityEngine.Debug.LogWarning($"[InterstitialAdHandler] Load failed, retry {retryDelay}ms, attempt {retryCount}, {errorInfo}");
AdsEventLogger.LogLoadFail("interstitial", adUnitId, retryCount, errorInfo.Code.ToString(), errorInfo.Message);
await Task.Delay(retryDelay);
MaxSdk.LoadInterstitial(adUnitId);
}
private void OnAdDisplayed(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
AdsEventLogger.ClearCrashFlag();
AdsEventLogger.SetCrashFlag("interstitial", "display");
AdsEventLogger.LogDisplay("interstitial", adUnitId, adInfo.Placement);
}
private void OnAdDisplayFailed(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo)
{
AdsEventLogger.ClearCrashFlag();
AdvertPopupType type = GetAdvertPopupType(adInfo);
GContext.Publish(new AdsInterstitialResult() { Type = type });
AdsEventLogger.LogDisplayFail("interstitial", adUnitId, adInfo.Placement, errorInfo.Code.ToString(), errorInfo.Message);
MaxSdk.LoadInterstitial(adUnitId);
}
private void OnAdHidden(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
AdsEventLogger.ClearCrashFlag();
AdvertPopupType type = GetAdvertPopupType(adInfo);
GContext.Publish(new AdsInterstitialResult() { Type = type });
AdsEventLogger.LogHidden("interstitial", adUnitId, adInfo.Placement);
MaxSdk.LoadInterstitial(adUnitId);
}
private void OnAdClicked(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
AdsEventLogger.LogClick("interstitial", adUnitId, adInfo.Placement);
}
private void OnAdRevenuePaid(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
GEvent.ADRevenueEvent(adUnitId, adInfo);
}
private AdvertPopupType GetAdvertPopupType(MaxSdkBase.AdInfo adInfo)
{
if (adInfo != null && Enum.TryParse(adInfo.Placement, out AdvertPopupType type))
return type;
return currentType;
}
}
}