355 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			355 lines
		
	
	
		
			14 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; | ||
|  | 
 | ||
|  | namespace AnyThink.Scripts.IntegrationManager.Editor | ||
|  | { | ||
|  |     public class ATDataUtil | ||
|  |     { | ||
|  | 
 | ||
|  |         public static Network coreNetwork; | ||
|  | 
 | ||
|  |         public static Network[] parseNetworksJson(PluginData pluginData, string netowrksJson) | ||
|  |         { | ||
|  |             try | ||
|  |             { | ||
|  |                 int country = pluginData.country; | ||
|  |                 bool isChinaCountry = isChina(country); | ||
|  | 
 | ||
|  |                 ServerNetworks serverNetworks = JsonUtility.FromJson<ServerNetworks>(netowrksJson); | ||
|  | 
 | ||
|  |                 Network network = pluginData.anyThink; | ||
|  |                 if (network == null) { | ||
|  |                     return null; | ||
|  |                 } | ||
|  |                 var android_version = pluginData.requestParams.androidVersion; | ||
|  |                 var ios_version = pluginData.requestParams.iosVersion; | ||
|  | 
 | ||
|  |                 var androidSdkVersionList = serverNetworks.android_sdk; | ||
|  |                 var iosSdkVersionList = serverNetworks.ios_sdk; | ||
|  | 
 | ||
|  |                 ServerNetworkSdk androidNeworkSdk = null; | ||
|  |                 if (!string.IsNullOrEmpty(android_version)) { | ||
|  |                     foreach(ServerNetworkSdk sdk in androidSdkVersionList) { | ||
|  |                         if (Equals(sdk.version, android_version)) { | ||
|  |                             androidNeworkSdk = sdk; | ||
|  |                         } | ||
|  |                     } | ||
|  |                 } | ||
|  |               | ||
|  |                 ServerNetworkSdk iosNeworkSdk = null; | ||
|  |                 if (!string.IsNullOrEmpty(ios_version)) {      | ||
|  |                     foreach(ServerNetworkSdk sdk in iosSdkVersionList) { | ||
|  |                         if (Equals(sdk.version, ios_version)) { | ||
|  |                             iosNeworkSdk = sdk; | ||
|  |                         } | ||
|  |                     } | ||
|  |                 } | ||
|  |                 ATLog.log("parseNetworksJson() >>> androidNeworkSdk: " + androidNeworkSdk + " iosNeworkSdk: " + iosNeworkSdk); | ||
|  | 
 | ||
|  |                 ServerNetworkInfo[] serverNetworkInfoList; | ||
|  |                 Network[] networks = mergeAndroidIosNetworks(getServerNetworkInfo(isChinaCountry, androidNeworkSdk, ATConfig.OS_ANDROID), getServerNetworkInfo(isChinaCountry, iosNeworkSdk,  ATConfig.OS_IOS)); | ||
|  |                 Array.Sort(networks); | ||
|  |                 ATLog.log("parseNetworksJson() >>> networks.Length: " + networks.Length); | ||
|  |                 //处理本地已安装过的Core和Network数据 | ||
|  |                 var countrySettingData = pluginData.pluginSettingData.getCountrySettingData(); | ||
|  | 
 | ||
|  |                 List<Network> networkList = new List<Network>(); | ||
|  |                 foreach(var item in networks) { | ||
|  |                     if (Equals(item.Name, ATIntegrationManager.AnyThinkNetworkName)) { | ||
|  |                         network.Name = item.Name; | ||
|  |                         network.DisplayName = item.DisplayName; | ||
|  |                         network.AndroidDownloadUrl = item.AndroidDownloadUrl; | ||
|  |                         network.iOSDownloadloadUrl = item.iOSDownloadloadUrl; | ||
|  |                         network.PluginFileName = item.PluginFileName; | ||
|  |                         //本地是否有安装core | ||
|  |                         var version = network.CurrentVersions; | ||
|  |                         if (version == null) { | ||
|  |                             version = new Versions(); | ||
|  |                         } | ||
|  |                         version.Android = countrySettingData.android_version; | ||
|  |                         version.Ios = countrySettingData.ios_version; | ||
|  |                         network.CurrentVersions = version; | ||
|  |                         network.LatestVersions = item.LatestVersions; | ||
|  |                     } else { | ||
|  |                         // ATLog.log("parseNetworksJson() >>> lastAndroidVersion: " + item.LatestVersions.Android + " lastIosVerion: " + item.LatestVersions.Ios); | ||
|  |                         //本地是否有安装network | ||
|  |                         ATConfig.initNetworkLocalData(item); | ||
|  |                         networkList.Add(item); | ||
|  |                     } | ||
|  |                 } | ||
|  | 
 | ||
|  |                 return networkList.ToArray(); | ||
|  |             } | ||
|  |             catch (Exception e) | ||
|  |             { | ||
|  |                 // 错误处理代码 | ||
|  |                 ATLog.log("parseNetworksJson() >>> failed: " + e); | ||
|  |             } | ||
|  | 
 | ||
|  |             return null; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static PluginData parsePluginDataJson(string serverPluginVersionJson) | ||
|  |         { | ||
|  |             ATLog.log("parsePluginDataJson plugin version data: " + serverPluginVersionJson); | ||
|  | 
 | ||
|  |             try | ||
|  |             { | ||
|  |                 var pluginData = new PluginData(); | ||
|  | 
 | ||
|  |                 ServerPluginVersion serverPluginVersion = JsonUtility.FromJson<ServerPluginVersion>(serverPluginVersionJson); | ||
|  | 
 | ||
|  |                 pluginData.androidVersions = serverPluginVersion.android_versions; | ||
|  |                 pluginData.iosVersions = serverPluginVersion.ios_versions; | ||
|  |                 pluginData.pluginVersion = serverPluginVersion.pluginVersion; | ||
|  |                 // 初始化本地的core包数据 | ||
|  |                 var settingData = ATConfig.getPluginSettingData(); | ||
|  |                 if (settingData == null) { | ||
|  |                    settingData = new PluginSettingData(); | ||
|  |                    ATConfig.savePluginSettingData(settingData); | ||
|  |                 } | ||
|  |                 pluginData.country = settingData.curCountry; | ||
|  |                 pluginData.pluginSettingData = settingData; | ||
|  |                 pluginData.anyThink = initCoreNetworkWithLocalData(settingData); | ||
|  |                 return pluginData; | ||
|  |             } | ||
|  |             catch (Exception e) | ||
|  |             { | ||
|  |                 // 错误处理代码 | ||
|  |                 ATLog.log("parse version data failed: " + e); | ||
|  |             } | ||
|  | 
 | ||
|  |             return null; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static Network initCoreNetworkWithLocalData(PluginSettingData settingData) { | ||
|  |             var network = new Network(); | ||
|  |             var versions = new Versions(); | ||
|  |             var countryData = settingData.getCountrySettingData(); | ||
|  |             if (countryData != null) { | ||
|  |                 versions.Android = countryData.android_version; | ||
|  |                 versions.Ios = countryData.ios_version; | ||
|  |             } | ||
|  |             network.CurrentVersions = versions; | ||
|  |             network.Country = settingData.curCountry; | ||
|  |             return network; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static ServerNetworkInfo[] getServerNetworkInfo(bool isChina, ServerNetworkSdk serverNetworks, int os) { | ||
|  |             if (serverNetworks == null) { | ||
|  |                 return null; | ||
|  |             } | ||
|  |             if (isChina) { | ||
|  |                 return serverNetworks.network_list.china; | ||
|  |             } else { | ||
|  |                 return serverNetworks.network_list.nonchina; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         private static IEnumerable<ServerNetworkInfo> GetUniqueNetworkInfo(ServerNetworkInfo[] androidNetworks, ServerNetworkInfo[] iosNetworks) | ||
|  |         { | ||
|  |             // Android独有的 | ||
|  |             var uniqueToAndroid = androidNetworks.Where(a => !iosNetworks.Any(i => i.displayName == a.displayName)); | ||
|  | 
 | ||
|  |             // iOS独有的 | ||
|  |             var uniqueToIos = iosNetworks.Where(i => !androidNetworks.Any(a => a.displayName == i.displayName)); | ||
|  |                  | ||
|  |             // 合并结果 | ||
|  |             return uniqueToAndroid.Concat(uniqueToIos); | ||
|  |         } | ||
|  | 
 | ||
|  |         //合并Android和iOS的network数据 | ||
|  |         public static Network[] mergeAndroidIosNetworks(ServerNetworkInfo[] androidNetworks, ServerNetworkInfo[] iosNetworks) | ||
|  |         { | ||
|  |             int a_length = 0; | ||
|  |             int i_length = 0; | ||
|  |             if (androidNetworks != null) { | ||
|  |                a_length = androidNetworks.Length; | ||
|  |             } | ||
|  |             if (iosNetworks != null) { | ||
|  |                i_length = iosNetworks.Length; | ||
|  |             } | ||
|  |             ATLog.log("mergeAndroidIosNetworks() >>> a_length: " + a_length + " i_length: " + i_length); | ||
|  | 
 | ||
|  |             int max_length = Math.Max(a_length, i_length); | ||
|  |             int min_length = Math.Min(a_length, i_length); | ||
|  | 
 | ||
|  |             var externalNetworks = androidNetworks; | ||
|  |             var internalNetworks = iosNetworks; | ||
|  |             if (a_length < i_length) { | ||
|  |                 externalNetworks = iosNetworks; | ||
|  |                 internalNetworks = androidNetworks; | ||
|  |             } | ||
|  | 
 | ||
|  |             List<Network> networkList = new List<Network>(); | ||
|  |             ATLog.log("mergeAndroidIosNetworks() >>> max_length: " + max_length + " min_length: " + min_length); | ||
|  |             for (int i = 0; i < max_length; i++) { | ||
|  |                 var network = new Network(); | ||
|  |                 var iNetwork = externalNetworks[i]; | ||
|  |                 if (min_length == 0) { | ||
|  |                     //只有集成一个平台 | ||
|  |                     network = flatServerNetwork(iNetwork, network); | ||
|  |                     networkList.Add(network); | ||
|  |                 } else { | ||
|  |                     //合并相同的network | ||
|  |                     for (int j = 0; j < min_length; j++) { | ||
|  |                         var jNetwork = internalNetworks[j]; | ||
|  |                         if (Equals(iNetwork.displayName, jNetwork.displayName)) { | ||
|  |                             network = flatServerNetwork(iNetwork, network); | ||
|  |                             network = flatServerNetwork(jNetwork, network); | ||
|  |                             networkList.Add(network); | ||
|  |                         } | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |             //过滤平台的唯一network | ||
|  |             if (i_length > 0 && a_length > 0) { | ||
|  |                 var serverNetworkInfos = GetUniqueNetworkInfo(androidNetworks, iosNetworks); | ||
|  |                 foreach (var serverNetworkInfo in serverNetworkInfos) | ||
|  |                 { | ||
|  |                     var network = new Network(); | ||
|  |                     networkList.Add(flatServerNetwork(serverNetworkInfo, network)); | ||
|  |                 } | ||
|  |             } | ||
|  | 
 | ||
|  |             return networkList.ToArray(); | ||
|  |         } | ||
|  | 
 | ||
|  |         //后台下载数据转换成本地数据 | ||
|  |         public static Network flatServerNetwork(ServerNetworkInfo serverInfo, Network network) | ||
|  |         { | ||
|  |             network.Name = serverInfo.name; | ||
|  |             network.DisplayName = serverInfo.displayName; | ||
|  |             network.Country = serverInfo.country; | ||
|  |             network.PluginFileName = serverInfo.pluginFileName; | ||
|  | 
 | ||
|  |             var versions = network.LatestVersions; | ||
|  |             if (versions == null) { | ||
|  |                 versions = new Versions(); | ||
|  |             } | ||
|  |             if (serverInfo.os == ATConfig.OS_ANDROID) { //Android | ||
|  |                 network.AndroidDownloadUrl = serverInfo.downloadUrl; | ||
|  |                 versions.Android = serverInfo.version; | ||
|  |             } else { //iOS | ||
|  |                 network.iOSDownloadloadUrl = serverInfo.downloadUrl; | ||
|  |                 versions.Ios = serverInfo.version; | ||
|  |             } | ||
|  |             ATLog.log("flatServerNetwork() >>> name: " + network.Name + " androidVersion: " + versions.Android + " iosVersion: " + versions.Ios); | ||
|  |             network.LatestVersions = versions; | ||
|  |             return network; | ||
|  |         } | ||
|  | 
 | ||
|  |         public static bool isChina(int country) | ||
|  |         { | ||
|  |             return country == ATConfig.CHINA_COUNTRY; | ||
|  |         } | ||
|  | 
 | ||
|  | 
 | ||
|  |         //只比较Android、iOS | ||
|  |         public static VersionComparisonResult CompareVersions(string versionA, string versionB) | ||
|  |         { | ||
|  |             if (string.IsNullOrEmpty(versionA) || string.IsNullOrEmpty(versionB) || versionA.Equals(versionB)) | ||
|  |             { | ||
|  |                 return VersionComparisonResult.Equal; | ||
|  |             } | ||
|  | 
 | ||
|  |             try | ||
|  |             { | ||
|  |                 var aVersionArrays = versionA.Split('.'); | ||
|  |                 var bVersionArrays = versionB.Split('.'); | ||
|  | 
 | ||
|  |                 var arrayLength = Mathf.Min(aVersionArrays.Length, bVersionArrays.Length); | ||
|  |                 for (var i = 0; i < arrayLength; i++) | ||
|  |                 { | ||
|  |                     var aVersionStr = aVersionArrays[i]; | ||
|  |                     var bVersionStr = bVersionArrays[i]; | ||
|  | 
 | ||
|  |                     var aVersionInt = int.Parse(aVersionStr); | ||
|  |                     var bVersionInt = int.Parse(bVersionStr); | ||
|  | 
 | ||
|  |                     if (i == arrayLength - 1) //末尾最后一个 | ||
|  |                     { | ||
|  |                         if (aVersionStr.Length > bVersionStr.Length) | ||
|  |                         { | ||
|  |                             int gapLength = aVersionStr.Length - bVersionStr.Length; | ||
|  |                             bVersionInt = bVersionInt * (gapLength * 10); | ||
|  |                         } | ||
|  |                         else if (aVersionStr.Length < bVersionStr.Length) | ||
|  |                         { | ||
|  |                             int gapLength = bVersionStr.Length - aVersionStr.Length; | ||
|  |                             aVersionInt = aVersionInt * (gapLength * 10); | ||
|  |                         } | ||
|  |                     } | ||
|  |                     if (aVersionInt < bVersionInt) return VersionComparisonResult.Lesser; | ||
|  |                     if (aVersionInt > bVersionInt) return VersionComparisonResult.Greater; | ||
|  |                 } | ||
|  |             } | ||
|  |             catch (Exception e) | ||
|  |             { | ||
|  |                 ATLog.logError("CompareVersions failed: " + e.Message); | ||
|  |             } | ||
|  | 
 | ||
|  |             return VersionComparisonResult.Equal; | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     //下发的插件数据:{"pluginVersion": "2.1.0", "platformName": "AnyThink", "ios_versions": ["6.2.88"], "android_versions": ["6.2.93"]} | ||
|  |     [Serializable] | ||
|  |     public class ServerPluginVersion | ||
|  |     { | ||
|  |         public string platformName; | ||
|  |         // public string networkUrlVersion; | ||
|  |         public string pluginVersion; | ||
|  |         public string[] android_versions; | ||
|  |         public string[] ios_versions; | ||
|  |     } | ||
|  | 
 | ||
|  |     [Serializable] | ||
|  |     public class ServerNetworks | ||
|  |     { | ||
|  |         public string plugin_version; | ||
|  |         public ServerNetworkSdk[] ios_sdk; | ||
|  |         public ServerNetworkSdk[] android_sdk; | ||
|  |     } | ||
|  | 
 | ||
|  |     [Serializable] | ||
|  |     public class ServerNetworkSdk | ||
|  |     { | ||
|  |         public string version; | ||
|  |         public ServerNetworkListObj network_list;  | ||
|  |     } | ||
|  | 
 | ||
|  |     [Serializable] | ||
|  |     public class ServerNetworkListObj | ||
|  |     { | ||
|  |         public ServerNetworkInfo[] china; | ||
|  |         public ServerNetworkInfo[] nonchina; | ||
|  |     } | ||
|  | 
 | ||
|  |     [Serializable] | ||
|  |     public class ServerNetworkInfo | ||
|  |     { | ||
|  |         public string name; | ||
|  |         public string displayName; | ||
|  |         public string downloadUrl; | ||
|  |         public string pluginFileName; | ||
|  |         public string version; | ||
|  |         public int os; | ||
|  |         public int country; | ||
|  |         // public ServerNetworkVersion versions; | ||
|  |     } | ||
|  |     [Serializable] | ||
|  |     public class ServerNetworkVersion | ||
|  |     { | ||
|  |         public string android; | ||
|  |         public string ios; | ||
|  |         public string unity; | ||
|  |     } | ||
|  | } |