295 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			295 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C#
		
	
	
| 
 | |
| 
 | |
| namespace Guru
 | |
| {
 | |
|     using UnityEngine;
 | |
|     using System;
 | |
|     
 | |
|     
 | |
|     public partial class GuruSDK
 | |
|     {
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 启动广告服务
 | |
|         /// </summary>
 | |
|         public static void StartAds()
 | |
|         {
 | |
|             if (InitConfig.UseCustomConsent)
 | |
|             {
 | |
|                 Debug.Log($"{Tag} --- Call <color=orange>StartAdsWithCustomConsent</color> when you use custom consent, and pass the result (boolean) to the method.");
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 // 默认的启动顺序是先启动Consent后, 根据用户回调的结果来启动广告
 | |
|                 Instance.StartConsentFlow();
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 使用自定义的Consent, 获取用户授权后, 调用此方法
 | |
|         /// </summary>
 | |
|         /// <param name="userAllow"></param>
 | |
|         /// <param name="guideType">Consent 引导的类型, 如果使用了 MAX 的 consent 请填写 max </param>
 | |
|         public static void StartAdsWithCustomConsent(bool userAllow = true, string guideType = "custom")
 | |
|         {
 | |
| #if UNITY_IOS
 | |
|             _attType = guideType;
 | |
|             InitAttStatus();
 | |
| #endif
 | |
|             if (userAllow)
 | |
|             {
 | |
| #if UNITY_IOS
 | |
|                 CheckAttStatus();
 | |
| #else
 | |
|                 StartAdService();
 | |
| #endif
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 Debug.Log($"{Tag} --- User refuse to provide ads Id, Ads Service will be cancelled");
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
| 
 | |
|         #region Guru Consent
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 启动Consent流程
 | |
|         /// </summary>
 | |
|         private void StartConsentFlow()
 | |
|         {
 | |
|             LogI($"StartConsentFlow");
 | |
|             GuruConsent.StartConsent(OnConsentOver);
 | |
|         }
 | |
| 
 | |
|         private void OnConsentOver(int code)
 | |
|         {
 | |
| #if UNITY_IOS
 | |
|             InitAttStatus();
 | |
| #endif
 | |
|             Callbacks.ConsentFlow._onConsentResult?.Invoke(code);
 | |
|             switch(code)
 | |
|             {
 | |
|                 case GuruConsent.StatusCode.OBTAINED:
 | |
|                 case GuruConsent.StatusCode.NOT_AVAILABLE:
 | |
|                     // 已获取授权, 或者地区不可用
 | |
| #if UNITY_IOS
 | |
|                     CheckAttStatus();
 | |
| #else
 | |
|                     StartAdService();
 | |
| #endif
 | |
|                     break;
 | |
|             }
 | |
|         }
 | |
|         
 | |
|         #endregion
 | |
|         
 | |
|         #region IOS ATT 广告授权流程
 | |
|         
 | |
| #if UNITY_IOS
 | |
|         
 | |
|         private static string _initialAttStatus;
 | |
|         private static String _attType = "admob";
 | |
|         
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 显示系统的 ATT 弹窗
 | |
|         /// </summary>
 | |
|         public static void RequestAttDialog()
 | |
|         {
 | |
|             LogI($"RequestATTDialog");
 | |
|             ATTManager.RequestATTDailog(ReportAttStatus);
 | |
|         }
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 初始化 ATT 状态
 | |
|         /// </summary>
 | |
|         public static void InitAttStatus()
 | |
|         {
 | |
|             _initialAttStatus = ATTManager.GetStatus();
 | |
|             SetUserProperty(Analytics.ParameterATTStatus, _initialAttStatus); // 上报一个初始的状态
 | |
|         }
 | |
|         
 | |
|         /// <summary>
 | |
|         /// iOS 平台检查 ATT 状态
 | |
|         /// </summary>
 | |
|         private static void CheckAttStatus() => ATTManager.CheckStatus(ReportAttStatus);
 | |
|          
 | |
|         private static void ReportAttStatus(string status)
 | |
|         {
 | |
|             LogI($"{Tag} --- Get Att status: {status}");
 | |
|             SetUserProperty(Analytics.ParameterATTStatus, status); // 当前的状态
 | |
|             if (!string.IsNullOrEmpty(_initialAttStatus) 
 | |
|                 && status !=  ATTManager.ATT_STATUS_NOT_DETERMINED
 | |
|                 && _initialAttStatus != status)
 | |
|             {
 | |
|                 // 上报点位:
 | |
|                 Analytics.AttResult(status, _attType);
 | |
|             }
 | |
| 
 | |
|             switch(status)
 | |
|             {
 | |
|                 case ATTManager.ATT_STATUS_NOT_DETERMINED:
 | |
|                     // ATT 状态未知, 请求弹窗
 | |
|                     RequestAttDialog();
 | |
|                     break;
 | |
|                 case ATTManager.ATT_STATUS_RESTRICTED:
 | |
|                 case ATTManager.ATT_STATUS_DENIED:
 | |
|                     // ATT 状态受限, 或者被拒绝, 不请求广告
 | |
|                     break;
 | |
|                 case ATTManager.ATT_STATUS_AUTHORIZED:
 | |
|                     // ATT 状态已授权, 请求广告
 | |
|                     StartAdService();
 | |
|                     break;
 | |
|             }
 | |
|         } 
 | |
| #endif
 | |
|         
 | |
|         #endregion   
 | |
|         
 | |
|         #region Ad Services
 | |
| 
 | |
|         private static bool _initAdsCompleted = false;
 | |
|         
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 启动广告服务
 | |
|         /// </summary>
 | |
|         public static void StartAdService()
 | |
|         {
 | |
|             LogI($"StartAdService");
 | |
|             ADService.Instance.StartService(OnAdsInitComplete, 
 | |
|                 InitConfig.AutoLoadWhenAdsReady, IsDebugMode);
 | |
|             
 | |
|             //--------- Callbacks -----------
 | |
|             ADService.OnBannerLoaded = OnBannerLoaded;
 | |
|             ADService.OnInterstitialLoaded = OnInterstitialLoaded;
 | |
|             ADService.OnInterstitialFailed = OnInterstitialFailed;
 | |
|             ADService.OnRewardLoaded = OnRewardLoaded;
 | |
|             ADService.OnRewardFailed = OnRewardFailed;
 | |
|         }
 | |
|         
 | |
|         private static void OnBannerLoaded() 
 | |
|             => Callbacks.Ads._onBannerADLoaded?.Invoke();
 | |
| 
 | |
|         private static void OnInterstitialLoaded() 
 | |
|             => Callbacks.Ads._onInterstitialADLoaded?.Invoke();
 | |
|         private static void OnInterstitialFailed()
 | |
|             => Callbacks.Ads._onInterstitialADFailed?.Invoke();
 | |
|         private static void OnRewardLoaded()
 | |
|             => Callbacks.Ads._onRewardedADLoaded?.Invoke(); 
 | |
|         private static void OnRewardFailed()
 | |
|             => Callbacks.Ads._onRewardADFailed?.Invoke();
 | |
| 
 | |
|         private static void OnAdsInitComplete()
 | |
|         {
 | |
|             _initAdsCompleted = true;
 | |
|             Callbacks.Ads._onAdsInitComplete?.Invoke();
 | |
|         }
 | |
| 
 | |
|         private static bool CheckAdsReady()
 | |
|         {
 | |
|             if (!_initAdsCompleted)
 | |
|             {
 | |
|                 LogE("Ads is not ready. Call <GuruSDk.StartAdService> first.");
 | |
|                 return false;
 | |
|             }
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 显示Banner广告
 | |
|         /// </summary>
 | |
|         /// <param name="placement"></param>
 | |
|         public static void ShowBanner(string placement = "")
 | |
|         {
 | |
|             if (!CheckAdsReady()) return;
 | |
|             ADService.Instance.ShowBanner(placement);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 隐藏Banner广告
 | |
|         /// </summary>
 | |
|         public static void HideBanner()
 | |
|         {
 | |
|             if (!CheckAdsReady()) return;
 | |
|             ADService.Instance.HideBanner();
 | |
|         }
 | |
| 
 | |
|         public static void LoadInterstitialAd()
 | |
|         {
 | |
|             if (!CheckAdsReady()) return;
 | |
|             ADService.Instance.RequestInterstitialAD();
 | |
|         }
 | |
| 
 | |
|         public static bool IsInterstitialAdReady => ADService.Instance.IsInterstitialADReady();
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 显示插屏广告
 | |
|         /// </summary>
 | |
|         /// <param name="placement"></param>
 | |
|         /// <param name="onDismissed"></param>
 | |
|         public static void ShowInterstitialAd(string placement = "", Action onDismissed = null)
 | |
|         {
 | |
|             if (!CheckAdsReady()) return;
 | |
|             if (!ADService.Instance.IsInterstitialADReady())
 | |
|             {
 | |
|                 LogE("Interstitial is not ready. Call <GuruSDk.ShowInterstitialAd> again.");
 | |
|                 LoadInterstitialAd();
 | |
|                 return;
 | |
|             }
 | |
|             ADService.Instance.ShowInterstitialAD(placement, onDismissed);
 | |
|         }
 | |
| 
 | |
|         public static void LoadRewardAd()
 | |
|         {
 | |
|             if (!CheckAdsReady()) return;
 | |
|             ADService.Instance.RequestRewardedAD();
 | |
|         }
 | |
|         
 | |
|         public static bool IsRewardAdReady => ADService.Instance.IsRewardedADReady();
 | |
|         
 | |
|         /// <summary>
 | |
|         /// 显示激励视频广告
 | |
|         /// </summary>
 | |
|         /// <param name="placement"></param>
 | |
|         /// <param name="onRewarded"></param>
 | |
|         /// <param name="onFailed"></param>
 | |
|         public static void ShowRewardAd(string placement = "", Action onRewarded = null, Action<string> onFailed = null)
 | |
|         {
 | |
|             if (!CheckAdsReady()) return;
 | |
|             if (!ADService.Instance.IsRewardedADReady())
 | |
|             {
 | |
|                 LogE("RewardAd is not ready. Call <GuruSDk.LoadRewardAd> again.");
 | |
|                 LoadRewardAd();
 | |
|                 return;
 | |
|             }
 | |
|             ADService.Instance.ShowRewardedAD(placement, onRewarded, onFailed);
 | |
|         }
 | |
| 
 | |
| 
 | |
|         #endregion
 | |
| 
 | |
|         #region MaxServices
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 显示Max调试菜单
 | |
|         /// </summary>
 | |
|         public static void ShowMaxDebugPanel()
 | |
|         {
 | |
| #if UNITY_EDITOR
 | |
| 
 | |
|             LogI($"Can not show Max Debug Panel in Editor, skipped.");
 | |
|             return;
 | |
| #endif
 | |
|             if (!ADService.Instance.IsInitialized)
 | |
|             {
 | |
|                 LogI($"ADService is not initialized, call <GuruSDK.StartAds> first.");
 | |
|                 return;
 | |
|             }
 | |
|             ADService.Instance.ShowMaxDebugPanel();
 | |
|         }
 | |
| 
 | |
|         #endregion
 | |
|     }
 | |
| } |