什么是冷更新
开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性能测试。测试成功后,用户即可在AppStore看到应用的更新信息,用户点击应用更新后,需要先关闭应用,再进行更新。
什么是热更新
广义:无需关闭应用,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码。
狭义定义(iOS热更新):无须将代码重新打包提交至AppStore,即可更新客户端的执行代码,即不用下载app而自动更新程序。
现状:苹果禁止了C#的部分反射操作,禁止JIT(即时编译,程序运行时创建并运行新代码),不允许逻辑热更新,只允许使用AssetBundle进行资源热更新。
注意:2017年,苹果更新了热更新政策说明,上线后的项目,一旦发现使用热更新,一样会以下架处理
为何要热更新
缩短用户获取新版应用的客户端的流程,改善用户体验
具体到iOS平台的应用上,有以下几个原因
AppStore的审核周期难控制
手机应用更新频繁
对于大型应用,更新成本太大
终极目标
不重新下载、不停机状态下完全变换一个应用的内容
每个平台如何做热更新
Android,PC(C#)
将执行代码预编译为AssemblyDLL
将代码作为TextAsset打包进AssetBundle
运行时调用AssemblyDLL代码
更新相应的AssetBundle即可实现热更新
iOS(Lua)
苹果官方禁止iOS下的程序热更新;JIT在iOS下无效
热更新方案:Unity+Lua插件
常见的Unity热更新插件
sLua:最快的Lua插件
toLua:有uLua发展而来的,第二代Lua热更新方案
xLua:特性最先进的Lua插件
ILRuntime:纯C#实现的热更新插件
xLua的安装
官网:https://github.com/Tencent/xLua
在官网上下载压缩包后将Assets文件夹下的四个文件复制粘贴到个人项目工程的Assets文件中即可正确安装xLua
xLua实际应用测试:
xLua解析器的获得
DoString函数执行Lua代码
Lua代码调用C#代码
C#加载Lua文件
示例代码如下所示:
//C#调用Lua
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua; //使用XLua的命名空间
public class First : MonoBehaviour
{
void Start()
{
//Lua是解释型语言,所以需要获得Lua的解析器
//xLua解析器获得
LuaEnv env = new LuaEnv();
//解析器运行Lua代码,把字符串当成Lua代码执行
env.DoString("print('Hello World!')");
//解析器释放
env.Dispose();
}
}
Lua调用C#代码简单示例代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
public class DoString : MonoBehaviour
{
void Start()
{
LuaCallCSharpCode();
}
public void LuaCallCSharpCode()
{
LuaEnv env= new LuaEnv();
//Lua调用C#代码(CS.命名空间.类名.方法名(参数))
env.DoString("CS.UnityEngine.Debug.Log('Lua调用C#代码')");
env.Dispose();
}
//Lua返回值给C#
public void LuaReturnData()
{
LuaEnv env= new LuaEnv();
object[] data=env.DoString("return 100,true");
Debug.Log("Lua的第一个返回值:"+data[0].ToString());
Debug.Log("Lua的第二个返回值:" + data[1].ToString());
env.Dispose();
}
}
若一直像以上代码一样仅在DoStringAPI中使用字符串进行Lua编程未免太过憋屈,我们可尝试是否可以直接调用Lua文件实现在Unity中进行打印输出,代码如下:
该系列专栏为网课课程笔记,仅用于学习参考。