Fix TapADN ad lifecycle callbacks

This commit is contained in:
2026-06-04 17:24:54 +08:00
parent d88855e35e
commit 02cb90c1c0
4 changed files with 119 additions and 7 deletions

View File

@@ -5,9 +5,15 @@ using UnityEngine;
public sealed class TapadnAwardVideoPlayer : ADPlayer, IDirichletRewardVideoAutoAdListener
{
private const float RewardCloseSettleDelaySeconds = 0.25f;
private DirichletAdNative _adNative;
private DirichletRewardVideoAd _loadedAd;
private bool _rewardVerified;
private bool _rewardVerifyReceived;
private bool _closePendingRewardVerify;
private bool _showSettled;
private AdTimeHandler _rewardCloseSettleHandler;
public override int MaxLoadAttempts => TapadnAdController.CurrentOptions?.RewardedMaxLoadAttempts ?? base.MaxLoadAttempts;
public override float LoadRetryDelaySeconds => Math.Max(0f, (TapadnAdController.CurrentOptions?.RewardedLoadRetryDelayMs ?? 500) / 1000f);
@@ -72,6 +78,7 @@ public sealed class TapadnAwardVideoPlayer : ADPlayer, IDirichletRewardVideoAuto
_loadedAd = ad;
_loadedAd.Shown += OnManualShown;
_loadedAd.Clicked += OnManualClicked;
_loadedAd.ShowFailed += OnManualShowFailed;
_loadedAd.RewardVerified += OnManualRewardVerify;
_loadedAd.Closed += OnManualClosed;
curState = 2;
@@ -89,6 +96,11 @@ public sealed class TapadnAwardVideoPlayer : ADPlayer, IDirichletRewardVideoAuto
adListener.onClose = onClose;
adListener.onVideoComplete = onVideoComplete;
_rewardVerified = false;
_rewardVerifyReceived = false;
_closePendingRewardVerify = false;
_showSettled = false;
_rewardCloseSettleHandler?.Kill();
_rewardCloseSettleHandler = null;
curState = 0;
if (UseAutoLoad())
@@ -99,13 +111,21 @@ public sealed class TapadnAwardVideoPlayer : ADPlayer, IDirichletRewardVideoAuto
if (_loadedAd == null || !_loadedAd.Show())
{
adListener.OnShowError();
OnError(new DirichletError("show_failed", "ShowRewardVideoAd returned false"));
return;
}
}
public void OnError(DirichletError error)
{
if (_showSettled)
{
return;
}
_showSettled = true;
_rewardCloseSettleHandler?.Kill();
_rewardCloseSettleHandler = null;
curState = 0;
Debug.LogError($"[TapADN] Rewarded show failed. code={error?.Code}, message={error?.Message}");
adListener.OnShowError();
@@ -118,13 +138,30 @@ public sealed class TapadnAwardVideoPlayer : ADPlayer, IDirichletRewardVideoAuto
public void OnAdClose()
{
adListener.OnRewardVerify(_rewardVerified, TapadnAdController.CurrentOptions?.RewardAmount ?? 1, TapadnAdController.CurrentOptions?.RewardName ?? string.Empty);
adListener.OnAdClose();
if (_showSettled)
{
return;
}
if (_rewardVerifyReceived)
{
CompleteRewardedClose();
return;
}
_closePendingRewardVerify = true;
_rewardCloseSettleHandler?.Kill();
_rewardCloseSettleHandler = ADManager.Instance.CreateTimer(RewardCloseSettleDelaySeconds, CompleteRewardedClose);
}
public void OnRewardVerify(DirichletRewardVerificationEventArgs args)
{
_rewardVerifyReceived = true;
_rewardVerified = args != null && args.IsVerified;
if (_closePendingRewardVerify)
{
CompleteRewardedClose();
}
}
public void OnAdClick()
@@ -145,9 +182,14 @@ public sealed class TapadnAwardVideoPlayer : ADPlayer, IDirichletRewardVideoAuto
{
}
private void OnManualShowFailed(DirichletError error)
{
OnError(error);
}
private void OnManualRewardVerify(DirichletRewardVerificationEventArgs args)
{
_rewardVerified = args != null && args.IsVerified;
OnRewardVerify(args);
}
private void OnManualClosed()
@@ -156,4 +198,19 @@ public sealed class TapadnAwardVideoPlayer : ADPlayer, IDirichletRewardVideoAuto
_loadedAd = null;
OnAdClose();
}
private void CompleteRewardedClose()
{
if (_showSettled)
{
return;
}
_showSettled = true;
_closePendingRewardVerify = false;
_rewardCloseSettleHandler?.Kill();
_rewardCloseSettleHandler = null;
adListener.OnRewardVerify(_rewardVerified, TapadnAdController.CurrentOptions?.RewardAmount ?? 1, TapadnAdController.CurrentOptions?.RewardName ?? string.Empty);
adListener.OnAdClose();
}
}