SDK_UnityMoney/Assets/Script/SDKManager/AdsSDKManager/AdsSDKManager.cs

555 lines
20 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 System.Linq;
using Firebase.RemoteConfig;
using Newtonsoft.Json;
using UnityEngine;
namespace WZ
{
public class AdsSDKManager : D_MonoSingleton<AdsSDKManager>
{
private List<IAdService> _adNetworks = new List<IAdService>();
// 是否有激励视频或者插屏广告在展示
public bool otherAdsOnShow = false;
public Action OnSplashAdCloseCallback;
public void InitSDK(Action action)
{
LoggerUtils.Debug("init ads sdk");
OnSplashAdCloseCallback = action;
// 初始化广告平台状态,用于竞价失败后刷新
BidPlatformManager.Instance.InitializePlatformStates(AdConfigParser.GetAdExpireInSec());
InitializeAdNetworks();
}
private void InitializeAdNetworks()
{
_adNetworks.Add(AdmobAdsManager.Instance);
_adNetworks.Add(BigoAdsManager.Instance);
_adNetworks.Add(TpnAdsManager.Instance);
_adNetworks.Add(MaxAdsManager.Instance);
_adNetworks.Add(KwaiAdsManager.Instance);
foreach (var network in _adNetworks)
{
LoggerUtils.Debug("init ads sdk network:"+network.ToString());
network.Initialize();
}
}
public void RefreshAdsData()
{
foreach (var network in _adNetworks)
{
LoggerUtils.Debug("init ads sdk network:"+network.ToString());
network.RefreshAdsData();
network.Initialize();
}
}
#region 广
public bool IsRewardAdReady()
{
return _adNetworks.Any(network => network.IsRewardedAvailable());
}
/// <summary>
/// 展示激励广告
/// </summary>
/// <param name="callback"></param>
public void ShowRewardAd(string _adPos, Action<bool, double> _rewardCallback = null, Action _showFailedCallback = null)
{
LoggerUtils.Debug("ShowRewardAd _adPos:"+_adPos+" ready:"+IsRewardAdReady());
otherAdsOnShow = true;
PlatformType result = GetBestPlatformType(false);
BidPlatformManager.Instance.RecordBidSuccess(result, AdsType.Rewarded);
if (result == PlatformType.AppLovin)
{
MaxAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback);
}
else if (result == PlatformType.Admob)
{
AdmobAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback);
}
else if (result == PlatformType.Bigo)
{
BigoAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback);
}
else if (result == PlatformType.Topon)
{
TpnAdsManager.Instance.DisplayRewarded(_adPos, _rewardCallback, _showFailedCallback);
}
else if (result == PlatformType.Kwai)
{
KwaiAdsManager.Instance.DisplayRewarded(_adPos,_rewardCallback, _showFailedCallback);
}
else
{
_showFailedCallback?.Invoke();
}
AdPlayCountManager.IncrementAdsActionCount(AdsType.Rewarded,AdPlayCountManager.PLAY_COUNT_SUFFIX);
AdjustTrackEvent.Instance.TrackEventName("RV_Show", new Dictionary<string, object>());
CheckAndRefreshExpiredBids(AdsType.Rewarded);
}
/// <summary>
/// 获取激励广告价值
/// </summary>
/// <returns></returns>
public double GetRewardedAdRevenue()
{
if (!IsRewardAdReady())
{
return -1;
}
PlatformType result = GetBestPlatformType(false);
if (result == PlatformType.AppLovin)
{
return MaxAdsManager.Instance.GetRewardedRevenue();
}
else if (result == PlatformType.Admob)
{
return AdmobAdsManager.Instance.GetRewardedRevenue();
}
else if (result == PlatformType.Bigo)
{
return BigoAdsManager.Instance.GetRewardedRevenue();
}
else if (result == PlatformType.Kwai)
{
return KwaiAdsManager.Instance.GetRewardedRevenue();
}
else if (result == PlatformType.Topon)
{
return TpnAdsManager.Instance.GetRewardedRevenue();
}
else
{
return -1;
}
}
#endregion
#region 广
public bool IsInterstitialReady()
{
return _adNetworks.Any(network => network.IsInterstitialAvailable());
}
/// <summary>
/// 展示激励广告
/// </summary>
/// <param name="callback"></param>
public void ShowInterstitialAd(string _adPos, IvType _IvType = IvType.IV1, Action<double> _closeCallback = null)
{
AdsSDKManager.Instance.otherAdsOnShow = true;
PlatformType result = GetBestPlatformType(true);
BidPlatformManager.Instance.RecordBidSuccess(result, AdsType.Interstitial);
if (result == PlatformType.AppLovin)
{
MaxAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback);
}
else if (result == PlatformType.Admob)
{
AdmobAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback);
}
else if (result == PlatformType.Bigo)
{
BigoAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback);
}
else if (result == PlatformType.Topon)
{
TpnAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback);
}
else if (result == PlatformType.Kwai)
{
KwaiAdsManager.Instance.DisplayInterstitial(_adPos, _IvType, _closeCallback);
}
else
{
_closeCallback?.Invoke(0);
}
AdPlayCountManager.IncrementAdsActionCount(AdsType.Interstitial,AdPlayCountManager.PLAY_COUNT_SUFFIX);
AdjustTrackEvent.Instance.TrackEventName("IV_Show", new Dictionary<string, object>());
// 刷新其他类型广告
CheckAndRefreshExpiredBids(AdsType.Interstitial);
}
/// <summary>
/// 获取插屏广告价值
/// </summary>
/// <returns></returns>
public double GetInterstitialAdRevenue()
{
if (!IsInterstitialReady())
{
return -1;
}
PlatformType result = GetBestPlatformType(true);
if (result == PlatformType.AppLovin)
{
return MaxAdsManager.Instance.GetInterstitialRevenue();
}
else if (result == PlatformType.Admob)
{
return AdmobAdsManager.Instance.GetInterstitialRevenue();
}
else if (result == PlatformType.Bigo)
{
return BigoAdsManager.Instance.GetInterstitialRevenue();
}
else if (result == PlatformType.Topon)
{
return TpnAdsManager.Instance.GetInterstitialRevenue();
}
else if (result == PlatformType.Kwai)
{
return KwaiAdsManager.Instance.GetInterstitialRevenue();
}
else
{
return -1;
}
}
#endregion
#region 广
public bool IsBannerAdReady(BannerType bannerType)
{
return AdmobAdsManager.Instance.IsBannerAvailable(bannerType);
}
public void ShowBanner(BannerType bannerType,BannerAlignType bannerAlignType)
{
AdmobAdsManager.Instance.DisplayBanner(bannerType,bannerAlignType);
AdPlayCountManager.IncrementAdsActionCount(AdsType.Banner,AdPlayCountManager.PLAY_COUNT_SUFFIX);
AdjustTrackEvent.Instance.TrackEventName("Banner_Show", new Dictionary<string, object>());
}
public void HideBanner(BannerType bannerType)
{
AdmobAdsManager.Instance.HideBanner(bannerType);
}
#endregion
#region 广
public bool IsNativeAdReady(string adUnitId)
{
return AdmobAdsManager.Instance.IsNativeAvailable(adUnitId);
}
public void ShowNativeAd(string _adPos, string adUnitId, NativeAdPosition position)
{
AdmobAdsManager.Instance.DisplayNative(_adPos, adUnitId, position);
AdjustTrackEvent.Instance.TrackEventName("NA_Show", new Dictionary<string, object>());
AdPlayCountManager.IncrementAdsActionCount(AdsType.Native,AdPlayCountManager.PLAY_COUNT_SUFFIX);
}
public void RemoveNativeAd(string adUnitId)
{
AdmobAdsManager.Instance.RemoveNative(adUnitId);
}
public double GetNativeAdRevenue(string adUnitId)
{
if (!IsNativeAdReady(adUnitId))
{
return -1;
}
return AdmobAdsManager.Instance.GetNativeRevenue(adUnitId);
}
#endregion
#region 广
public bool IsSplashAvailable()
{
return AdmobAdsManager.Instance.IsSplashAvailable();
}
public void ShowSplashAd()
{
AdjustTrackEvent.Instance.TrackEventName("SP_Show", new Dictionary<string, object>());
AdPlayCountManager.IncrementAdsActionCount(AdsType.Splash,AdPlayCountManager.PLAY_COUNT_SUFFIX);
AdmobAdsManager.Instance.DisplaySplash();
}
public void LoadSplashAd()
{
AdmobAdsManager.Instance.LoadSplash();
}
#endregion
private PlatformType GetBestPlatformType(bool isInterstitial)
{
if (isInterstitial)
{
AdPriceInfo priceInfo = new AdPriceInfo(
maxPrice: MaxAdsManager.Instance.GetInterstitialRevenue(),
admobPrice: AdmobAdsManager.Instance.GetInterstitialRevenue(),
bigoPrice: BigoAdsManager.Instance.GetInterstitialRevenue(),
kwaiPrice: KwaiAdsManager.Instance.GetInterstitialRevenue(),
toponAdUnitId: TpnAdsManager.Instance._topon_interstitial_units
);
return AdsBidResult.GetPlatformType(priceInfo);
}
else
{
AdPriceInfo priceInfo = new AdPriceInfo(
maxPrice: MaxAdsManager.Instance.GetRewardedRevenue(),
admobPrice: AdmobAdsManager.Instance.GetRewardedRevenue(),
bigoPrice: BigoAdsManager.Instance.GetRewardedRevenue(),
kwaiPrice: KwaiAdsManager.Instance.GetRewardedRevenue(),
toponAdUnitId: TpnAdsManager.Instance._topon_rewarded_units
);
return AdsBidResult.GetPlatformType(priceInfo);
}
}
/// <summary>
/// 广告比价类型
/// </summary>
/// <returns></returns>
public AdsType GetAdBidType()
{
var adsType = AdsBidResult.GetAdsType(TpnAdsManager.Instance._topon_rewarded_units, TpnAdsManager.Instance._topon_interstitial_units, GetRewardedAdRevenue(), GetInterstitialAdRevenue(), RushSDKManager.Instance.GetFullNativeRevenue());
LoggerUtils.Debug($"[SDK] AdBidType: {adsType} ");
return adsType;
}
#region IvRules
public bool IvRulesShow(IvType ivadType, bool isShow = true)
{
//1.获取远程配置
string json = FireBaseRemoteConfigManager.Instance.GetRemoteConfigString("IV_RULES");
if (string.IsNullOrEmpty(json))
{
LoggerUtils.Debug("[SDK] 获取远程配置IV_RULES是空 没有限制");
return true;
}
//2.解析配置
var dates = JsonConvert.DeserializeObject<IvRulesData[]>(json);
if (dates == null && dates.Length == 0)
{
LoggerUtils.Debug("[SDK] 获取远程配置信息是空");
return true;
}
//3.获取IVADType对应的配置
IvRulesData ivRulesData = null;
foreach (var data in dates)
{
if (data.type == (int)ivadType)
{
ivRulesData = data;
}
}
if (ivRulesData == null)
{
LoggerUtils.Debug("[SDK] 远程配置没有配置对应的IvType");
return true;
}
//4.判断skip(次安装跳过几次触发不展示广告)
int skipLevel = ivRulesData.skipLevel;
int currentSkipLevel = PlayerPrefsUtils.GetPlayerPrefsInt($"{IvRulesKey.KEY_SKIPLEVEL}_{ivadType.ToString()}", 0);
LoggerUtils.Debug($"[SDK] {ivadType.ToString()} 前N次不展示插屏, 本地次数是{currentSkipLevel + 1} 远程参数是{skipLevel}");
if (currentSkipLevel < skipLevel)
{
if (isShow)
{
PlayerPrefsUtils.SavePlayerPrefsInt($"{IvRulesKey.KEY_SKIPLEVEL}_{ivadType.ToString()}", currentSkipLevel + 1);
}
return false;
}
//5.判断overLevel(每跳过几次触发) 第一次会展示 之后每展示一次间隔+1
int overLevel = ivRulesData.overLevel;
int currentOverLevel = IvRulesConst.OverLevels.ContainsKey(ivadType.ToString()) ? IvRulesConst.OverLevels[ivadType.ToString()] : 0;
LoggerUtils.Debug($"[SDK] {ivadType.ToString()} 当前间隔次数: 本地次数是{currentOverLevel + 1} 远程参数是{overLevel}");
if (currentOverLevel != 0)
{
if (isShow)
{
if (currentOverLevel >= overLevel)
{
IvRulesConst.OverLevels[ivadType.ToString()] = 0;
}
else
{
IvRulesConst.OverLevels[ivadType.ToString()] += 1;
}
}
return false;
}
//6.判断interval(广告时间间隔)
int interval = ivRulesData.interval;
long currentInterval = IvRulesConst.Intervals.ContainsKey(ivadType.ToString()) ? IvRulesConst.Intervals[ivadType.ToString()] : 0;
long localTimestamp = TimeUtils.GetLocalTimestamp();
LoggerUtils.Debug($"[SDK] {ivadType.ToString()} 远程参数是: {interval} CanShowFlag: {localTimestamp > (currentInterval + (interval * 1000L))}");
if (localTimestamp < currentInterval + (interval * 1000L))
{
return false;
}
return true;
}
/// <summary>
/// 看激励广告之后调用
/// </summary>
public void ClearIvRules()
{
var localTimestamp = TimeUtils.GetLocalTimestamp();
foreach (var key in IvRulesConst.Intervals.Keys.ToList())
{
IvRulesConst.Intervals[key] = localTimestamp;
}
}
#endregion
#region
private void CheckAndRefreshExpiredBids(AdsType _adsType)
{
Dictionary<PlatformType, List<AdsType>> expiredBids = BidPlatformManager.Instance.GetExpiredBids();
foreach (var kvp in expiredBids)
{
PlatformType platformName = kvp.Key;
foreach (AdsType adType in kvp.Value)
{
if (_adsType == adType)
{
LoggerUtils.Debug($"{platformName} 平台 {adType} 广告竞价已过期,重新加载广告");
RefreshPlatformAds(platformName, adType);
}
}
}
}
private void RefreshPlatformAds(PlatformType platformName, AdsType adType)
{
switch (platformName)
{
case PlatformType.Admob:
RefreshAdmobAds(adType);
break;
case PlatformType.Topon:
RefreshTopOnAds(adType);
break;
case PlatformType.AppLovin:
RefreshMaxAds(adType);
break;
case PlatformType.Bigo:
RefreshBigoAds(adType);
break;
case PlatformType.Kwai:
RefreshKwaiAds(adType);
break;
default:
break;
}
}
private void RefreshAdmobAds(AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
AdmobAdsManager.Instance.LoadRewarded();
break;
case AdsType.Interstitial:
AdmobAdsManager.Instance.LoadInterstitial();
break;
case AdsType.Banner:
AdmobAdsManager.Instance.LoadBanner();
break;
case AdsType.Native:
AdmobAdsManager.Instance.LoadNative();
break;
case AdsType.Splash:
AdmobAdsManager.Instance.LoadSplash();
break;
default:
break;
}
}
// 刷新TopOn广告
private void RefreshTopOnAds(AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
TpnAdsManager.Instance.LoadRewarded();
break;
case AdsType.Interstitial:
TpnAdsManager.Instance.LoadInterstitial();
break;
default:
break;
}
}
// 刷新Max广告
private void RefreshMaxAds(AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
MaxAdsManager.Instance.LoadRewarded();
break;
case AdsType.Interstitial:
MaxAdsManager.Instance.LoadInterstitial();
break;
default:
break;
}
}
// 刷新Bigo广告
private void RefreshBigoAds(AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
BigoAdsManager.Instance.LoadRewarded();
break;
case AdsType.Interstitial:
BigoAdsManager.Instance.LoadInterstitial();
break;
default:
break;
}
}
private void RefreshKwaiAds(AdsType adType)
{
switch (adType)
{
case AdsType.Rewarded:
KwaiAdsManager.Instance.LoadRewarded();
break;
case AdsType.Interstitial:
KwaiAdsManager.Instance.LoadInterstitial();
break;
default:
break;
}
}
#endregion
}
}