Files
RedHotRoast-ios/Assets/Scripts/HotUpdateLauncher.cs
T

118 lines
4.0 KiB
C#
Raw Normal View History

2026-07-17 14:03:00 +08:00
using HybridCLR;
using System.Collections;
using System.IO;
using System.Reflection;
using UnityEngine;
using UnityEngine.Networking;
using LhorionIOSSDK;
public class HotUpdateLauncher : MonoBehaviour
{
private Assembly _hotUpdateAss;
// 线上CDN地址,本地测试注释掉改用StreamingAssets
private const string RemoteDllUrl = "https://xxx-cdn/HotUpdate.dll.bytes";
private string LocalDllCachePath => Path.Combine(Application.persistentDataPath, "HotUpdate.dll.bytes");
// IEnumerator Start()
// {
// // 步骤1:加载AOT元数据(HybridCLR强制)
// yield return LoadAOTMetadata();
//
// // 步骤2:下载/读取热更DLL
// #if !UNITY_EDITOR
// // 真机:线上下载DLL,无缓存/版本更新则重新下载
// if (!File.Exists(LocalDllCachePath))
// {
// yield return DownloadHotDll();
// }
// byte[] dllBytes = File.ReadAllBytes(LocalDllCachePath);
// _hotUpdateAss = Assembly.Load(dllBytes);
// #else
// // Editor编辑器:无需下载,直接获取程序集
// _hotUpdateAss = AppDomain.CurrentDomain.GetAssemblies()
// .First(a => a.GetName().Name == "HotUpdate");
// #endif
//
// // 步骤3:反射调用热更层游戏入口(示例:HotUpdate里Hello类 Run静态方法)
// Type hotEntryType = _hotUpdateAss.GetType("Hello");
// hotEntryType.GetMethod("Run").Invoke(null, null);
//
// // ====================== 文档要求:热更加载完成后初始化SDK ======================
// InitLhorionSDK();
// }
private void Start()
{
InitLhorionSDK();
}
#region HybridCLR 元数据 + DLL下载
// 加载AOT元数据
IEnumerator LoadAOTMetadata()
{
string[] metaFiles = { "mscorlib.dll.bytes", "System.dll.bytes", "System.Core.dll.bytes" };
HomologousImageMode mode = HomologousImageMode.SuperSet;
foreach (var file in metaFiles)
{
string path = Path.Combine(Application.streamingAssetsPath, file);
using (var req = UnityWebRequest.Get(path))
{
yield return req.SendWebRequest();
var err = RuntimeApi.LoadMetadataForAOTAssembly(req.downloadHandler.data, mode);
Debug.Log($"加载元数据 {file} 结果:{err}");
}
}
}
// 从CDN下载热更DLL到本地持久化目录
IEnumerator DownloadHotDll()
{
using (var req = UnityWebRequest.Get(RemoteDllUrl))
{
req.downloadHandler = new DownloadHandlerFile(LocalDllCachePath);
yield return req.SendWebRequest();
if (req.result != UnityWebRequest.Result.Success)
{
Debug.LogError("热更DLL下载失败:" + req.error);
yield break;
}
Debug.Log("DLL下载缓存完成");
}
}
#endregion
#region LhorionSDK 初始化逻辑(文档标准写法)
static void InitLhorionSDK()
{
// 1. 创建空物体挂载SDK启动脚本
GameObject sdkObj = new GameObject("LhorionSDKBoot");
LhorionBootstrap boot = sdkObj.AddComponent<LhorionBootstrap>();
// 2. 可选:设置归因渠道,用于数据分析
boot.SetAttrInfo("unityad");
// 3. 必接接口:设置是否屏蔽增收逻辑(苹果审核用)
// 线上从服务器/CDN拉取状态,审核期间填true屏蔽
bool isForbiden = false;
LhorionIOSSDK.LhorionBootstrap.SetForbidenIncome (isForbiden);
}
#endregion
#region 网页弹窗接口(可选,仅iOS真机生效,编辑器无法测试)
/// <summary>
/// 显示网页入口弹窗,传入弹窗RectTransform
/// </summary>
public void ShowSdkWeb(RectTransform webRect)
{
LhorionBootstrap.ShowWeb(webRect);
}
/// <summary>
/// 关闭网页弹窗
/// </summary>
public void CloseSdkWeb()
{
LhorionBootstrap.DestroyWeb();
}
#endregion
}