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 { private List _adNetworks = new List(); // 是否有激励视频或者插屏广告在展示 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(TpnAdsManager.Instance); _adNetworks.Add(AdmobAdsManager.Instance); _adNetworks.Add(BigoAdsManager.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()); } /// /// 展示激励广告 /// /// public void ShowRewardAd(string _adPos, Action _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()); CheckAndRefreshExpiredBids(AdsType.Rewarded); } /// /// 获取激励广告价值 /// /// 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()); } /// /// 展示激励广告 /// /// public void ShowInterstitialAd(string _adPos, IvType _IvType = IvType.IV1, Action _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()); // 刷新其他类型广告 CheckAndRefreshExpiredBids(AdsType.Interstitial); } /// /// 获取插屏广告价值 /// /// 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()); } 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()); 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()); 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); } } /// /// 广告比价类型 /// /// 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(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; } /// /// 看激励广告之后调用 /// 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> 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 } }