跟诸子学游戏 iOS上面热更新

iOS上面为什么会禁止jspatch等库,而可以允许unity3d进行热更新呢

热更新在概念上面分为资源更新和代码逻辑更新

A资源更新 是指:图片,3D图形,数据更新等.

B代码逻辑更新 是指:利用在线下环境写的代码,再上线环境通过iOS手机 "内置的代码运行器"  动态执行这些更新的代码,进行逻辑更新,通过这种操作,理论上可以获取手机的root权限.

原因如下:(ps在搜索大部分原因之后,觉得最靠谱的说法)

1) 开放动态在 CPU 上面执行机器代码的权限之后,应用理论上可以通过这个来绕过沙盒,于是就禁了。 

2) 动态链接库,因为沙盒的存在,起不到共享的作用;怕麻烦,于是就禁了。(iOS上面制作的动态库.framework和.a静态库,本质上都是静态库)

但是Lua和ILRuntime等可以热更新呢?

是因为DLL(它在iOS上面认为是一种资源)和资源 是可以通过沙盒进行热更新的,没有基于iOS平台上的反射机制进行热更新,

ILRuntime借助Mono.Cecil库来读取DLL的PE信息,以及当中类型的所有信息,最终得到方法的IL汇编码,然后通过内置的IL解译执行虚拟机来执行DLL中的代码。中间夹了一层虚拟机,而jspatch的代码直接运行之后就可以在iOS平台上面进行逻辑修改.

也就是说,unity3d上面的热更新在苹果看来都是基于沙盒的热更新,不是基于iOS"内置运行器"的热更新,解释的是大概意思,大家不必深究字眼.


在unity3d上面可以使用的热更新技术包括Lua/c#light/c#反射技术. Lua又有uLua/nLua/toLua/xLua 目前xLua扩展灵活,toLua是个框架适合小型开发团队.除了xLua/toLua,其他尽量不要使用了.


ps: "iOS手机内置的运行器"其实就是指iOS上面的CPU等硬件

你可能感兴趣的:(跟诸子学游戏 iOS上面热更新)