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;
|
|
}
|
|
} |