using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using Touka; #if USE_IAP using UnityEngine.Purchasing; #endif public class TKGSDKManager : TKGSingleton { public bool IsNoAllAD { get => mIsNoAllAD; set { mIsNoAllAD = value; if (mIsNoAllAD) { PurchasedRemoveAds(); HideBanner(); } } } private bool mIsNoAllAD = false; public bool IsRemoveAds { get => mIsRemoveAds; set { mIsRemoveAds = value; if (mIsRemoveAds) { PurchasedRemoveAds(); HideBanner(); } } } private bool mIsRemoveAds = false; public bool IsIAPEnabled { get { AppChannel tChannel = GetChannel(); return (tChannel == AppChannel.AppStore_GB || tChannel == AppChannel.GooglePlay); } } private int mLoginCount { get => PlayerPrefs.GetInt(nameof(mLoginCount), 0); set => PlayerPrefs.SetInt(nameof(mLoginCount), value); } private int mPassCount { get => PlayerPrefs.GetInt(nameof(mPassCount), 0); set => PlayerPrefs.SetInt(nameof(mPassCount), value); } private bool mHasPoppedReview { get => PlayerPrefs.GetInt(nameof(mHasPoppedReview), 0) == 1; set => PlayerPrefs.SetInt(nameof(mHasPoppedReview), value ? 1 : 0); } private bool isInit = false; /// /// 支付成功时回调 /// orderID, productName, productID, purchaseResult, gameExtra /// public Action OnPurchaseDone; private ITKGSDK m_sdkInterface; protected override void OnInstanceCreate() { base.OnInstanceCreate(); m_sdkInterface = new TKGSDKNative(); } /// /// init sdk /// /// public void InitSDK(Action _initCallback = null) { if (isInit) return; #if USE_IAP TKGDebugger.LogDebug("USE_IAP = True"); IAPTool.Instance.PreInitialize(); #else TKGDebugger.LogDebug("USE_IAP = False"); #endif m_sdkInterface.InitSDK(_initCallback); isInit = true; mLoginCount++; //if (IsIAPEnabled) //{ #if USE_IAP IAPTool.Instance.Initialize(); #endif //} } /// /// Set game focus /// /// public void SetGameFocusListener(Action _gameFocusAction) { m_sdkInterface.SetGameFocusListener(_gameFocusAction); } // reward click callback public void SetRewardClickListener(Action _clickCallback = null) { m_sdkInterface.SetRewardClickListener(_clickCallback); } // ads revenue callback // adsType, price, currency public void SetAdsRevenueCallback(Action _adsRevenueCallback) { TKGSDKCallback.SetAdsRevenueCallback(_adsRevenueCallback); } /// /// Get channel /// /// public AppChannel GetChannel() { return m_sdkInterface.GetChannel(); } /// /// Set log enable /// public void SetLogEnable(bool _enable) { StaticOtherConfig.IsDebugLog = _enable; m_sdkInterface.SetLogEnable(_enable); } #region Ads // 去广告接口调用 public void PurchasedRemoveAds() { m_sdkInterface.PurchasedRemoveAds(); } /// /// Show Interstitial Ad /// /// Name of interstitial ad placement. /// Callback of interstitial ad close and show interstitial failed /// IVADType for distinguish interstitial ads frequency, default use iv1 public void ShowInterstitialAd(TKGIVAdPositionName _adPos, Action _callback = null, IVADType _IvType = IVADType.IV1) { ShowInterstitialAd(_adPos.ToString(), _callback, _IvType); } public void ShowInterstitialAd(string _adPos, Action _callback = null, IVADType _IvType = IVADType.IV1) { #if UNITY_EDITOR || NO_AD if (null != _callback) { Debug.Log("Need Show IV, in editor directly invoke callback."); _callback.Invoke(); } return; #endif if (IsNoAllAD || IsRemoveAds) { _callback?.Invoke(); } else { m_sdkInterface.ShowInterstitialAd(_adPos, _callback, _IvType); } } /// /// Show Reward Ad /// /// Name of reward ad placement /// true:reward succ, false: reward failed /// Callback of reward ad show fail public void ShowRewardAd(TKGRVPositionName _adPos, Action _rewardCallback = null, Action _showFailedCallback = null, bool showSDKToast = false) { ShowRewardAd(_adPos.ToString(), _rewardCallback, _showFailedCallback, showSDKToast); } public void ShowRewardAd(string _adPos, Action _rewardCallback = null, Action _showFailedCallback = null, bool showSDKToast = false) { #if UNITY_EDITOR || NO_AD if (null != _rewardCallback) { _rewardCallback.Invoke(true); } return; #endif if (IsNoAllAD) { _rewardCallback?.Invoke(true); } else { m_sdkInterface.SetShowSDKToast(showSDKToast); m_sdkInterface.ShowRewardAd(_adPos, _rewardCallback, _showFailedCallback); } } public void ShowNative(RectTransform pRect, Camera pCam = null, string pAdPos = "") { #if !NO_AD if (!IsNoAllAD && !IsRemoveAds) { m_sdkInterface.ShowNativeAd(pRect, pCam, pAdPos); } #endif } /// /// Is Ready Interstitial /// /// public bool IsReadyInterstitialAd() { return m_sdkInterface.IsReadyInterstitialAd(); } /// /// Is Ready Reward /// /// public bool IsReadyRewardAd() { return m_sdkInterface.IsReadyRewardAd(); } /// /// Is Ready Native Ad /// /// public bool IsReadyNativeAd() { #if NO_AD return false; #else return m_sdkInterface.IsReadyNativeAd(); #endif } /// /// Show banner /// /// bannerAlign public void ShowBanner(TKGBannerAlign _bannerAlign) { #if !NO_AD if (!IsNoAllAD && !IsRemoveAds) { m_sdkInterface.ShowBanner(_bannerAlign); } #endif } /// /// Hide banner /// public void HideBanner() { m_sdkInterface.HideBanner(); } /// /// Remove Native /// public void RemoveNative() { m_sdkInterface.RemoveNativeAd(); } #endregion #region Log Event #region Normal /// /// Log Event /// /// public void LogEvent(string _eventSort) { m_sdkInterface.LogEvent(_eventSort); } /// /// Log Event /// /// /// /// public void LogEvent(string _eventSort, string _key, string _value) { m_sdkInterface.LogEvent(_eventSort, _key, _value); } /// /// Log Event /// /// /// /// /// /// public void LogEvent(string _eventSort, string _key01, string _value01, string _key02, string _value02) { m_sdkInterface.LogEvent(_eventSort, _key01, _value01, _key02, _value02); } /// /// Log Event /// /// /// public void LogEvent(string _eventSort, Dictionary _eventDic = null) { m_sdkInterface.LogEvent(_eventSort, _eventDic); } #endregion #region Level Event /// /// Level start /// /// public void LevelStart(int _level) { LevelStart(_level.ToString()); } /// /// Level start /// /// public void LevelStart(string _level) { m_sdkInterface.LevelStart(_level); } /// /// Level end /// /// /// public bool LevelEnd(int _level, StageResult _stageResult) { return LevelEnd(_level.ToString(), _stageResult); } /// /// Level end,if return false, it means review pops up. /// /// /// public bool LevelEnd(string _level, StageResult _stageResult) { m_sdkInterface.LevelEnd(_level, _stageResult); if (_stageResult == StageResult.StageSucc) { mPassCount++; #if UNITY_IOS //only ios has review popup return !CheckReviewPop(mPassCount); #endif } return true; } private bool CheckReviewPop(int pLevel) { if (mHasPoppedReview) return false; if (mLoginCount == 1 && pLevel == StaticOtherConfig.FirstLoginPopLevel) { Debug.Log("pop first review"); mHasPoppedReview = true; Review(); return true; } else if (mLoginCount > 1 && pLevel == StaticOtherConfig.OtherLoginPopLevel) { Debug.Log("pop other review"); mHasPoppedReview = true; Review(); return true; } return false; } #endregion #region Reward Ad Button Show /// /// Log Reward ad button show /// /// public void LogRewardAdBtnShow(string _pos) { m_sdkInterface.LogRewardAdBtnShow(_pos); } #endregion #region Tracking Event /// /// Log Tracking Event /// /// private void LogTrackingEvent(TrackingEventType _eventType) { //m_sdkInterface.LogTrackingEvent(_eventType); } #endregion #endregion #region Online Config /// /// get config - string /// /// /// public string GetConfigStr(string _key) { return m_sdkInterface.GetConfigStr(_key); } public string GetConfigStr(TKGParamKey _key) { return m_sdkInterface.GetConfigStr(_key.ToString()); } /// /// get config - int /// /// /// public int GetConfigInt(string _key) { return m_sdkInterface.GetConfigInt(_key); } public int GetConfigInt(TKGParamKey _key) { return m_sdkInterface.GetConfigInt(_key.ToString()); } /// /// get config - bool /// /// /// public bool GetConfigBool(string _key) { return m_sdkInterface.GetConfigBool(_key); } public bool GetConfigBool(TKGParamKey _key) { return m_sdkInterface.GetConfigBool(_key.ToString()); } #endregion #region Others (common) /// /// review /// public void Review() { m_sdkInterface.Review(); } /// 使用 OpenPolicyPop 接口 === Use OpenPolicyPop /// 使用 OpenPolicyPop 接口 === Use OpenPolicyPop /// 使用 OpenPolicyPop 接口 === Use OpenPolicyPop /// /// open privacy url /// //public void OpenPrivacyURL() //{ // m_sdkInterface.OpenPrivacyURL(); //} /// 使用 OpenPolicyPop 接口 === Use OpenPolicyPop /// 使用 OpenPolicyPop 接口 === Use OpenPolicyPop /// 使用 OpenPolicyPop 接口 === Use OpenPolicyPop /// /// open user agreement url /// //public void OpenUserTermURL() //{ // m_sdkInterface.OpenUserTermURL(); //} /// /// open more game /// public void OpenMoreGame() { m_sdkInterface.OpenMoreGame(); } /// /// show picture cross /// public bool showPictureCross() { return m_sdkInterface.showPictureCross(); } /// /// remove picture cross /// public void removePictureCross() { m_sdkInterface.removePictureCross(); } /// /// show more game icon /// public bool showMoreGameIcon() { return m_sdkInterface.showMoreGameIcon(); } /// /// remove more game icon /// public void removeMoreGameIcon() { m_sdkInterface.removeMoreGameIcon(); } /// /// open url by browser /// /// public void OpenUrlByBrowser(string _url) { m_sdkInterface.OpenUrlByBrowser(_url); } public void OpenPolicyPop() { m_sdkInterface.OpenPolicyPop(); } /// /// shake /// /// 0 light,1 medium,2 heavy /// ios 0~1, android any num public void Shake(int _shakeType, float _intensity = 1) { m_sdkInterface.Shake(_shakeType, _intensity); } /// /// if is debug mode /// public bool IsDebugMode() { return m_sdkInterface.IsDebugMode(); } /// /// get user name and user id card /// format will be "Jack_654121199212099999" /// public string GetUserNameAndUserIDCard() { return m_sdkInterface.GetUserNameAndUserIDCard(); } /// /// set segment type to sdk /// /// segment type public void SetSegment(SegmentType type) { m_sdkInterface.SetSegment(type); } /// /// get a iap product list for sdk config file /// public Dictionary GetIAPProductList() { return m_sdkInterface.GetIAPProductList(); } /// /// share txt /// /// public void Share(string shareText) { m_sdkInterface.ShareTxt(shareText); } /// /// regist APNS /// public void RegistAPNS() { m_sdkInterface.RegistAPNS(); } /// /// shake /// /// notification identifier /// The body of the notification. /// notify after the time interval. format:yyyy-MM-dd HH:mm:ss /// The application badge number. /// The title of the notification. /// The subtitle of the notification. public void RegistNotification(string notiId, string body, string fireDate, int badge = 1, string title = "", string subTitle = "") { m_sdkInterface.RegistNotification(notiId, body, fireDate, badge, title, subTitle); } /// /// remove all notification /// public void RemoveAllNotifications() { m_sdkInterface.RemoveAllNotifications(); } /// /// remove notification by notification identifier /// /// notification identifier public void RemoveNotification(string notiId) { m_sdkInterface.RemoveNotification(notiId); } #endregion #region others public void Toast(string text) { m_sdkInterface.Toast(text); } /// /// Set user source listener /// only call first can back source /// /// true : origin user,false : not origin user 2 public void SetUserSourceListener(Action _userSourceAction) { m_sdkInterface.SetUserSourceListener(_userSourceAction); } /// /// Set user source listener /// only call first can back source /// with campaginName /// /// true : origin user,false : not origin user 2 public void SetUserSourceListener(Action _userSourceAction) { m_sdkInterface.SetUserSourceListener(_userSourceAction); } /// /// set common callback /// /// public void SetTKGCommonCallback(Action _commonCallbackAction) { m_sdkInterface.SetTKGCommonCallback(_commonCallbackAction); } /// /// 注册功能开关回调 /// /// 各功能名称 /// 回调事件,回来每个功能名称及对应开关 public void SetFunctionSwitchListener(List _functionKeys, Action _functionSwitchCallback) { m_sdkInterface.SetFunctionSwitchListener(_functionKeys, _functionSwitchCallback); } #endregion #region 数据中台 /// /// 内购成功后上报价格 /// /// 商品价格 public void LogPurchasePrice(string price, string currency) { m_sdkInterface.LogPurchasePrice(price, currency); } /// /// Robux点击提现按钮 /// public void LogRobuxCashOut() { m_sdkInterface.LogRobuxCashOut(); } /// /// 完成新手引导 /// public void LogNoviceGuideFinish() { m_sdkInterface.LogNoviceGuideFinish(); } #endregion #region GooglePlay评论引导 /// /// Pop up GooglePlay Rate guid /// public bool GuidGpComment() { return m_sdkInterface.GuidGpComment(); } #endregion #region 用户登录 /// /// User Login /// /// 登录类型 /// 登录回调Action<登录状态码,登录类型,登录状态信息,userid,token,邮箱 , 显示名称 , 头像url public void Login(LoginType _loginType, Action _loginResultCallback = null) { m_sdkInterface.Login(_loginType, _loginResultCallback); } /// /// 自动根据上次登陆的类型进行登陆,登陆失败需要跳转到登陆界面。 /// /// public void AutoLogin( Action _loginResultCallback = null) { m_sdkInterface.AutoLogin(_loginResultCallback); } /// /// 获取当前账号类型。 用于显示绑定界面。 /// /// public LoginType GetAccountType() { return m_sdkInterface.GetAccountType(); } /// /// 是否可以自动登陆 /// /// public bool IsCanAutoLogin() { return m_sdkInterface.IsCanAutoLogin(); } /// /// Logout /// /// public void Logout(Action _logoutCallback = null) { m_sdkInterface.Logout(_logoutCallback); } /// /// Obtain a list of login channels, /// and the game displays the obtained login list for users to choose to log in. /// /// available login channels public List AvailableLoginChannelList() { return m_sdkInterface.AvailableLoginChannelList(); } /// /// user actively deletes account. /// /// Return the deleted userId. If the game needs to record it, you can operate it in the action. /// /// code Delete userId public void DeleteAccount(Action deleteAccountCallback = null) { m_sdkInterface.DeleteAccount(deleteAccountCallback); } /// /// Social account binding for Guester. /// 游客绑定社交账号 /// /// 游戏发起社交账号的绑定: /// 根据 Action中的BindAccountStatus判断 /// 如果 BindAccountStatus == BindAccountStatus.BIND_CODE_SUCC /// 需要判断userId和当前userId是否一致,如果不一致,需要切换账号,或者重启游戏。如果一致,无需操作。 /// 如果 BindAccountStatus == BindAccountStatus.BIND_CODE_SELECT /// 这个是因为第三方账号已经被绑定过了,string[] 中将会返回已经绑定的userId,和当前userId,游戏需要展示出来提供给玩家选择, /// 玩家选择完成后,需要将 /// /// 其情况,游戏做相应操作 /// /// /// /// /// 社交账号类型 /// 是否强制绑定 /// 绑定的userId /// 回调的信息 private void BindAccount(LoginType type, BindType isForce = BindType.NO_FORCE, string userId = "", Action bindAccountCallback = null) { m_sdkInterface.BindAccount(type, isForce, userId, bindAccountCallback); } private LoginType bindLoginType = LoginType.LOGIN_BY_GUESTER; /// /// Social account binding for Guester. /// /// 情况一 : bindAccountStatusEnum == BindAccountStatus.BIND_CODE_SUCC 绑定成功 /// 绑定成功的时候,需要获取 userId和当前userId是否一致, 如果不一致,需要重新切换到新的userId账号上来。 (切换账号) /// 情况二 : BindAccountStatus == BindAccountStatus.BIND_CODE_SELECT 社交账号已经绑定了其他账号 (社交账号已经在其他设备上登陆) /// 需要获取到userIdList 里面的userId列表,获取到userId对应的角色/关卡信息,展示出来供玩家选择。 玩家选择完成之后调用 `ForceBindAccount` 接口将选中的userId传递进去,进行强制绑定 /// ⚠️ 如果选择的是当前账号强制绑定,那么社交账号原有的账号将会被删除 /// 如果选择的是社交账号关联的账号,那么当前账号将会被删除 /// /// /// /// 社交账号类型 /// bindAccountStatusEnum, loginTypeEnum, _msg, _userId, _token, _email,_displayName, _photoUrl, userIdList public void BindAccount(LoginType type, Action bindAccountCallback = null) { bindLoginType = type; BindAccount(type, isForce: BindType.NO_FORCE, userId: "", bindAccountCallback); } public void ForceBindAccount(string userId, Action bindAccountCallback = null) { BindAccount(bindLoginType, BindType.FORCE, userId, bindAccountCallback); } #endregion #region IAP Event /// /// Log IAP button show /// /// Product name (customized on the game side) English name of the product cannot contain special characters ex: Gem100 /// Product ID: The ID of a specific product type public void LogIAPBtnShow(string productName, string productId) { m_sdkInterface.LogIAPBtnShow(productName, productId); } #endregion #region 保存数据 /// /// 保存数据到账号上去(云存储) /// /// string内容存储 /// 上传结果 public void SaveCloudArchiving(string content,Action callback) { m_sdkInterface.SaveCloudArchiving(content, callback); } /// /// 获取云存储的当前账号数据 /// /// public void DetailCloudArchiving(Action callback) { m_sdkInterface.DetailCloudArchiving(callback); } #endregion #region IAP /// /// Add payment result callback; /// orderID, productName, productID, purchaseResult, gameExtra /// /// Purchase result callback public void SetOnPurchaseDone(Action onPurchaseDoneAction) { OnPurchaseDone = onPurchaseDoneAction; } #if USE_IAP /// /// Commodity information acquisition callback; /// /// All product information /// ex: /// Product[0].metadata.localizedTitle /// Product[0].metadata.localizedPriceString /// Product[0].metadata.localizedDescription /// Product[0].metadata.isoCurrencyCode public void OnGetProductsInfo(Action onGetProductsInfo) { #if USE_IAP IAPTool.Instance.OnGetProductsInfo += onGetProductsInfo; #endif } /// /// Get product info by product id; /// /// Product ID /// Product Info metadata public Product GetProductInfoByID(string productID) { #if USE_IAP return IAPTool.Instance.GetProductInfoByID(productID); #else return null; #endif } #endif /// /// Get product price by product id; /// /// Product ID /// Product price public string GetPriceByID(string productID) { #if USE_IAP return IAPTool.Instance.GetPriceByID(productID); #else return ""; #endif } #if USE_IAP /// ///[In-game props,gold,gift packs, etc.] Purchase products according to the product ID; /// /// Product ID /// Product ID /// Purchase result callback /// Product ID public void BuyProductByID(string productId, string enProductName, string gameExtraParam = "") { #if USE_IAP IAPTool.Instance.BuyProductByID(productId, enProductName, gameExtraParam); #endif } #endif #if USE_IAP /// /// Add products ID dynamically; /// /// Product IDs /// bool Is it added successfully string Additional Information public void AddProducts(Dictionary products) { #if USE_IAP IAPTool.Instance.AddProducts(products); #endif } #endif /// /// Restore Purchases; /// public void RestorePurchases() { #if USE_IAP IAPTool.Instance.RestorePurchases(); #endif } #endregion #region serve for wz /// /// Set userid and third account /// /// userID (Unique user id) /// third account /// third account type public void SetUserIDAndThirdAccount(string _userID, string _thirdAccount, ThirdAccountType _thirdAccountType) { Debug.Log("【TKGNativeInterfaceAndroid】 SetUserIDAndThirdAccount _userID : " + _userID + " , _thirdAccount : " + _thirdAccount + " , _thirdAccountType : " + _thirdAccountType); TKGNativeInterface.Instance.SetUserIDAndThirdAccount(_userID, _thirdAccount, _thirdAccountType); } #endregion }