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 private bool _hasConsentCalled = false; /// /// 启动Consent流程 /// 因为之后规划广告流程会放在 Consent 初始化之后, 因此请求广告的时候会需要先请求 Consent /// private void StartConsentFlow() { if (_hasConsentCalled) return; _hasConsentCalled = true; bool enableCountryCheck = _appServicesConfig.DMACountryCheck(); string dmaMapRule = _appServicesConfig.DMAMapRule(); #if UNITY_IOS InitAttStatus(); // Consent 启动前记录 ATT 初始值 #endif Debug.Log($"{Tag} --- StartConsentFlow ---"); GuruConsent.StartConsent(OnGuruConsentOver, dmaMapRule:dmaMapRule, enableCountryCheck:enableCountryCheck); } /// /// Guru Consent flow is Over /// /// private void OnGuruConsentOver(int code) { // 无论状态如何, 都在回调内启动广告初始化 StartAdService(); // 调用回调 Callbacks.ConsentFlow._onConsentResult?.Invoke(code); #if UNITY_IOS CheckAttStatus(); // [iOS] Consent 启动后检查 ATT 初始值 #endif // 内部处理后继逻辑 switch(code) { case GuruConsent.StatusCode.OBTAINED: case GuruConsent.StatusCode.NOT_AVAILABLE: // 已获取授权, 或者地区不可用, ATT 尚未启动 // TODO: 添加后继处理逻辑 break; } } #endregion #region IOS ATT 广告授权流程 #if UNITY_IOS private static string _initialAttStatus; private static String _attType = "admob"; private static bool _autoReCallAtt = false; /// /// 显示系统的 ATT 弹窗 /// public static void RequestAttDialog() { LogI($"RequestATTDialog"); ATTManager.RequestATTDailog(ReportAttStatus); } /// /// 初始化 ATT 状态 /// public static void InitAttStatus() { _attType = InitConfig.UseCustomConsent ? ATTManager.GUIDE_TYPE_CUSTOM : ATTManager.GUIDE_TYPE_ADMOB; // 点位属性确定 _initialAttStatus = ATTManager.GetStatus(); SetUserProperty(Analytics.ParameterATTStatus, _initialAttStatus); // 上报一个初始的状态 } /// /// iOS 平台检查 ATT 状态 /// private static void CheckAttStatus(bool autoReCall = false) { _autoReCallAtt = autoReCall; // Delay 1s to get the user choice Delay(1, () => ATTManager.CheckStatus(ReportAttStatus)); } private static void ReportAttStatus(string status) { LogI($"{Tag} --- Get Att status:{status} att Type:{_attType} recall:{_autoReCallAtt}"); SetUserProperty(Analytics.ParameterATTStatus, status); // 当前的状态 if (!string.IsNullOrEmpty(status) && status != _initialAttStatus && status != ATTManager.ATT_STATUS_NOT_DETERMINED) { // 上报点位: Analytics.AttResult(status, _attType); } switch(status) { case ATTManager.ATT_STATUS_NOT_DETERMINED: // ATT 状态未知, 请求弹窗 if(_autoReCallAtt) RequestAttDialog(); break; case ATTManager.ATT_STATUS_RESTRICTED: case ATTManager.ATT_STATUS_DENIED: // ATT 状态受限, 或者被拒绝 break; case ATTManager.ATT_STATUS_AUTHORIZED: // ATT 状态已授权 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 } }