using System; using System.Collections; using System.Collections.Generic; using System.Linq; using AdjustSdk; using AnyThinkAds.ThirdParty.LitJson; using Firebase.RemoteConfig; using GoogleMobileAds.Api; using Newtonsoft.Json; using ThinkingAnalytics; using ThinkingData.Analytics; using UnityEngine; #if UNITY_PURCHASE using UnityEngine.Purchasing; #endif using WZ; public class RushSDKManager : D_MonoSingleton { public static string GetSDKVersion() { return "1.0.5.2"; } protected override void Initialized() { base.Initialized(); FileParse.Parse(); } public void InitializeSdk(Action action, bool showLog) { LoggerUtils.Enabled = showLog; #if UNITY_PURCHASE IAPPurchaseManager.Instance.PreInitialize(); #endif AdsSplashManager.Instance.SetSplashAdCloseCallback(action); FireBaseSDKManager.Instance.Init(); ShuShuMangage.Instance.Init(); AdmobAdsManager.Instance.RefreshAdsData(); AdmobAdsManager.Instance.Initialize(); AdjustManager.Instance.Init(); AdsSDKManager.Instance.InitSDK(); #if UNITY_PURCHASE IAPPurchaseManager.Instance.Initialize(); #endif } #if UNITY_PURCHASE #region 支付 /// /// 初始化回调 /// public Action OnPurchaseInitComplete; public void RegisterPurchaseInitHandler(Action _action) { OnPurchaseInitComplete = _action; } /// /// 获取 AppStore/Google Play 上所有配置的商品; /// /// 返回所有商品信息 /// ex: /// Product[0].metadata.localizedTitle /// Product[0].metadata.localizedPriceString /// Product[0].metadata.localizedDescription /// Product[0].metadata.isoCurrencyCode public Action OnGetProductsInfo; public void RegisterProductsInfoHandler(Action _action) { OnGetProductsInfo += _action; } /// /// 支付回调 /// public Action OnPurchaseComplete; public void RegisterPurchaseCompletionHandler(Action _action) { OnPurchaseComplete = _action; } /// /// 订阅查询回调 /// public Action OnSubscriptionQueriedByProductId; public void QuerySubscriptionDataByProductId(string _pID,Action _action) { OnSubscriptionQueriedByProductId = _action; IAPSubscribeManager.Instance.CheckSubscribeDataByProductId(_pID); } /// /// 获取商品价格 /// /// /// public string GetProductPriceByID(string _pID) { return IAPPurchaseManager.Instance.GetProductPriceByID(_pID); } /// /// 获取商品信息 /// /// /// public Product GetProductInfoByID(string _pID) { return IAPPurchaseManager.Instance.GetProductInfoByID(_pID); } /// /// 动态添加商品ID /// /// Product IDs public void AddProductsDynamic(Dictionary _products,Action _onProductsResult = null) { IAPPurchaseManager.Instance.AddProductsDynamic(_products,_onProductsResult); } /// /// 初始化前静态添加商品ID /// /// Product IDs public void AddProductsStatic(Dictionary _products) { IAPPurchaseManager.StaticProductDic = IAPPurchaseManager.StaticProductDic.Concat(_products).ToDictionary(postParK => postParK.Key, PostParV => PostParV.Value); } /// /// 点击购买方法 /// /// 商品SKU /// 商品名称 /// 游戏拓展参数 public void PurchaseProductById(string _productId, string _productName, string _gameExtraParam = "") { IAPPurchaseManager.Instance.BuyProductByID(_productId, _productName,_gameExtraParam); } /// /// 游戏下发奖励后上报 /// /// 商品名称 /// 商品SKU ID /// 订单ID /// 游戏拓展字段-购买商品数量 /// 游戏拓展字段 public void LogCheckingOrder(string _productName, string _productId, string _orderId, string gameExtra01, string gameExtra02) { #if !UNITY_EDITOR IAPOrderManager.Instance.RemoveVerifySuccessOrder(_orderId); IAPPurchaseManager.Instance.DoConfirmPendingPurchaseByID(_productId); IAPEvent.LogChecingOrderBySdk(_productName, _productId, _orderId, gameExtra01, gameExtra02); #endif } #endregion #endif #region 买量用户回调 public Action OnUserSourceListener; /// Adjust归因回调 /// /// 是否为买量用户 /// adjust 返回的network字段 /// public void SetUserSourceListener(Action _action) { OnUserSourceListener = _action; } #endregion #region 跳转谷歌评价 public void Review() { var httpsPlayGoogleComStoreAppsDetailsID = "https://play.google.com/store/apps/details?id=" + Application.identifier; Application.OpenURL(httpsPlayGoogleComStoreAppsDetailsID); } #endregion #region ad /// /// 是否已缓存激励广告 /// /// public bool IsRewardedAdReady() { return AdsSDKManager.Instance.IsRewardAdReady(); ; } /// /// 展示激励广告 /// /// /// public void ShowRewardAd(string position, Action callback = null) { AdsActionEvents.TrackAdPosition(AdsType.Rewarded, position); bool isRewardAdReady = AdsSDKManager.Instance.IsRewardAdReady(); if (isRewardAdReady) { AdsSDKManager.Instance.ShowRewardAd(position, (isReward, revenue) => { AdsSplashManager.Instance.backgroundTime = Time.realtimeSinceStartup; if (isReward) { AdsSDKManager.Instance.ClearIvRules(); callback?.Invoke(true, revenue); } else { callback?.Invoke(false, 0); } }); } else { AdsActionEvents.TrackAdFailToShow(AdsType.Rewarded, position, AdsShowFailType.NoFill); callback?.Invoke(false, 0); } } /// /// 是否已缓存插屏 /// public bool IsInterstitialAdReady() { return AdsSDKManager.Instance.IsInterstitialReady(); } /// /// 是否能展示插屏 /// /// /// public bool CanShowInterstitialAd(IvType ivType) { return AdsSDKManager.Instance.IvRulesShow(ivType, false); } /// /// 展示插屏广告 /// /// /// /// public void ShowInterstitial(string position, IvType ivadType = IvType.IV1, Action callback = null, bool ivRules = true) { AdsActionEvents.TrackAdPosition(AdsType.Interstitial, position); //插屏展示逻辑 bool ivRulesShow = AdsSDKManager.Instance.IvRulesShow(ivadType); if (!ivRules) { //激励竞价不能被规则限制 //是否有缓存 bool isInterstitialReady = AdsSDKManager.Instance.IsInterstitialReady(); if (isInterstitialReady) { AdsSDKManager.Instance.ShowInterstitialAd(position, ivadType, (revenue) => { //展示完一个插屏之后调用 IvRulesConst.OverLevels[ivadType.ToString()] = 1; IvRulesConst.Intervals[ivadType.ToString()] = TimeUtils.GetLocalTimestamp(); AdsSplashManager.Instance.backgroundTime = Time.realtimeSinceStartup; callback?.Invoke(revenue); }); } else { AdsActionEvents.TrackAdFailToShow(AdsType.Interstitial, position, AdsShowFailType.NoFill); callback?.Invoke(-1); } } else if (ivRulesShow && ivRules) { //是否有缓存 bool isInterstitialReady = AdsSDKManager.Instance.IsInterstitialReady(); if (isInterstitialReady) { AdsSDKManager.Instance.ShowInterstitialAd(position, ivadType, (revenue) => { //展示完一个插屏之后调用 IvRulesConst.OverLevels[ivadType.ToString()] = 1; IvRulesConst.Intervals[ivadType.ToString()] = TimeUtils.GetLocalTimestamp(); AdsSplashManager.Instance.backgroundTime = Time.realtimeSinceStartup; callback?.Invoke(revenue); }); } else { AdsActionEvents.TrackAdFailToShow(AdsType.Interstitial, position, AdsShowFailType.NoFill); callback?.Invoke(-1); } } else { AdsActionEvents.TrackAdFailToShow(AdsType.Interstitial, position, AdsShowFailType.RuleLimit); callback?.Invoke(-1); } } /// /// /// /// banner样式,Standard:普通banner;Collapsible:可折叠banner /// banner位置,CenterBottom:底部居中;CenterTop:顶部居中 public void ShowBanner(BannerType bannerType, BannerAlignType bannerAlignType) { AdsActionEvents.TrackAdPosition(AdsType.Banner, ""); if (AdsSDKManager.Instance.IsBannerAdReady(bannerType)) { AdsSDKManager.Instance.ShowBanner(bannerType, bannerAlignType); } else { AdsActionEvents.TrackAdFailToShow(AdsType.Banner, "", AdsShowFailType.NoFill); } } public void HideBanner(BannerType bannerType) { AdsSDKManager.Instance.HideBanner(bannerType); } public bool IsNativeFullReady() { var adUnitId = StaticValue.AdmobFullNativeId; return AdsSDKManager.Instance.IsNativeAdReady(adUnitId); } /// /// /// /// /// /// /// public void ShowFullNative(RectTransform rectTransform, Camera pCom = null, string position = "", NativeTemplateStyle nativeTemplateStyle = null) { AdsActionEvents.TrackAdPosition(AdsType.Native, position); if (!IsNativeFullReady()) { AdsActionEvents.TrackAdFailToShow(AdsType.Native, position, AdsShowFailType.NoFill); return; } var adUnitId = StaticValue.AdmobFullNativeId; if (nativeTemplateStyle == null) { nativeTemplateStyle = new NativeTemplateStyle { TemplateId = NativeTemplateId.Medium, MainBackgroundColor = Color.white }; } var nativeAdPosition = NativeAdPosition.Create(nativeTemplateStyle, rectTransform, pCom); AdsSDKManager.Instance.ShowNativeAd(position, adUnitId, nativeAdPosition); } /// /// 获取全屏Native广告价值 /// /// public double GetFullNativeRevenue() { if (!IsNativeFullReady()) { return -1; } var adUnitId = StaticValue.AdmobFullNativeId; return AdsSDKManager.Instance.GetNativeAdRevenue(adUnitId); } public void HideFullNative() { var adUnitId = StaticValue.AdmobFullNativeId; AdsSDKManager.Instance.RemoveNativeAd(adUnitId); } public bool IsNativeReady() { var adUnitId = StaticValue.AdmobNativeId; return AdsSDKManager.Instance.IsNativeAdReady(adUnitId); } public void ShowNative(RectTransform rectTransform, Camera pCom = null, string position = "", NativeTemplateStyle nativeTemplateStyle = null) { AdsActionEvents.TrackAdPosition(AdsType.Native, position); if (!IsNativeReady()) { AdsActionEvents.TrackAdFailToShow(AdsType.Native, position, AdsShowFailType.NoFill); return; } if (nativeTemplateStyle == null) { nativeTemplateStyle = new NativeTemplateStyle { //除了中型Native,其他的都是Small TemplateId = NativeTemplateId.Small, //背景颜色 MainBackgroundColor = Color.white }; } var adUnitId = StaticValue.AdmobNativeId; var nativeAdPosition = NativeAdPosition.Create(nativeTemplateStyle, rectTransform, pCom); AdsSDKManager.Instance.ShowNativeAd(position, adUnitId, nativeAdPosition); } public void HideNative() { var adUnitId = StaticValue.AdmobNativeId; AdsSDKManager.Instance.RemoveNativeAd(adUnitId); } public bool IsSmallNativeReady() { var adUnitId = StaticValue.AdmobSmallNativeId; return AdsSDKManager.Instance.IsNativeAdReady(adUnitId); } public void ShowSmallNative(RectTransform rectTransform, Camera pCom = null, string position = "", NativeTemplateStyle nativeTemplateStyle = null) { AdsActionEvents.TrackAdPosition(AdsType.Native, position); if (!IsSmallNativeReady()) { AdsActionEvents.TrackAdFailToShow(AdsType.Native, position, AdsShowFailType.NoFill); return; } if (nativeTemplateStyle == null) { nativeTemplateStyle = new NativeTemplateStyle { TemplateId = NativeTemplateId.Small, MainBackgroundColor = Color.white }; } var adUnitId = StaticValue.AdmobSmallNativeId; var nativeAdPosition = NativeAdPosition.Create(nativeTemplateStyle, rectTransform, pCom); AdsSDKManager.Instance.ShowNativeAd(position, adUnitId, nativeAdPosition); } public void HideSmallNative() { var adUnitId = StaticValue.AdmobSmallNativeId; AdsSDKManager.Instance.RemoveNativeAd(adUnitId); } public bool IsMinddleNativeReady() { var adUnitId = StaticValue.AdmobMinddleNativeId; return AdsSDKManager.Instance.IsNativeAdReady(adUnitId); } public void ShowMinddleNative(RectTransform rectTransform, Camera pCom = null, string position = "", NativeTemplateStyle nativeTemplateStyle = null) { AdsActionEvents.TrackAdPosition(AdsType.Native, position); if (!IsMinddleNativeReady()) { AdsActionEvents.TrackAdFailToShow(AdsType.Native, position, AdsShowFailType.NoFill); return; } if (nativeTemplateStyle == null) { nativeTemplateStyle = new NativeTemplateStyle { TemplateId = NativeTemplateId.Small, MainBackgroundColor = Color.white }; } var adUnitId = StaticValue.AdmobMinddleNativeId; var nativeAdPosition = NativeAdPosition.Create(nativeTemplateStyle, rectTransform, pCom); AdsSDKManager.Instance.ShowNativeAd(position, adUnitId, nativeAdPosition); } public void HideMinddleNative() { var adUnitId = StaticValue.AdmobMinddleNativeId; AdsSDKManager.Instance.RemoveNativeAd(adUnitId); } #endregion #region 埋点 public void LogEvent(string eventName) { ShuShuEvent.Instance.Track(eventName); FireBaseAnalyticsManager.Instance.LogEvent(eventName); AdjustTrackEvent.Instance.TrackEventName(eventName, new Dictionary()); } public void LogEvent(string eventName, string key1, object value1) { ShuShuEvent.Instance.Track(eventName, key1, value1); FireBaseAnalyticsManager.Instance.LogEvent(eventName, key1, value1); AdjustTrackEvent.Instance.TrackEventName(eventName, new Dictionary { [key1] = value1 }); } public void LogEvent(string eventName, Dictionary extraInfo) { ShuShuEvent.Instance.Track(eventName, extraInfo); FireBaseAnalyticsManager.Instance.LogEvent(eventName, extraInfo); AdjustTrackEvent.Instance.TrackEventName(eventName, extraInfo); } /// /// 公共事件属性 /// /// public void SetSuperProperties(Dictionary args) { ShuShuEvent.Instance.SetSuperProperties(args); FireBaseAnalyticsManager.Instance.SetSuperProperties(args); } /// /// 用户属性 /// /// public void SetUserProperties(Dictionary args) { ShuShuEvent.Instance.UserSet(args); FireBaseAnalyticsManager.Instance.SetUserProperty(args); } #endregion #region 在线参数 public bool GetRemoteConfigBool(string key, bool defaultValue = false) { if (Application.isEditor) { return defaultValue; } return FireBaseRemoteConfigManager.Instance.GetRemoteConfigBool(key, defaultValue); } public int GetRemoteConfigInt(string key, int defaultValue = 0) { if (Application.isEditor) { return defaultValue; } return FireBaseRemoteConfigManager.Instance.GetRemoteConfigInt(key, defaultValue); } public string GetRemoteConfigStr(string key, string defaultValue = "") { if (Application.isEditor) { return defaultValue; } return FireBaseRemoteConfigManager.Instance.GetRemoteConfigString(key, defaultValue); } public float GetRemoteConfigFloat(string key, float defaultValue = 0) { if (Application.isEditor) { return defaultValue; } return FireBaseRemoteConfigManager.Instance.GetRemoteConfigFloat(key, defaultValue); } #endregion /// /// 是否是自然量用户 /// /// public bool InOrganic() { return AdjustNetwork.Instance.InOrganic(); } public string GetGaid() { if (Application.isEditor) { return "gaid"; } return AdjustManager.Instance.GetGdid(); } public string GetAndroidId() { if (Application.isEditor) { return "androidid"; } string androidId = "unknown"; try { using (AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer")) using (AndroidJavaObject currentActivity = unityPlayer.GetStatic("currentActivity")) using (AndroidJavaClass settingsSecure = new AndroidJavaClass("android.provider.Settings$Secure")) { // 调用 Settings.Secure.getString() 方法获取 ANDROID_ID androidId = settingsSecure.CallStatic( "getString", currentActivity.Call("getContentResolver"), "android_id" ); } } catch (System.Exception e) { LoggerUtils.Error("获取 Android ID 出错: " + e.Message); } return androidId; } public string GetAdid() { if (Application.isEditor) { return "adid"; } return AdjustManager.Instance.GetAdid(); } public string GetUserAgent() { if (Application.isEditor) { return "GetUserAgent"; } try { // 获取Java的System类 using (AndroidJavaClass systemClass = new AndroidJavaClass("java.lang.System")) { // 调用System.getProperty("http.agent")方法 string httpAgent = systemClass.CallStatic("getProperty", "http.agent"); return httpAgent; } } catch (System.Exception e) { Debug.LogError("获取http.agent失败: " + e.Message); return null; } } public string GetSSAccountId() { if (Application.isEditor) { return "GetSSAccountId"; } return ""; } public string GetSSDistinctId() { if (Application.isEditor) { return "GetSSDistinctId"; } LoggerUtils.Debug("GetSSDistinctId:" + TDAnalytics.GetDistinctId()); return TDAnalytics.GetDistinctId(); } public string GetSSSuperProperties() { if (Application.isEditor) { return "GetSSSuperProperties"; } var superProperties = TDAnalytics.GetSuperProperties(); LoggerUtils.Debug("GetSSDistinctId:" + JsonMapper.ToJson(superProperties)); return superProperties == null ? "" : superProperties.ToString(); } public void OpenPrivacy() { Application.OpenURL(StaticValue.PrivacyUrl); } }