using System; using System.Collections; using System.Collections.Generic; using System.Net.Security; using Firebase.Analytics; using Script.Common; using Script.SDKManager.AdsSDKManager.Constant; using Script.SDKManager.AdsSDKManager.Utils; using Script.Utils; using UnityEngine; namespace Script.SDKManager.AdsSDKManager.MaxAdsManager { public class MaxAdsManager : NormalSingleton, IAdService { public string ClientName => "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 void Initialize() { max_app_key = AdConfigParser.GetMaxAppKey(); max_interstitial_units = AdConfigParser.GetMaxAdUnits(AdsType.Interstitial).ToArray()[0]; max_rewarded_units = AdConfigParser.GetMaxAdUnits(AdsType.Rewarded).ToArray()[0]; if (string.IsNullOrEmpty(max_app_key)) 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(); } #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() { MaxSdk.LoadRewardedAd(max_rewarded_units); } 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); _rewardAdInfo = adInfo; _rewardRetryAttempt = 0; } 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.DelayExecute((float)retryDelay, LoadRewarded); } 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"); } 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(); } private void OnRewardedAdHiddenEvent(string adUnitId, MaxSdkBase.AdInfo adInfo) { _rvCloseCallback?.Invoke(true); _rvCloseCallback = null; LoadRewarded(); LoggerUtils.Debug("[Max] OnRewardedAdHiddenEvent"); } #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; } public void LoadInterstitial() { MaxSdk.LoadInterstitial(max_interstitial_units); } 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); _interAdInfo = adInfo; _interRetryAttempt = 0; } private void OnInterstitialLoadFailedEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo) { LoggerUtils.Debug("[Max] OnInterstitialLoadFailedEvent :" + errorInfo); _interRetryAttempt++; double retryDelay = Math.Pow(2, Math.Min(6, _interRetryAttempt)); TimerUtils.DelayExecute((float)retryDelay, LoadInterstitial); } 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(); _ivCloseCallback = null; LoadInterstitial(); } 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 info) { LoggerUtils.Debug($"[Max] OnInterstitialHiddenEvent"); _ivCloseCallback?.Invoke(); _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); } #endregion #region 开屏广告功能 public void LoadSplash() { } public bool IsSplashAvailable() { return false; } public void DisplaySplash() { } public double GetSplashRevenue() { return 0; } #endregion #region 原生广告功能 public void LoadNative() { } public double GetNativeRevenue() { return 0; } public void DisplayNative(NativeAdPosition position) { } public bool IsNativeAvailable() { return false; } public void RemoveNative() { } #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.ToString(), 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)); } #endregion } }