using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Net.Security; using Firebase.Analytics; using UnityEngine; namespace WZ { public class MaxAdsManager : D_MonoSingleton, IAdService { public string ClientName => "AppLovin"; public PlatformType Platfrom => PlatformType.AppLovin; private string _max_app_key; private string _max_interstitial_units; private string _max_rewarded_units; private MaxSdkBase.AdInfo _interAdInfo; private MaxSdkBase.AdInfo _rewardAdInfo; private int _rewardRetryAttempt; private int _interRetryAttempt; private float _rvStartLoadTime = 0; private float _ivStartLoadTime = 0; private string _rvPos; private string _ivPos; private Action _rvCloseCallback = null; private Action _ivCloseCallback = null; private Action _rvShowFailedCallback = null; public bool _initialized { get; private set; } = false; public void Initialize() { if (string.IsNullOrEmpty(_max_app_key) || _initialized) return; LoggerUtils.Debug("[Max] init max"); // 关闭反转debug面板 MaxSdk.SetCreativeDebuggerEnabled(false); InitRewardedCallback(); InitInterstitialCallback(); MaxSdkCallbacks.OnSdkInitializedEvent += (MaxSdkBase.SdkConfiguration obj) => { LoggerUtils.Debug("[Max] init max success"); }; MaxSdk.SetVerboseLogging(false); MaxSdk.SetSdkKey(_max_app_key); MaxSdk.InitializeSdk(); LoadRewarded(); LoadInterstitial(); _initialized = true; } public void RefreshAdsData() { _max_app_key = AdConfigParser.GetMaxAppKey(); _max_interstitial_units = AdConfigParser.GetMaxAdUnits(AdsType.Interstitial).FirstOrDefault(); _max_rewarded_units = AdConfigParser.GetMaxAdUnits(AdsType.Rewarded).FirstOrDefault(); } #region 激励广告功能 private void InitRewardedCallback() { if (string.IsNullOrEmpty(_max_rewarded_units)) return; MaxSdkCallbacks.Rewarded.OnAdLoadedEvent += OnRewardedAdLoadedEvent; MaxSdkCallbacks.Rewarded.OnAdLoadFailedEvent += OnRewardedAdLoadFailedEvent; MaxSdkCallbacks.Rewarded.OnAdDisplayFailedEvent += OnRewardedAdFailedToDisplayEvent; MaxSdkCallbacks.Rewarded.OnAdDisplayedEvent += OnRewardedAdDisplayedEvent; MaxSdkCallbacks.Rewarded.OnAdClickedEvent += OnRewardedAdClickedEvent; MaxSdkCallbacks.Rewarded.OnAdHiddenEvent += OnRewardedAdHiddenEvent; MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnRewardedRevenue; } public void LoadRewarded() { if (string.IsNullOrEmpty(_max_rewarded_units)) return; MaxSdk.LoadRewardedAd(_max_rewarded_units); AdsActionEvents.TrackAdStartLoad(Platfrom, "", "", AdsType.Rewarded); _rvStartLoadTime = Time.realtimeSinceStartup; } public void DisplayRewarded(string adPos, Action rewardCallback = null, Action showFailedCallback = null) { _rvPos = adPos; _rvCloseCallback = rewardCallback; _rvShowFailedCallback = showFailedCallback; MaxSdk.ShowRewardedAd(_max_rewarded_units); } public double GetRewardedRevenue() { if (IsRewardedAvailable() && _rewardAdInfo != null) { return _rewardAdInfo.Revenue; } else { return -1; } } public bool IsRewardedAvailable() { return string.IsNullOrEmpty(_max_rewarded_units) ? false : MaxSdk.IsRewardedAdReady(_max_rewarded_units); ; } private void OnRewardedRevenue(string adunit, MaxSdkBase.AdInfo adInfo) { LoggerUtils.Debug("[Max] OnRewardedRevenue network: " + adInfo.NetworkName + " revenue: " + adInfo.Revenue + " NetworkPlacement: " + adInfo.NetworkPlacement + " AdUnitIdentifier: " + adInfo.AdUnitIdentifier + " Placement: " + adInfo.Placement); TrackAdImpression(adInfo, AdsType.Rewarded); } private void OnRewardedAdLoadedEvent(string adunit, MaxSdkBase.AdInfo adInfo) { LoggerUtils.Debug("[Max] OnRewardedAdLoadedEvent network: " + adInfo.NetworkName + " revenue: " + adInfo.Revenue + " NetworkPlacement: " + adInfo.NetworkPlacement + " AdUnitIdentifier: " + adInfo.AdUnitIdentifier + " Placement: " + adInfo.Placement); AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Rewarded); _rewardAdInfo = adInfo; _rewardRetryAttempt = 0; AdsActionEvents.TrackAdLoaded(Platfrom, adInfo.NetworkName, adInfo.AdUnitIdentifier, AdsType.Rewarded, Time.realtimeSinceStartup - _rvStartLoadTime); } private void OnRewardedAdLoadFailedEvent(string adunit, MaxSdkBase.ErrorInfo errorInfo) { LoggerUtils.Debug("[Max] OnRewardedAdLoadFailedEvent errorInfo" + errorInfo.Message); _rewardRetryAttempt++; double retryDelay = Math.Pow(2, Math.Min(6, _rewardRetryAttempt)); TimerUtils.Instance.DelayExecute((float)retryDelay, LoadRewarded); AdsActionEvents.TrackAdFailToLoad(Platfrom, "","",AdsType.Rewarded,Time.realtimeSinceStartup - _rvStartLoadTime,errorInfo.Message); } private void OnRewardedAdDisplayedEvent(string adUnitId, MaxSdkBase.AdInfo info) { LoggerUtils.Debug("[Max] OnRewardedAdDisplayedEvent network: " + info.NetworkName + " revenue: " + info.Revenue + " NetworkPlacement: " + info.NetworkPlacement + " AdUnitIdentifier: " + info.AdUnitIdentifier + " Placement: " + info.Placement); } private void OnRewardedAdClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { LoggerUtils.Debug("[Max] OnRewardedAdClickedEvent"); AdsActionEvents.TrackAdClicked(Platfrom,adInfo.NetworkName,adInfo.AdUnitIdentifier,AdsType.Rewarded,_rvPos,adInfo.Revenue); } private void OnRewardedAdFailedToDisplayEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo adInfo) { LoggerUtils.Debug("[Max] OnRewardedAdFailedToDisplayEvent :" + errorInfo.Message + " " + errorInfo.Code + " " + errorInfo.MediatedNetworkErrorMessage + " " + errorInfo.MediatedNetworkErrorCode); _rvShowFailedCallback?.Invoke(); _rvShowFailedCallback = null; LoadRewarded(); AdsActionEvents.TrackAdFailToShow(Platfrom,AdsType.Rewarded,errorInfo.Message,_rvPos); } private void OnRewardedAdHiddenEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { _rvCloseCallback?.Invoke(true,adInfo.Revenue); _rvCloseCallback = null; LoadRewarded(); LoggerUtils.Debug("[Max] OnRewardedAdHiddenEvent"); AdsActionEvents.TrackAdClosed(Platfrom,adInfo.NetworkName,adInfo.AdUnitIdentifier,AdsType.Rewarded,_rvPos,adInfo.Revenue); } #endregion #region 插页广告功能 private void InitInterstitialCallback() { if (string.IsNullOrEmpty(_max_interstitial_units)) return; MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnInterstitialLoadedEvent; MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent += OnInterstitialLoadFailedEvent; MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent += OnInterstitialAdFailedToDisplayEvent; MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnInterstitialHiddenEvent; MaxSdkCallbacks.Interstitial.OnAdDisplayedEvent += OnInterstitialDisplayedEvent; MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnInterstitialRevenue; MaxSdkCallbacks.Interstitial.OnAdClickedEvent += OnInterstitialClickedEvent; } public void LoadInterstitial() { if (string.IsNullOrEmpty(_max_rewarded_units)) return; MaxSdk.LoadInterstitial(_max_interstitial_units); AdsActionEvents.TrackAdStartLoad(Platfrom, "", "", AdsType.Interstitial); _ivStartLoadTime = Time.realtimeSinceStartup; } public double GetInterstitialRevenue() { if (IsInterstitialAvailable() && _interAdInfo != null) { return _interAdInfo.Revenue; } else { return -1; } } public void DisplayInterstitial(string ivPos, IvType _IvType = IvType.IV1, Action closeCallback = null) { _ivPos = ivPos; _ivCloseCallback = closeCallback; MaxSdk.ShowInterstitial(_max_interstitial_units); } public bool IsInterstitialAvailable() { return string.IsNullOrEmpty(_max_interstitial_units) ? false : MaxSdk.IsInterstitialReady(_max_interstitial_units); } private void OnInterstitialLoadedEvent(string adunit, MaxSdkBase.AdInfo adInfo) { LoggerUtils.Debug("[Max] OnInterstitialLoadedEvent network: " + adInfo.NetworkName + " revenue: " + adInfo.Revenue + " NetworkPlacement: " + adInfo.NetworkPlacement + " AdUnitIdentifier: " + adInfo.AdUnitIdentifier + " Placement: " + adInfo.Placement); AdsKeyEvents.Instance.LogAdFPUEvents(AdsType.Interstitial); _interAdInfo = adInfo; _interRetryAttempt = 0; AdsActionEvents.TrackAdLoaded(Platfrom, adInfo.NetworkName, adInfo.AdUnitIdentifier, AdsType.Interstitial, Time.realtimeSinceStartup - _ivStartLoadTime); } private void OnInterstitialLoadFailedEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo) { LoggerUtils.Debug("[Max] OnInterstitialLoadFailedEvent :" + errorInfo); _interRetryAttempt++; double retryDelay = Math.Pow(2, Math.Min(6, _interRetryAttempt)); TimerUtils.Instance.DelayExecute((float)retryDelay, LoadInterstitial); AdsActionEvents.TrackAdFailToLoad(Platfrom, "","",AdsType.Interstitial,Time.realtimeSinceStartup - _ivStartLoadTime,errorInfo.Message); } private void OnInterstitialAdFailedToDisplayEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo, MaxSdkBase.AdInfo arg3) { LoggerUtils.Debug("[Max] OnInterstitialAdFailedToDisplayEvent :" + errorInfo.Message + " " + errorInfo.Code + " " + errorInfo.MediatedNetworkErrorMessage + " " + errorInfo.MediatedNetworkErrorCode); _ivCloseCallback?.Invoke(0); _ivCloseCallback = null; LoadInterstitial(); AdsActionEvents.TrackAdFailToShow(Platfrom,AdsType.Interstitial,errorInfo.Message,""); } private void OnInterstitialDisplayedEvent(string adUnitId, MaxSdkBase.AdInfo info) { LoggerUtils.Debug($"[Max] OnInterstitialDisplayedEvent network: {info.NetworkName}, revenue: {info.Revenue},NetworkPlacement: {info.NetworkPlacement}, AdUnitIdentifier: {info.AdUnitIdentifier},Placement: {info.Placement}"); } private void OnInterstitialHiddenEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { LoggerUtils.Debug($"[Max] OnInterstitialHiddenEvent"); AdsActionEvents.TrackAdClosed(Platfrom,adInfo.NetworkName,adInfo.AdUnitIdentifier,AdsType.Interstitial,"",adInfo.Revenue); _ivCloseCallback?.Invoke(adInfo.Revenue); _ivCloseCallback = null; LoadInterstitial(); } private void OnInterstitialRevenue(string adunit, MaxSdkBase.AdInfo adInfo) { LoggerUtils.Debug("[Max] OnInterstitialRevenue network: " + adInfo.NetworkName + " revenue: " + adInfo.Revenue + " NetworkPlacement: " + adInfo.NetworkPlacement + " AdUnitIdentifier: " + adInfo.AdUnitIdentifier + " Placement: " + adInfo.Placement); TrackAdImpression(adInfo, AdsType.Interstitial); } private void OnInterstitialClickedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { AdsActionEvents.TrackAdClicked(Platfrom,adInfo.NetworkName,adInfo.AdUnitIdentifier,AdsType.Interstitial,"",adInfo.Revenue); } #endregion #region 开屏广告功能 public void LoadSplash() { } public bool IsSplashAvailable() { return false; } public void DisplaySplash() { } public double GetSplashRevenue() { return 0; } #endregion #region 原生广告功能 public void LoadNative() { } public bool IsNativeAvailable(string adUnitId) { return false; } public void DisplayNative(string _adPos, string adUnitId, NativeAdPosition position) { } public void RemoveNative(string adUnitId) { } public double GetNativeRevenue(string adUnitId) { return 0; } #endregion #region 横幅广告功能 public void LoadBanner() { } public bool IsBannerAvailable() { return false; } public void HideBanner() { } public double GetBannerRevenue() { return 0; } public void DisplayBanner() { } #endregion #region 广告收益上报 public void TrackAdImpression(MaxSdkBase.AdInfo adInfo, AdsType type) { AdjustTrackEvent.Instance.TrackAdEvent(adInfo.Revenue, adInfo.NetworkName, adInfo.AdUnitIdentifier, adInfo.Placement); FireBaseAnalyticsManager.Instance.OnAdRevenueEvent(ClientName, adInfo.NetworkName, adInfo.AdUnitIdentifier, type, adInfo.Revenue, type == AdsType.Rewarded ? _rvPos : "", AdPlayCountManager.GetAdPlayCount(type)); ShuShuEvent.Instance.OnAdRevenueEvent(ClientName, adInfo.NetworkName, adInfo.AdUnitIdentifier, type.ToString(), adInfo.Revenue, type == AdsType.Rewarded ? _rvPos : "", AdPlayCountManager.GetAdPlayCount(type)); AdsActionEvents.TrackAdImpression(Platfrom, adInfo.NetworkName, adInfo.AdUnitIdentifier, type, type == AdsType.Rewarded ? _rvPos : "", adInfo.Revenue); } #endregion } }