namespace Guru { using UnityEngine; using System; public partial class GuruSDK { /// /// 启动广告服务 /// public static void StartAds() { if (InitConfig.UseCustomConsent) { Debug.Log($"{Tag} --- Call StartAdsWithCustomConsent when you use custom consent, and pass the result (boolean) to the method."); } else { // 默认的启动顺序是先启动Consent后, 根据用户回调的结果来启动广告 Instance.StartConsentFlow(); } } /// /// 使用自定义的Consent, 获取用户授权后, 调用此方法 /// /// /// Consent 引导的类型, 如果使用了 MAX 的 consent 请填写 max 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 /// /// 启动Consent流程 /// 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"; /// /// 显示系统的 ATT 弹窗 /// public static void RequestAttDialog() { LogI($"RequestATTDialog"); ATTManager.RequestATTDailog(ReportAttStatus); } /// /// 初始化 ATT 状态 /// public static void InitAttStatus() { _initialAttStatus = ATTManager.GetStatus(); SetUserProperty(Analytics.ParameterATTStatus, _initialAttStatus); // 上报一个初始的状态 } /// /// iOS 平台检查 ATT 状态 /// 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; /// /// 启动广告服务 /// 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 first."); return false; } return true; } /// /// 显示Banner广告 /// /// public static void ShowBanner(string placement = "") { if (!CheckAdsReady()) return; ADService.Instance.ShowBanner(placement); } /// /// 隐藏Banner广告 /// 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(); /// /// 显示插屏广告 /// /// /// public static void ShowInterstitialAd(string placement = "", Action onDismissed = null) { if (!CheckAdsReady()) return; if (!ADService.Instance.IsInterstitialADReady()) { LogE("Interstitial is not ready. Call 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(); /// /// 显示激励视频广告 /// /// /// /// public static void ShowRewardAd(string placement = "", Action onRewarded = null, Action onFailed = null) { if (!CheckAdsReady()) return; if (!ADService.Instance.IsRewardedADReady()) { LogE("RewardAd is not ready. Call again."); LoadRewardAd(); return; } ADService.Instance.ShowRewardedAD(placement, onRewarded, onFailed); } #endregion #region MaxServices /// /// 显示Max调试菜单 /// 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 first."); return; } ADService.Instance.ShowMaxDebugPanel(); } #endregion } }