2025-09-01 04:14:42 +00:00
|
|
|
using System;
|
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using System.IO;
|
|
|
|
using System.Security.Cryptography;
|
|
|
|
using System.Text;
|
|
|
|
using Google.MiniJSON;
|
2025-09-10 12:23:01 +00:00
|
|
|
using Unity.VisualScripting.Dependencies.NCalc;
|
2025-09-01 04:14:42 +00:00
|
|
|
using UnityEngine;
|
|
|
|
|
2025-09-01 10:32:50 +00:00
|
|
|
namespace WZ
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
public static class FileParse
|
|
|
|
{
|
|
|
|
static string resourcePath = Application.streamingAssetsPath +"/";
|
|
|
|
public static void Parse()
|
|
|
|
{
|
|
|
|
string bundleId = GetBundleId();
|
|
|
|
LoggerUtils.Debug("[FileParse] get bundleId: " + bundleId);
|
|
|
|
ParseConfig(bundleId);
|
2025-09-24 09:47:05 +00:00
|
|
|
// ParseSdkConfig(bundleId);
|
2025-09-01 04:14:42 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 获取key-value配置信息
|
|
|
|
public static string GetConfigByKey(string _key)
|
|
|
|
{
|
|
|
|
PlayerPrefPair[] configs = new PlayerPrefPair[0];
|
|
|
|
configs = ParseConfig(GetBundleId());
|
|
|
|
for (int i = 0; i < configs.Length; i++)
|
|
|
|
{
|
|
|
|
if (configs[i].Key == _key)
|
|
|
|
{
|
|
|
|
return configs[i].Value.ToString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
private static PlayerPrefPair[] ParseConfig(string bundleId)
|
|
|
|
{
|
|
|
|
string fileName = GetMD5Hash("Config" + bundleId);
|
|
|
|
PlayerPrefPair[] configs = GetConfig(fileName, false);
|
|
|
|
ParseConfigsInner(configs);
|
|
|
|
return configs;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static PlayerPrefPair[] ParseSdkConfig(string bundleId)
|
|
|
|
{
|
|
|
|
string fileName = GetMD5Hash("SdkConfig" + bundleId);
|
|
|
|
PlayerPrefPair[] configs = GetConfig(fileName, true);
|
|
|
|
ParseConfigsInner(configs);
|
|
|
|
return configs;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
private static string GetMD5Hash(string input)
|
|
|
|
{
|
|
|
|
using (var md5 = MD5.Create())
|
|
|
|
{
|
|
|
|
var inputBytes = Encoding.ASCII.GetBytes(input);
|
|
|
|
var hashBytes = md5.ComputeHash(inputBytes);
|
|
|
|
|
|
|
|
var builder = new StringBuilder();
|
|
|
|
foreach (var t in hashBytes)
|
|
|
|
{
|
|
|
|
builder.Append(t.ToString("x2"));
|
|
|
|
}
|
|
|
|
|
|
|
|
return builder.ToString();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static PlayerPrefPair[] GetConfig(string _configFile, bool _sdkConfigFile)
|
|
|
|
{
|
|
|
|
return GetAllFromProperties(resourcePath + _configFile, _sdkConfigFile);
|
|
|
|
}
|
|
|
|
|
|
|
|
private static PlayerPrefPair[] GetAllFromProperties(string _configPath, bool _sdkConfigFile)
|
|
|
|
{
|
|
|
|
|
|
|
|
#if !UNITY_EDITOR && UNITY_ANDROID
|
|
|
|
WWW reader = new WWW(_configPath);
|
|
|
|
while (!reader.isDone) { }
|
|
|
|
string m_content = reader.text;
|
|
|
|
#else
|
|
|
|
string m_content = System.IO.File.ReadAllText(_configPath);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
string m_ecryptFileContent = DecryptFileBody(m_content, _sdkConfigFile);
|
|
|
|
Hashtable ht = LoadHashtable(m_ecryptFileContent);
|
|
|
|
if (ht.Count > 0)
|
|
|
|
{
|
|
|
|
PlayerPrefPair[] tempPlayerPrefs = new PlayerPrefPair[ht.Count];
|
|
|
|
int i = 0;
|
|
|
|
foreach (string key in ht.Keys)
|
|
|
|
{
|
|
|
|
tempPlayerPrefs[i] = new PlayerPrefPair() { Key = key, Value = ht[key] };
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return tempPlayerPrefs;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return new PlayerPrefPair[0];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static void ParseConfigsInner(PlayerPrefPair[] _configs)
|
|
|
|
{
|
|
|
|
if (_configs.Length <= 0) return;
|
|
|
|
|
|
|
|
for (int i = 0; i < _configs.Length; i++)
|
|
|
|
{
|
|
|
|
string valueTemp = _configs[i].Value.ToString();
|
2025-09-10 12:23:01 +00:00
|
|
|
LoggerUtils.Debug("[FileParse] ParseConfigsInner key" + _configs[i].Key + "value:" + valueTemp);
|
2025-09-01 04:14:42 +00:00
|
|
|
|
|
|
|
if (_configs[i].Key.ToLower() == KEY_Admob_CollapsibleBannerId.ToLower())
|
|
|
|
{
|
|
|
|
StaticValue.AdmobCollapsibleBannerId = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
2025-09-18 10:30:57 +00:00
|
|
|
else if (_configs[i].Key.ToLower() == KEY_TF_IAP_CHECK_ORDER.ToLower())
|
|
|
|
{
|
|
|
|
StaticValue.CheckOrderUrl = valueTemp;
|
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_TF_IAP_REPORT.ToLower())
|
|
|
|
{
|
|
|
|
StaticValue.VerifyPurchaseUrl = valueTemp;
|
|
|
|
}
|
2025-09-10 12:23:01 +00:00
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Admob_NormalBannerId.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
|
|
|
StaticValue.AdmobNormalBannerId = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Admob_SplashId.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
|
|
|
StaticValue.AdmobSplashId = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Admob_NativeId.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
|
|
|
StaticValue.AdmobNativeId = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Admob_SMALL_NativeId.ToLower())
|
2025-09-02 07:50:47 +00:00
|
|
|
{
|
|
|
|
StaticValue.AdmobSmallNativeId = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Admob_MINDDLE_NativeId.ToLower())
|
2025-09-02 07:50:47 +00:00
|
|
|
{
|
|
|
|
StaticValue.AdmobMinddleNativeId = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Admob_FULL_NativeId.ToLower())
|
2025-09-02 07:50:47 +00:00
|
|
|
{
|
|
|
|
StaticValue.AdmobFullNativeId = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Admob_RewardId.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
|
|
|
StaticValue.AdmobRewardId = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Admob_InterId.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
|
|
|
StaticValue.AdmobInterId = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_PRIVACY_URL.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
|
|
|
StaticValue.PrivacyUrl = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_ADJUST_ID.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
|
|
|
StaticValue.AdjustToken = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Max_APPKEY.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
2025-09-10 12:23:01 +00:00
|
|
|
|
2025-09-01 04:14:42 +00:00
|
|
|
StaticValue.ApplovinKey = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_THINKDATA_ID.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
|
|
|
StaticValue.TDAppID = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_THINKDATA_SS_URL.ToLower())
|
2025-09-02 12:26:49 +00:00
|
|
|
{
|
|
|
|
StaticValue.TDServerURL = valueTemp;
|
2025-09-10 12:23:01 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Max_Inter.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
2025-09-10 12:23:01 +00:00
|
|
|
StaticValue.MaxInterAdUnitID = valueTemp;
|
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_Max_Reward.ToLower())
|
2025-09-01 04:14:42 +00:00
|
|
|
{
|
2025-09-10 12:23:01 +00:00
|
|
|
StaticValue.MaxRewardAdUnitID = valueTemp;
|
2025-09-01 04:14:42 +00:00
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_TopOn_AppId.ToLower())
|
|
|
|
{
|
|
|
|
string[] condition = { "@" };
|
|
|
|
string[] parts = valueTemp.Split(condition, StringSplitOptions.None);
|
|
|
|
if (parts.Length == 2)
|
|
|
|
{
|
|
|
|
StaticValue.TopOnAppID = parts[0];
|
|
|
|
StaticValue.TopOnAppKey = parts[1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_TopOn_Inter.ToLower())
|
|
|
|
{
|
|
|
|
StaticValue.TopOnInterAdUnitID = valueTemp;
|
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == KEY_TopOn_Reward.ToLower())
|
|
|
|
{
|
|
|
|
StaticValue.TopOnRewardAdUnitID = valueTemp;
|
|
|
|
}
|
2025-09-10 12:23:01 +00:00
|
|
|
else if (_configs[i].Key.ToLower() == Key_Max_SpareInter.ToLower())
|
|
|
|
{
|
|
|
|
StaticValue.MaxSparespareInterAdUnitID = valueTemp;
|
|
|
|
}
|
|
|
|
else if (_configs[i].Key.ToLower() == Key_Max_SpareReward.ToLower())
|
|
|
|
{
|
|
|
|
StaticValue.MaxSparespareRewardAdUnitID = valueTemp;
|
|
|
|
}
|
2025-09-01 04:14:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static Hashtable LoadHashtable(string file)
|
|
|
|
{
|
|
|
|
Hashtable ht = new Hashtable(16);
|
|
|
|
string content = null;
|
|
|
|
try
|
|
|
|
{
|
|
|
|
content = file;
|
|
|
|
}
|
|
|
|
catch (Exception e)
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
string[] rows = content.Split('\n');
|
|
|
|
string[] kv = null;
|
|
|
|
foreach (string c in rows)
|
|
|
|
{
|
|
|
|
if (c.Trim().Length == 0)
|
|
|
|
continue;
|
|
|
|
kv = c.Split('=');
|
|
|
|
if (kv.Length == 1)
|
|
|
|
{
|
|
|
|
ht[kv[0].Trim()] = "";
|
|
|
|
}
|
|
|
|
else if (kv.Length == 2)
|
|
|
|
{
|
|
|
|
ht[kv[0].Trim()] = kv[1].Trim();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ht;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static string DecryptFileBody(string fileBody, bool sdkConfigFile)
|
|
|
|
{
|
|
|
|
string padded = fileBody.PadRight(fileBody.Length + (4 - fileBody.Length % 4) % 4, '=');
|
|
|
|
var decryptResponseBodyBytes = XXTEA.Decrypt(System.Convert.FromBase64String(padded), Encoding.UTF8.GetBytes(GetMD5Hash((sdkConfigFile ? "SdkConfigKey#$!" : "ConfigKey#$!") + GetBundleId())));
|
|
|
|
var decryptResponseBody = Encoding.UTF8.GetString(decryptResponseBodyBytes);
|
|
|
|
return decryptResponseBody;
|
|
|
|
}
|
|
|
|
|
|
|
|
private static string GetBundleId()
|
|
|
|
{
|
|
|
|
#if UNITY_EDITOR
|
|
|
|
string packageName = "";
|
|
|
|
var files = Directory.GetFiles(Application.dataPath, "*.json", SearchOption.AllDirectories);
|
|
|
|
var googleFilePath = "";
|
|
|
|
foreach (var item in files)
|
|
|
|
{
|
|
|
|
if (item.Contains("google-services.json"))
|
|
|
|
{
|
|
|
|
googleFilePath = item;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!File.Exists(googleFilePath))
|
|
|
|
{
|
|
|
|
// 显示错误提示框
|
|
|
|
throw new Exception("google-services.json not exists.");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var googleServicesDictionary = (Dictionary<string, object>)Json.Deserialize(File.ReadAllText(googleFilePath));
|
|
|
|
|
|
|
|
googleServicesDictionary.TryGetValue("client", out var tempClientList);
|
|
|
|
|
|
|
|
if (!(tempClientList is List<object> clientList) || clientList == null || clientList.Count == 0)
|
|
|
|
{
|
|
|
|
// 显示错误提示框
|
|
|
|
throw new Exception("Illegal google-services.json");
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach (var tempClientItem in clientList)
|
|
|
|
{
|
|
|
|
if (!(tempClientItem is Dictionary<string, object> clientItem))
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
clientItem.TryGetValue("client_info", out var tempClientInfo);
|
|
|
|
|
|
|
|
if (!(tempClientInfo is Dictionary<string, object> clientInfo) || clientInfo == null || clientInfo.Count == 0)
|
|
|
|
{
|
|
|
|
// 显示错误提示框
|
|
|
|
throw new Exception("Illegal google-services.json");
|
|
|
|
}
|
|
|
|
|
|
|
|
clientInfo.TryGetValue("android_client_info", out var tempAndroidClientInfo);
|
|
|
|
if (!(tempAndroidClientInfo is Dictionary<string, object> androidClientInfo) || androidClientInfo == null || androidClientInfo.Count == 0)
|
|
|
|
{
|
|
|
|
// 显示错误提示框
|
|
|
|
throw new Exception("Illegal google-services.json");
|
|
|
|
}
|
|
|
|
|
|
|
|
androidClientInfo.TryGetValue("package_name", out var googlePackageName);
|
|
|
|
packageName = (string)googlePackageName;
|
|
|
|
if (!string.IsNullOrEmpty(packageName))
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return packageName;
|
|
|
|
#else
|
|
|
|
AndroidJavaClass unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
|
|
|
|
AndroidJavaObject currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
|
|
|
|
AndroidJavaObject packageManager = currentActivity.Call<AndroidJavaObject>("getPackageManager");
|
|
|
|
string packageName = currentActivity.Call<string>("getPackageName");
|
|
|
|
return packageName;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2025-09-18 10:30:57 +00:00
|
|
|
public const string KEY_TF_IAP_CHECK_ORDER = "TF_IAP_CHECK_ORDER";
|
|
|
|
public const string KEY_TF_IAP_REPORT = "TF_IAP_REPORT";
|
2025-09-01 04:14:42 +00:00
|
|
|
public const string KEY_Admob_CollapsibleBannerId = "Admob_Banner_ID1";
|
|
|
|
public const string KEY_Admob_NormalBannerId = "Admob_Banner_ID2";
|
|
|
|
public const string KEY_Admob_SplashId = "Admob_APPOPEN_ID";
|
|
|
|
public const string KEY_Admob_NativeId = "Admob_NATIVE_ID";
|
2025-09-02 07:50:47 +00:00
|
|
|
public const string KEY_Admob_SMALL_NativeId = "ADMOB_SMALL_NATIVE_ID";
|
|
|
|
public const string KEY_Admob_MINDDLE_NativeId = "ADMOB_MIDDLE_NATIVE_ID";
|
|
|
|
public const string KEY_Admob_FULL_NativeId = "Admob_FULL_NATIVE_ID";
|
2025-09-01 04:14:42 +00:00
|
|
|
public const string KEY_Admob_RewardId = "Admob_RV_ID";
|
|
|
|
public const string KEY_Admob_InterId = "Admob_IV_ID";
|
|
|
|
public const string KEY_PRIVACY_URL = "tka_url_privacy";
|
|
|
|
public const string KEY_THINKDATA_ID = "ss_app_id";
|
2025-09-02 12:26:49 +00:00
|
|
|
public const string KEY_THINKDATA_SS_URL = "ss_url";
|
2025-09-01 04:14:42 +00:00
|
|
|
public const string KEY_ADJUST_ID = "adjust_id";
|
|
|
|
public const string KEY_TopOn_AppId = "ad_appid";
|
|
|
|
public const string KEY_TopOn_Reward = "AD_Reward";
|
|
|
|
public const string KEY_TopOn_Inter = "AD_Inter";
|
|
|
|
public const string KEY_Admob_AppID = "admob_id";
|
|
|
|
public const string KEY_Max_APPKEY = "ad_appkey";
|
|
|
|
public const string KEY_Max_Inter = "ad_interstital_id";
|
|
|
|
public const string KEY_Max_Reward = "ad_reward_id";
|
2025-09-10 12:23:01 +00:00
|
|
|
public const string Key_Max_SpareInter = "SpareInterAdUnitID";
|
|
|
|
public const string Key_Max_SpareReward = "SpareRewardAdUnitId";
|
2025-09-01 04:14:42 +00:00
|
|
|
|
|
|
|
public struct PlayerPrefPair
|
|
|
|
{
|
|
|
|
public string Key { get; set; }
|
|
|
|
|
|
|
|
public object Value { get; set; }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|