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