194 lines
6.8 KiB
C#
194 lines
6.8 KiB
C#
using System.Collections.Generic;
|
|
using GoogleMobileAds.Api;
|
|
using System;
|
|
|
|
namespace WZ
|
|
{
|
|
public class AdmobBannerAdManager
|
|
{
|
|
private Dictionary<string, BannerView> _bannerAds = new Dictionary<string, BannerView>();
|
|
private Dictionary<string, int> _retryCounters = new Dictionary<string, int>();
|
|
private Dictionary<string, Action> _loadCallbacks = new Dictionary<string, Action>();
|
|
private Dictionary<string, double> _adRevenueCache = new Dictionary<string, double>();
|
|
|
|
public void InitializeAdUnits(BannerAliignType type, List<string> adUnitIds,
|
|
Action<string,string> onAdLoaded = null,
|
|
Action<string,int, string> onAdLoadFailed = null,
|
|
Action<AdValue> OnAdPaid = null,
|
|
Action<string,string,double> onAdClicked = null)
|
|
{
|
|
foreach (var adUnitId in adUnitIds)
|
|
{
|
|
CreateRewardedAd(type, adUnitId, onAdLoaded, onAdLoadFailed,OnAdPaid, onAdClicked);
|
|
}
|
|
}
|
|
|
|
private void CreateRewardedAd(BannerAliignType type,string adUnitId,
|
|
Action<string,string> onAdLoaded,
|
|
Action<string,int, string> onAdLoadFailed,
|
|
Action<AdValue> OnAdPaid,
|
|
Action<string,string,double> onAdClicked)
|
|
{
|
|
if (_bannerAds.ContainsKey(adUnitId))
|
|
{
|
|
LoggerUtils.Debug($"Bigo banner Ad unit {adUnitId} already exists");
|
|
return;
|
|
}
|
|
|
|
var bannerAds = new BannerView(adUnitId, AdSize.Banner, type == BannerAliignType.BannerCenterBottomAlign ? AdPosition.Bottom : AdPosition.Top);
|
|
_bannerAds[adUnitId] = bannerAds;
|
|
_retryCounters[adUnitId] = 0;
|
|
_adRevenueCache[adUnitId] = 0;
|
|
|
|
bannerAds.OnBannerAdLoaded += () =>
|
|
{
|
|
_retryCounters[adUnitId] = 0;
|
|
_adRevenueCache[adUnitId] = AdmobUtils.GetBannerEcpm(bannerAds);
|
|
LoggerUtils.Debug($"[Admob] banner -[Load]: {adUnitId} successfully");
|
|
onAdLoaded?.Invoke(bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
|
|
AdmobUtils.ParseResponseInfo(bannerAds.GetResponseInfo()));
|
|
AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Banner);
|
|
};
|
|
|
|
bannerAds.OnBannerAdLoadFailed += ((msg) =>
|
|
{
|
|
_retryCounters[adUnitId]++;
|
|
double retryDelay = Math.Pow(2, Math.Min(6, _retryCounters[adUnitId]));
|
|
LoggerUtils.Debug($"[Admob] banner -[Load]: {adUnitId} failed, error message = {msg}");
|
|
|
|
// 延迟重试加载
|
|
_loadCallbacks[adUnitId] = () => LoadAd(adUnitId);
|
|
TimerUtils.Instance.DelayExecute((float)retryDelay, () => _loadCallbacks[adUnitId]?.Invoke());
|
|
onAdLoadFailed?.Invoke(adUnitId, msg.GetCode(), msg.GetMessage());
|
|
});
|
|
|
|
bannerAds.OnAdPaid += ((adValue) =>
|
|
{
|
|
LoggerUtils.Debug($"[Admob] banner -[interaction]: {adUnitId} show");
|
|
AdmobAdsManager.Instance.TrackAdImpression(bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo(),
|
|
adValue,
|
|
AdsType.Banner,
|
|
AdmobUtils.ParseResponseInfo(bannerAds.GetResponseInfo()));
|
|
|
|
OnAdPaid?.Invoke(adValue);
|
|
});
|
|
|
|
bannerAds.OnAdClicked += () =>
|
|
{
|
|
onAdClicked?.Invoke(bannerAds.GetResponseInfo().GetLoadedAdapterResponseInfo().AdSourceName,
|
|
AdmobUtils.ParseResponseInfo(bannerAds.GetResponseInfo()),
|
|
AdmobUtils.GetBannerEcpm(bannerAds));
|
|
};
|
|
LoadAd(adUnitId);
|
|
}
|
|
|
|
public void LoadAd(string adUnitId)
|
|
{
|
|
if (_bannerAds.TryGetValue(adUnitId, out var ad))
|
|
{
|
|
ad.LoadAd(new AdRequest());
|
|
}
|
|
}
|
|
|
|
// 显示价格最高的广告
|
|
public void ShowHighestPayingAd()
|
|
{
|
|
var highestPayingAdUnit = GetHighestPayingAdUnit();
|
|
if (!string.IsNullOrEmpty(highestPayingAdUnit))
|
|
{
|
|
ShowAd(highestPayingAdUnit);
|
|
}
|
|
}
|
|
|
|
public void HideBanner()
|
|
{
|
|
|
|
var highestPayingAdUnit = GetHighestPayingAdUnit();
|
|
if (!string.IsNullOrEmpty(highestPayingAdUnit))
|
|
{
|
|
if (_bannerAds.TryGetValue(highestPayingAdUnit, out var ad))
|
|
{
|
|
ad.Hide();
|
|
}
|
|
}
|
|
}
|
|
// 显示特定广告位的广告
|
|
private void ShowAd(string adUnitId)
|
|
{
|
|
if (_bannerAds.TryGetValue(adUnitId, out var ad))
|
|
{
|
|
ad.Show();
|
|
}
|
|
}
|
|
|
|
// 获取所有可用的广告位
|
|
public List<string> GetAvailableAdUnits()
|
|
{
|
|
var available = new List<string>();
|
|
foreach (var kvp in _bannerAds)
|
|
{
|
|
available.Add(kvp.Key);
|
|
}
|
|
return available;
|
|
}
|
|
|
|
// 获取特定广告位的收益信息
|
|
public double GetAdRevenue(string adUnitId)
|
|
{
|
|
if (_adRevenueCache.TryGetValue(adUnitId, out var revenue))
|
|
{
|
|
return revenue;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// 获取价格最高的广告位ID
|
|
public string GetHighestPayingAdUnit()
|
|
{
|
|
string highestPayingAdUnit = null;
|
|
double highestRevenue = 0;
|
|
|
|
foreach (var kvp in _adRevenueCache)
|
|
{
|
|
var adUnitId = kvp.Key;
|
|
var revenue = kvp.Value;
|
|
|
|
// 确保广告确实已加载并且价格更高
|
|
if (revenue > highestRevenue)
|
|
{
|
|
highestRevenue = revenue;
|
|
highestPayingAdUnit = adUnitId;
|
|
}
|
|
}
|
|
|
|
return highestPayingAdUnit;
|
|
}
|
|
|
|
// 获取价格最高的广告收益信息
|
|
public double GetHighestPayingAdRevenue()
|
|
{
|
|
var highestPayingAdUnit = GetHighestPayingAdUnit();
|
|
if (!string.IsNullOrEmpty(highestPayingAdUnit) &&
|
|
_adRevenueCache.TryGetValue(highestPayingAdUnit, out var revenue))
|
|
{
|
|
return revenue;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// 清理资源
|
|
public void Destroy()
|
|
{
|
|
foreach (var ad in _bannerAds.Values)
|
|
{
|
|
ad.Destroy();
|
|
}
|
|
_bannerAds.Clear();
|
|
_retryCounters.Clear();
|
|
_loadCallbacks.Clear();
|
|
_adRevenueCache.Clear();
|
|
}
|
|
}
|
|
}
|
|
|