WaxPatch在iOS客户端中的一种应用

来源:互联网 发布:游龙网络靠什么赚钱的 编辑:程序博客网 时间:2024/06/06 06:30
为什么需要 WaxPatch


很多情况下,已经在 AppStore 上线的应用需要紧急缺陷修复,此时便需要使用某些技术手段,使应用程序能够动态下载补丁,进行缺陷修复。


什么是 WaxPatch

迄今为止,脚本语言中运行速度最快的是 Lua。Lua 语言由巴西里约热内卢天主教大学的 Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo 于 1993 年开发的。其最初的设计目的是提供一个方便嵌入到应用程序中得脚本语言。Lua 语言完全使用 ANSI C 实现,其设计精巧,代码优美。Lua 的解释器总共在 200k 大小,而且运行速度大约是 C 语言的 1/5,语法比较简单,即使不是专业的编程人员也容易掌握。


2003 年,随着暴雪的大型在线网络游戏 《魔兽世界》的发布,Lua 逐渐被人们所知(《魔兽世界》的插件系统就是使用 Lua 开发), Lua 逐渐在游戏界流行起来。现在国内几乎大部分游戏策划都使用 Lua 语言来进行数值或者关卡的设计。




《魔兽世界》内的Lua编辑器


由于 Lua 编程简单,运行速度快,在 iOS 上, 一个支持使用 Lua 语言编写 iOS 应用的项目 Wax 诞生了。Wax 项目允许用户使用 Lua 语言调动苹果 iOS SDK 的功能,进行应用程序的开发。


Wax Patch 项目是由 Wax 项目衍生而来,Wax patch 不仅仅允许用户使用 Lua 调用 iOS SDK 和应用程序内部的 API, 而且使用了 Objective-C runtime 的 class_replaceMethod 调用替换应用程序内部由 Objective-C 编写的类方法,从而达到功能微调或者缺陷修复的目的。


Wax/WaxPatch 主要特点:


● 所有 Objective-C 调用接口构建在 Objective-C runtime 之上,所以其调用 Objective-C 的 API 方式非常方便,不像调用 C/C++ 哪样,必须先为 Lua 编写调用接口(有些技术可以帮助 Lua 调用 C/C++ 编写的动态库而不必事先编写调用接口, 但是在 iOS 上不能调用应用程序自己编写的 API)。


● 对于 Objective-C 和 Lua 之间的数据类型转换进行了封装,使得开发者不必关心 Lua 和 Objective-C 的数据类型转换,方便开发。

WaxPatch 工作原理

Objectvie-C 语言的特性和实现机制决定了任何其他脚本语言对其进行调用都很方便。主要原因在于 Objective-C runtime 提供了对于 类/对象 等 OC 类型的反射和自省机制。

相关的 API 如下:


typedefstruct objc_class *Class;

structobjc_object {

Class isa OBJC_ISA_AVAILABILITY;

};

typedefstruct objc_object *id;

typedefstruct objc_selector *SEL;

typedefid (*IMP)(id, SEL, ...);

SELsel_getUid(const char *str);

constchar *object_getClassName(id obj);

Classobjc_getClass(const char *name);

Methodclass_getInstanceMethod(Class cls, SEL name);

Methodclass_getClassMethod(Class cls, SEL name);

IMPclass_getMethodImplementation(Class cls, SEL name);

IMPclass_replaceMethod(Class cls, SEL name, IMP imp, const char *types);


藉由以上 API,则可以通过字符串来动态调用 Objective-C 的类和对象的方法。


Wax/WaxPatch 调用 Objective-C 并不是简单得对 Objective-C runtime 的 API 进行 1 对 1 得封装,而是把所有的 Objective-C 的对象\类\函数\等抽象成一个 WaxInstance,对 WaxInstance 进行操作。而 WaxPatch 则对 WaxInstance 的元表的 __newindex 属性进行改写,调用 class_replaceMethod 方法改写父类的函数实现,使用 forwardInvocation 机制把针对父类的调用方法转发到 Lua 改写的类方法里面。

动态补丁流程

我们在一些项目中使用 WaxPatch 来实现热更新机制,主要的流程如下所示。

1
补丁包发布流程



2客户端请求补丁流程


3客户端使用补丁流程
0 0
原创粉丝点击