448 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			448 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C#
		
	
	
	
|  | 
 | |||
|  | 
 | |||
|  | using System; | |||
|  | using System.Collections; | |||
|  | using System.Collections.Generic; | |||
|  | using System.IO; | |||
|  | using System.Linq; | |||
|  | using System.Xml.Linq; | |||
|  | using UnityEditor; | |||
|  | using UnityEngine; | |||
|  | using UnityEngine.Networking; | |||
|  | using UnityEditor.PackageManager.Requests; | |||
|  | using UnityEditor.PackageManager; | |||
|  | using System.Threading.Tasks; | |||
|  | using System.Threading; | |||
|  | 
 | |||
|  | namespace AnyThink.Scripts.IntegrationManager.Editor | |||
|  | { | |||
|  |     public class ATIntegrationManager | |||
|  |     { | |||
|  |         public static ATIntegrationManager Instance = new ATIntegrationManager(); | |||
|  | 
 | |||
|  |         // private UnityWebRequest downloadPluginRequest; | |||
|  | 
 | |||
|  |         private const string AnyThinkAds = "AnyThinkAds"; | |||
|  |         //AnyThink的unity插件 | |||
|  |         public static string AnyThinkNetworkName = "Core"; | |||
|  | 
 | |||
|  |         private PluginData mPluginData; | |||
|  | 
 | |||
|  |         private ATIntegrationManager() | |||
|  |         { | |||
|  | 
 | |||
|  |         } | |||
|  | 
 | |||
|  |         public void CancelDownload() | |||
|  |         { | |||
|  |             // if (downloadPluginRequest == null) return; | |||
|  | 
 | |||
|  |             // downloadPluginRequest.Abort(); | |||
|  |         } | |||
|  | 
 | |||
|  |         public IEnumerator loadPluginData(Action<PluginData> callback) | |||
|  |         { | |||
|  |             var thinkupVersionRequest = UnityWebRequest.Get(ATNetInfo.getPluginConfigUrl(ATConfig.PLUGIN_VERSION)); | |||
|  |             var webRequest = thinkupVersionRequest.SendWebRequest(); | |||
|  |             while (!webRequest.isDone) | |||
|  |             { | |||
|  |                 yield return new WaitForSeconds(0.1f); | |||
|  |             } | |||
|  | 
 | |||
|  | #if UNITY_2020_1_OR_NEWER | |||
|  |             if (thinkupVersionRequest.result != UnityWebRequest.Result.Success) | |||
|  | #elif UNITY_2017_2_OR_NEWER | |||
|  |             if (thinkupVersionRequest.isNetworkError || thinkupVersionRequest.isHttpError) | |||
|  | #else | |||
|  |             if (thinkupVersionRequest.isError) | |||
|  | #endif | |||
|  |             { | |||
|  |                 Debug.Log("loadPluginData failed."); | |||
|  |                 callback(null); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 //解析Anythink的版本数据 | |||
|  |                 string thinkupVersionJson = thinkupVersionRequest.downloadHandler.text; | |||
|  |                 PluginData pluginData = ATDataUtil.parsePluginDataJson(thinkupVersionJson); | |||
|  |                 Debug.Log("loadPluginData succeed. country: " + pluginData.country + " androidVersions: "  | |||
|  |                 + pluginData.androidVersions + " iosVersions: " + pluginData.iosVersions); | |||
|  |                 mPluginData = pluginData; | |||
|  |                 callback(pluginData); | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         public IEnumerator loadNetworksData(PluginData pluginData, Action<PluginData> callback) | |||
|  |         { | |||
|  | 
 | |||
|  |             Network network = pluginData.anyThink; | |||
|  |             if (pluginData == null) | |||
|  |             { | |||
|  |                 callback(null); | |||
|  |             } | |||
|  |             else if (pluginData.requestParams == null) { | |||
|  |                 ATLog.log("loadNetworksData() >>> pluginData.requestParams is null"); | |||
|  |                 callback(pluginData); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 var networksRequest = UnityWebRequest.Get(ATNetInfo.getNetworkListUrl(ATConfig.PLUGIN_VERSION)); | |||
|  |                 var webRequest = networksRequest.SendWebRequest(); | |||
|  |                 while (!webRequest.isDone) | |||
|  |                 { | |||
|  |                     yield return new WaitForSeconds(0.1f); | |||
|  |                 } | |||
|  | 
 | |||
|  | #if UNITY_2020_1_OR_NEWER | |||
|  |             if (networksRequest.result != UnityWebRequest.Result.Success) | |||
|  | #elif UNITY_2017_2_OR_NEWER | |||
|  |             if (networksRequest.isNetworkError || networksRequest.isHttpError) | |||
|  | #else | |||
|  |                 if (networksRequest.isError) | |||
|  | #endif | |||
|  |                 { | |||
|  |                     Debug.Log("loadNetworksData failed."); | |||
|  |                     callback(pluginData); | |||
|  |                 } | |||
|  |                 else | |||
|  |                 { | |||
|  |                     //解析network列表的版本数据 | |||
|  |                     string netowrksJson = networksRequest.downloadHandler.text; | |||
|  |                     ATLog.log("loadNetworksData() >>> netowrksJson: " + netowrksJson); | |||
|  |                     pluginData.mediatedNetworks = ATDataUtil.parseNetworksJson(pluginData, netowrksJson); | |||
|  |                     ATLog.log("loadNetworksData() >>> mediatedNetworks: " + pluginData.mediatedNetworks); | |||
|  |                     mPluginData = pluginData; | |||
|  |                     callback(pluginData); | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         /// <summary> | |||
|  |         /// Downloads the plugin file for a given network. | |||
|  |         /// </summary> | |||
|  |         /// <param name="network">Network for which to download the current version.</param> | |||
|  |         /// <param name="showImport">Whether or not to show the import window when downloading. Defaults to <c>true</c>.</param> | |||
|  |         /// <returns></returns> | |||
|  |         public void downloadPlugin(Network network, int os =1, bool showImport = false) | |||
|  |         { | |||
|  |             ATEditorCoroutine.startCoroutine(downloadPluginWithEnumerator(network, os, showImport)); | |||
|  |         } | |||
|  | 
 | |||
|  |         public IEnumerator downloadPluginWithEnumerator(Network network, int os, bool showImport) | |||
|  |         { | |||
|  |             ATLog.log("downloadPluginWithEnumerator() >>> networkName: " + network.Name + " os: " + os); | |||
|  |             // if (downloadPluginRequest != null) | |||
|  |             // { | |||
|  |             //     downloadPluginRequest.Dispose(); | |||
|  |             // } | |||
|  |             var path = Path.Combine(Application.temporaryCachePath, network.PluginFileName); | |||
|  |             ATLog.log("downloadPluginWithEnumerator() >>> path: " + path); | |||
|  | #if UNITY_2017_2_OR_NEWER | |||
|  |             var downloadHandler = new DownloadHandlerFile(path); | |||
|  | #else | |||
|  |             var downloadHandler = new ATDownloadHandler(path); | |||
|  | #endif | |||
|  |             var downloadUrl = network.AndroidDownloadUrl; | |||
|  |             if (os == ATConfig.OS_IOS)  | |||
|  |             { | |||
|  |                 downloadUrl = network.iOSDownloadloadUrl; | |||
|  |             } | |||
|  |             UnityWebRequest downloadPluginRequest = new UnityWebRequest(downloadUrl)  | |||
|  |             {    method = UnityWebRequest.kHttpVerbGET, | |||
|  |                 downloadHandler = downloadHandler | |||
|  |             }; | |||
|  | 
 | |||
|  | #if UNITY_2017_2_OR_NEWER | |||
|  |             var operation = downloadPluginRequest.SendWebRequest(); | |||
|  | #else | |||
|  |             var operation = downloadPluginRequest.Send(); | |||
|  | #endif | |||
|  |             while (!operation.isDone) | |||
|  |             { | |||
|  |                 yield return new WaitForSeconds(0.1f); // Just wait till downloadPluginRequest is completed. Our coroutine is pretty rudimentary. | |||
|  |                 if (operation.progress != 1 && operation.isDone) | |||
|  |                 { | |||
|  |                     // CallDownloadPluginProgressCallback(network.DisplayName, operation.progress, operation.isDone, os); | |||
|  |                     UpdateCurrentVersions(network, os); | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  | #if UNITY_2020_1_OR_NEWER | |||
|  |             if (downloadPluginRequest.result != UnityWebRequest.Result.Success) | |||
|  | #elif UNITY_2017_2_OR_NEWER | |||
|  |             if (downloadPluginRequest.isNetworkError || downloadPluginRequest.isHttpError) | |||
|  | #else | |||
|  |             if (downloadPluginRequest.isError) | |||
|  | #endif | |||
|  |             { | |||
|  |                 ATLog.logError(downloadPluginRequest.error); | |||
|  |             } | |||
|  |             else | |||
|  |             { | |||
|  |                 AssetDatabase.ImportPackage(path, showImport); | |||
|  |                 UpdateCurrentVersions(network, os); | |||
|  |                 AssetDatabase.Refresh(); | |||
|  |             } | |||
|  |             downloadPluginRequest.Dispose(); | |||
|  |             downloadPluginRequest = null; | |||
|  |         } | |||
|  | 
 | |||
|  |          //默认下载core包,在下载完network的数据时。 | |||
|  |         public void downloadCorePlugin(PluginData pluginData) | |||
|  |         {    | |||
|  |             mPluginData = pluginData; | |||
|  |             var requestParams = pluginData.requestParams; | |||
|  |             var pluginSettingData = pluginData.pluginSettingData; | |||
|  | 
 | |||
|  |             bool isIosInstalled = ATConfig.isCoreNetworkInstalled(pluginSettingData, ATConfig.OS_IOS); | |||
|  |             bool isAndroidInstalled = ATConfig.isCoreNetworkInstalled(pluginSettingData, ATConfig.OS_ANDROID); | |||
|  |             ATLog.log("downloadCorePlugin() >>> isIosInstalled: " + isIosInstalled + " isAndroidInstalled: " + isAndroidInstalled); | |||
|  | 
 | |||
|  |             Network network = pluginData.anyThink; | |||
|  |             int os = requestParams.os; | |||
|  |             if (os == ATConfig.OS_ANDROID) { | |||
|  |                 if (!isAndroidInstalled) { | |||
|  |                     downloadPlugin(network, os); | |||
|  |                 } else { | |||
|  |                     //判断是否需要切换SDK | |||
|  |                     var latestVersions = network.LatestVersions; | |||
|  |                     var curVersion = network.CurrentVersions; | |||
|  |                     if (latestVersions.Android != curVersion.Android) { | |||
|  |                         //先删除掉core包 | |||
|  |                         ATConfig.removeSdk(pluginData.country, os); | |||
|  |                         removeNetworkVersions(pluginData, os); | |||
|  |                         //赋值当前版本为空 | |||
|  |                         curVersion.Android = ""; | |||
|  |                         //重新下载core包 | |||
|  |                         downloadPlugin(network, os); | |||
|  |                         //重新下载已安装的network | |||
|  |                         redownloadNetworksPlugin(pluginData, os); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } else if (os == ATConfig.OS_IOS){ | |||
|  |                 if (!isIosInstalled) { | |||
|  |                     downloadPlugin(network, os); | |||
|  |                 } else { | |||
|  |                     //判断是否需要切换SDK | |||
|  |                     var latestVersions = network.LatestVersions; | |||
|  |                     var curVersion = network.CurrentVersions; | |||
|  |                     if (latestVersions.Ios != curVersion.Ios) { | |||
|  |                         //先删除掉core包 | |||
|  |                         ATConfig.removeSdk(pluginData.country, os); | |||
|  |                         removeNetworkVersions(pluginData, os); | |||
|  |                         //赋值当前版本为空 | |||
|  |                         curVersion.Ios = ""; | |||
|  |                         //重新下载core包 | |||
|  |                         downloadPlugin(network, os); | |||
|  |                         //重新下载已安装的network | |||
|  |                         redownloadNetworksPlugin(pluginData, os); | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         //当切换SDK版本时,需要重新下载已安装的network | |||
|  |         private void redownloadNetworksPlugin(PluginData pluginData, int os) { | |||
|  |             var mediatedNetworks = pluginData.mediatedNetworks; | |||
|  |             var needInstallNetworkList = new List<Network>(); | |||
|  |             foreach(Network network in mediatedNetworks) { | |||
|  |                 var currentVersion = network.CurrentVersions; | |||
|  |                 if (currentVersion != null) { | |||
|  |                     if (os == ATConfig.OS_ANDROID) { | |||
|  |                         if (!string.IsNullOrEmpty(currentVersion.Android)) { | |||
|  |                             needInstallNetworkList.Add(network); | |||
|  |                         } | |||
|  |                     } else { | |||
|  |                         if (!string.IsNullOrEmpty(currentVersion.Ios)) { | |||
|  |                             needInstallNetworkList.Add(network); | |||
|  |                         } | |||
|  |                     } | |||
|  |                 } | |||
|  |             } | |||
|  |             if (needInstallNetworkList.Count() == 0) { | |||
|  |                 return; | |||
|  |             } | |||
|  |             Thread.Sleep(500); | |||
|  |             ATEditorCoroutine.startCoroutine(UpgradeAllNetworks(needInstallNetworkList, os)); | |||
|  |         } | |||
|  | 
 | |||
|  |         private IEnumerator UpgradeAllNetworks(List<Network> networks, int os) { | |||
|  |             EditorApplication.LockReloadAssemblies(); | |||
|  |             foreach (var network in networks) | |||
|  |             { | |||
|  | 
 | |||
|  |                 yield return downloadPluginWithEnumerator(network, os, false); | |||
|  |             } | |||
|  |             EditorApplication.UnlockReloadAssemblies(); | |||
|  |         } | |||
|  | 
 | |||
|  |         public void networkInstallOrUpdate(PluginData pluginData, Network network, int os) | |||
|  |         { | |||
|  |             downloadPlugin(network, os); | |||
|  |         } | |||
|  | 
 | |||
|  |         //更新network已安装的版本 | |||
|  |         private void UpdateCurrentVersions(Network network, int os) | |||
|  |         { | |||
|  |             var latestVersions = network.LatestVersions; | |||
|  |             var versions = network.CurrentVersions; | |||
|  |             if (versions == null) { | |||
|  |                 versions = new Versions(); | |||
|  |             } | |||
|  |             if (os == ATConfig.OS_ANDROID) { | |||
|  |                 versions.Android = latestVersions.Android; | |||
|  |             } else { | |||
|  |                 versions.Ios = latestVersions.Ios; | |||
|  |             } | |||
|  |             network.CurrentVersions = versions; | |||
|  | 
 | |||
|  |             // await Task.Delay(1000); | |||
|  |             // Thread.Sleep(1000); | |||
|  |             //下面的逻辑会延迟一秒后执行,确保unitypackage先解压到本地 | |||
|  |             ATConfig.saveInstalledNetworkVersion(network, os); | |||
|  |             ATLog.log("UpdateCurrentVersions() >>> AndroidVersion: " + versions.Android); | |||
|  |             //保存Core Networkde | |||
|  |             if (ATConfig.isCoreNetwork(network.Name)) { | |||
|  |                 var countrySettingData = mPluginData.pluginSettingData.getCountrySettingData(); | |||
|  |                 if (os == ATConfig.OS_ANDROID) { | |||
|  |                     countrySettingData.android_version = latestVersions.Android; | |||
|  |                 } else { | |||
|  |                     countrySettingData.ios_version = latestVersions.Ios; | |||
|  |                 } | |||
|  |                  | |||
|  |                 ATConfig.savePluginSettingData(mPluginData.pluginSettingData); | |||
|  |             } | |||
|  |             // ATLog.log("UpdateCurrentVersions() >>> Name: " + network.Name + " latest Unity Version: " + network.LatestVersions.Unity); | |||
|  |         } | |||
|  | 
 | |||
|  |         //点击了界面的network删除按钮 | |||
|  |         public void uninstallNetwork(Network network, int os) | |||
|  |         { | |||
|  |             var result = ATConfig.removeInstalledNetwork(network, os); | |||
|  |             if (result) { | |||
|  |                 if (os == ATConfig.OS_ANDROID){ | |||
|  |                     network.CurrentVersions.Android = ""; | |||
|  |                 } else { | |||
|  |                     network.CurrentVersions.Ios = ""; | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         //切换国家 | |||
|  |         public void switchCountry(PluginData pluginData, int country) { | |||
|  |             pluginData.country = country; | |||
|  | 
 | |||
|  |             var pluginSettingData = pluginData.pluginSettingData; | |||
|  |             pluginSettingData.curCountry = country; | |||
|  | 
 | |||
|  |             ATConfig.savePluginSettingData(pluginSettingData); | |||
|  |         } | |||
|  | 
 | |||
|  |         //获取AndroidX开关状态 | |||
|  |         public int getAndroidXSetting(PluginData pluginData) { | |||
|  |             if (pluginData == null) { | |||
|  |                 return 0; | |||
|  |             } | |||
|  |             var pluginSettingData = pluginData.pluginSettingData; | |||
|  |             if (pluginSettingData == null) { | |||
|  |                 return 0; | |||
|  |             } | |||
|  |             CountrySettingData countrySettingData = pluginSettingData.getCountrySettingData(); | |||
|  |             return countrySettingData.androidXSetting; | |||
|  |         } | |||
|  | 
 | |||
|  |         //设置并保存AndroidX开关状态 | |||
|  |         public void saveAndroidXSetting(PluginData pluginData, int androidXSetting) { | |||
|  |             ATLog.log("saveAndroidXSetting() >>> androidXSetting: " + androidXSetting); | |||
|  |             var pluginSettingData = pluginData.pluginSettingData; | |||
|  |             CountrySettingData countrySettingData = pluginSettingData.getCountrySettingData(); | |||
|  |             countrySettingData.androidXSetting = androidXSetting; | |||
|  | 
 | |||
|  |             ATConfig.savePluginSettingData(pluginSettingData); | |||
|  |         } | |||
|  | 
 | |||
|  |         //根据系统判断Admob是否有安装 | |||
|  |         public bool isAdmobInstalled(int os) { | |||
|  |             return ATConfig.isNetworkInstalledByName("Admob", os); | |||
|  |         } | |||
|  | 
 | |||
|  |         public string getAdmobAppIdByOs(PluginData pluginData, int os) { | |||
|  |             if (pluginData == null) { | |||
|  |                 return ""; | |||
|  |             } | |||
|  |             //android_admob_app_id | |||
|  |             var countrySettingData = pluginData.pluginSettingData.getCountrySettingData(); | |||
|  |             return countrySettingData.getAdmobAppId(os); | |||
|  |         } | |||
|  | 
 | |||
|  |         //设置保存Admob app id | |||
|  |         public void setAdmobAppidByOs(PluginData pluginData, int os, string appId) { | |||
|  |             if (pluginData == null || pluginData.pluginSettingData == null) { | |||
|  |                 return; | |||
|  |             } | |||
|  |             var countrySettingData = pluginData.pluginSettingData.getCountrySettingData(); | |||
|  |             countrySettingData.setAdmobAppId(appId, os); | |||
|  | 
 | |||
|  |             ATConfig.savePluginSettingData(pluginData.pluginSettingData); | |||
|  |         } | |||
|  | 
 | |||
|  |         //删除某个版本的SDK | |||
|  |         public void deleteSdk(PluginData pluginData, string sdkVersion, int os) { | |||
|  |             ATLog.log("deleteSdk() >>> sdkVersion: " + sdkVersion + " os: " + os); | |||
|  |             //删除本地文件 | |||
|  |             ATConfig.removeSdk(pluginData.country, os); | |||
|  |             //修改UI显示 | |||
|  |             removeNetworkVersions(pluginData, os, true); | |||
|  |             var curVersions = pluginData.anyThink.CurrentVersions; | |||
|  |             //修改sdk本地配置文件 | |||
|  |             var pluginSettingData = pluginData.pluginSettingData; | |||
|  |             CountrySettingData countrySettingData = pluginSettingData.getCountrySettingData(); | |||
|  | 
 | |||
|  |             if (os == ATConfig.OS_ANDROID) { | |||
|  |                 curVersions.Android = ""; | |||
|  |                 countrySettingData.android_version = ""; | |||
|  |             } else { | |||
|  |                 curVersions.Ios = ""; | |||
|  |                 countrySettingData.ios_version = ""; | |||
|  |             } | |||
|  | 
 | |||
|  |             ATConfig.savePluginSettingData(pluginSettingData); | |||
|  |         } | |||
|  | 
 | |||
|  |         private void removeNetworkVersions(PluginData pluginData, int os, bool isDeleteSdk = false) { | |||
|  |             if (isDeleteSdk) { | |||
|  |                 var mediatedNetworks = pluginData.mediatedNetworks; | |||
|  |                 if (mediatedNetworks != null && mediatedNetworks.Length > 0) { | |||
|  |                     foreach(Network network in mediatedNetworks) { | |||
|  |                         var currentVersion = network.CurrentVersions; | |||
|  |                         if (currentVersion != null) { | |||
|  |                             if (os == ATConfig.OS_ANDROID) { | |||
|  |                                 currentVersion.Android = ""; | |||
|  |                             } else { | |||
|  |                                 currentVersion.Ios = ""; | |||
|  |                             } | |||
|  |                         } | |||
|  |                         var latestVersions = network.LatestVersions; | |||
|  |                         if (latestVersions != null) { | |||
|  |                             if (os == ATConfig.OS_ANDROID) { | |||
|  |                                 latestVersions.Android = ""; | |||
|  |                             } else { | |||
|  |                                 latestVersions.Ios = ""; | |||
|  |                             } | |||
|  |                         } | |||
|  |                     } | |||
|  |                 } | |||
|  |                 NetworkRequestParams requestParams = pluginData.requestParams; | |||
|  |                 if (requestParams == null) { | |||
|  |                     return; | |||
|  |                 } | |||
|  |                 if (os == ATConfig.OS_ANDROID) {  //Android  | |||
|  |                     requestParams.androidVersion = ""; | |||
|  |                 } else { | |||
|  |                     requestParams.iosVersion = ""; | |||
|  |                 } | |||
|  |             }          | |||
|  |         } | |||
|  |     } | |||
|  | } |