SDK_UnityMoney/Assets/ThinkupTpnPlugin/Script/IntegrationManager/Editor/ATIntegrationManager.cs

448 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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