一种基于Lua的iOS客户端功能动态更新的方法

文档序号:6621874阅读:1635来源:国知局
一种基于Lua的iOS客户端功能动态更新的方法
【专利摘要】本发明公开了一种基于Lua的iOS客户端功能动态更新的方法,包括以下步骤:A、将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配置相关客户端App代码模块的版本号;B、客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号下载需要更新的Lua脚本业务逻辑代码;C、当客户端执行到App代码模块时,通过LuaCAPI动态地加载已经下载好的Lua脚本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器和桥接器来解析执行所述Lua脚本业务逻辑代码,以达到动态更新的目的。
【专利说明】-种基于Lua的iOS客户端功能动态更新的方法

【技术领域】
[0001] 本发明涉及i〇S客户端,尤其是一种基于Lua的iOS客户端功能动态更新的方法。

【背景技术】
[0002] 对于一个已经上线苹果商店的App,当开发者需要对客户端进行更新时,最传统的 做法是将重新编译生成的完整的App提交到苹果商店,等待苹果商店的审核,当审核通过 后,用户可以重新下载安装App以达到更新的目的。
[0003] 由于iOS平台限制了不允许以动态的方式加载由原生代码编译生成的可执行程 序,意味着开发者不可以以动态链接库的方式来组织App的软件架构,也就意味着不可以 通过单独更新动态链接库来完成对客户端App的更新。
[0004] 如果采用传统的方式更新客户端,由于从提交给苹果商店审核到审核通过往往需 要耗费较长的等待时间,导致我们的更新版本不能迅速地传递到客户的移动设备上,用户 也需要重新下载安装整个客户端App。
[0005] -种与本发明相近的实现方案是基于Javascript脚本语言和内置于iOS的 WebKit框架的Web App,通过WebKit下载和解析执行Javascript脚本代码,同样可以达到 动态更新客户端功能的目的。
[0006] 如果客户端是做成基于Javascript和WebKit的Web App的方式,更新客户端 不需要经过审核,非常便捷,用户也无需重新下载安装整个App,但Web App的运行依赖于 WebKit,受Javascript解析库的执行性能的影响,使得用户体验与原生App相比存在一定 差距。
[0007] 名词解释: Lua :由标准C编写而成的脚本语言,在所有操作系统和平台上都可以编译,运行;Lua 是一种嵌入式脚本语言,即Lua不是可以单独运行的程序,在实际应用中,通过Lua提供的 C API完成C/C++代码两种语言之间的通信的; iOS :苹果移动设备操作系统; App :应用软件; JavaScript :是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时 也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML (标准通用标记语言的子集) 网页添加动态功能,比如响应用户的各种操作; WebKit是开源的Web浏览器引擎,苹果的Safari、谷歌的Chrome浏览器都是基于这 个框架来开发的。WebKit还支持移动设备和手机,包括iPhone和Android手机都是使用 WebKit做为浏览器的核心。


【发明内容】

[0008] 针对上述缺点,本发明提出一种基于Lua的iOS客户端功能动态更新的方法,既 可以达到客户端在无需提交审核的情况下及时更新的目的,用户也无需重新下载安装一次 App,同时能够保持良好的用户体验。
[0009] 本发明采用的技术方案是: 一种基于Lua的iOS客户端功能动态更新的方法,包括以下步骤: A、 将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配 置相关客户端App代码模块的版本号; B、 客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号 下载需要更新的Lua脚本业务逻辑代码; C、 当客户端执行到App代码模块时,通过Lua C API动态地加载已经下载好的Lua脚 本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器来解析执行所述Lua脚本 业务逻辑代码,以达到动态更新的目的。
[0010] 作为本方案的进一步改进,其还包括一桥接器,该桥接器用于转换Lua解析器不 能解析的代码。
[0011] 具体的,所述桥接器包括标识Ob ject-c类对象和实例对象的userdata结构,该结 构作为Lua中的userdata数据类型存在,该结构中存放着指向Object-C对象的指针和其 他标识信息,与对象相关的操作基本上在这个结构的基础上完成。
[0012] 进一步的,所述桥接器将与Object-C对象对应的userdata结构以key-value对 的方式存放在两个映射表中,其中key为userdata结构中的Object-C对象的指针,value 为userdata结构。
[0013] 所述两个映射表中,其中一个表是弱表,存储了在Lua层面创建的0bject-c对象 的弱引用;另一个表是用于保存在桥接器层面创建的Object-C对象,是一个强引用表。
[0014] 其中,所述桥接器包括Object-C类对象的创建、为一个类注册新方法以及对方法 的调用。
[0015] 进一步的,所述0bject-C类对象的创建包括:在Lua元函数中通过定义的类名称 字符串和〇bject-C的运行时API创建一个类,并构造 Lua可以识别的userdata类型的结 构,再将该userdata结构放入上述的两个映射表中。
[0016] 上述为一个类注册新方法的过程为:通过Object-C的运行时API给一个类注册新 的方法,该运行时API为class_addMethod,该class_addMethod接收一个IMP类型的函数 指针,该函数指针指向这个新方法的实现。
[0017] 所述方法调用的过程为:在桥接器的元方法index里将方法的调用作为一个闭包 压入Lua当前维护的堆栈中,在元方法newindex中进行方法的覆盖。
[0018] 所述方法调用在闭包中是完成〇b ject-c层面的事情,先从Lua中获取当前调用的 方法的名称,由方法名称通过〇bject-C的运行时API_sel_getUid获取到已注册的方法名 称对应的方法标识-SEL,再根据方法标识由0bject-C层面的API生成NSMethodSignature 对象,然后由NSMethodSignature对象构造 NSInvocation对象,最后由NSInvocation对象 完成方法的调用。
[0019] 本发明的有益效果: 本发明可以快速地迭代更新客户端,用户无需重新下载安装App,在大多数情况下,更 新脚本量不会很大,更新过程不会影响用户的使用体验,最重要是Lua脚本解析器具有优 秀的性能,使得客户端App能够保持良好的用户体验。

【专利附图】

【附图说明】
[0020] 下面结合附图对本发明的【具体实施方式】做进一步的说明。
[0021] 图1是本发明的系统架构图; 图2是本发明的动态更新方法流程图。

【具体实施方式】
[0022] 本技术方案基于以下技术基础: 1. Lua的设计理念是可以使它粘合其他的开发语言,它提供了一系列的Lua C API,根 据其规范,我们可以编写一系列的元函数,作为Lua与其他语言编写的应用程序的粘合代 码。
[0023] 2. Object-C作为一种动态语言,提供了运行时丰富的API,提供了根据类名称来 动态反射类对象、根据方法名称来动态绑定方法等特性。
[0024] 3. Object-C可以方便地于C混合编程,为粘合代码的编写提供支持。
[0025] 如图1-图2所示,为本发明的一种基于Lua的iOS客户端功能动态更新的系统及 方法,该方法包括以下步骤: A、 将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配 置相关客户端App代码模块的版本号; B、 客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号 下载需要更新的Lua脚本业务逻辑代码; C、 当客户端执行到App代码模块时,通过Lua C API动态地加载已经下载好的Lua脚 本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器和桥接器来解析执行所述 Lua脚本业务逻辑代码,该桥接器用于转换Lua解析器不能解析的代码,以达到动态更新的 目的。
[0026] 下面针对上述步骤C展开阐述其实现方式: 桥接器主要维护了标识〇b ject-C类对象和实例对象的userdata结构,该结构作为Lua 中的userdata数据类型存在。该结构中存放着指向Object-C对象的指针和其他标识信息, 与对象相关的操作基本上都是在这个结构的基础上完成。
[0027] 桥接器将上述与0bject-C对象对应的userdata结构以key-value对的方式存放 在两个表中,其中key为userdata结构中的0bject-C对象的指针,value为userdata结 构。其中一个表是弱表,存储了在Lua层面创建的0bject-C对象的弱引用,当对象不再使 用时会调用桥接器编写的_gc这个元方法来销毁对象。另一个表是用于保存在桥接器层 面创建的Object-C对象,是一个强引用表,需要手动管理内存,框架运行时通过一个定时 器不停地轮询这个表中的对象的引用计数,如果小于2,就会销毁对象。
[0028] 如前面所述,我们可以编写一系列的元函数,作为Lua与Object-C的粘合代码, 其中最核心的是在粘合代码中实现Object-C类、对象的创建以及对方法的调用。
[0029] 1. 0bject-C类对象的创建: 为了创建Object-C类对象,可以在Lua元函数中通过定义的类名称字符串和Object-C 的运行时API(objc_getClass)创建一个类,并构造 Lua可以识别的userdata类型的结构, 再将该userdata结构放入上述的两个映射表中。
[0030] 2.为一个类注册新方法 通过〇bject-C的运行时API (class_addMethod)给一个类注册新的方法,class_ addMethod接收一个IMP类型的函数指针,该函数指针指向这个新方法的实现。在Lua和 Ob ject-C的桥接器中,MP函数包含了用户在Lua层面写的方法,也包括这个方法的参数和 返回值在ObjC与Lua中的相互转换。也就是当调用一个Lua写的方法时会先把参数转化 为Lua可识别的数据类型,然后由Lua C API中的lua_pcall函数调用Lua方法,执行完成 后再把返回结果转换成ObjC类型。
[0031] 3.方法的调用 在桥接器的元方法_index里将方法的调用作为一个闭包(closure)压入Lua当前维 护的堆栈中,在元方法_newindex中进行方法的override。在closure中主要是完成ObjC 层面的事情,先从Lua中获取当前调用的方法的名称,由方法名称通过0bject-C的运行 时API (Sel_getUid)获取到已注册的方法名称对应的方法标识(SEL),再根据方法标识由 ObjC层面的API生成NSMethodSignature(NSMethodSignature存储了该方法的参数类型、 数量和返回值类型)。然后由NSMethodSignature构造 NSInvocation,最后由NSInvocation 完成方法的调用。
[0032] 以上所述仅为本发明的优先实施方式,本发明并不限定于上述实施方式,只要以 基本相同手段实现本发明目的的技术方案都属于本发明的保护范围之内。
【权利要求】
1. 一种基于Lua的iOS客户端功能动态更新的方法,其特征在于包括以下步骤: A、 将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配 置相关客户端App代码模块的版本号; B、 客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号 下载需要更新的Lua脚本业务逻辑代码; C、 当客户端执行到App代码模块时,通过Lua C API动态地加载已经下载好的Lua脚 本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器来解析执行所述Lua脚本 业务逻辑代码,以达到动态更新的目的。
2. 根据权利要求1所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:其还包括一桥接器,该桥接器用于转换Lua解析器不能解析的代码。
3. 根据权利要求2所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述桥接器包括标识〇bject-C类对象和实例对象的userdata结构,该结构作为Lua 中的userdata数据类型存在,该结构中存放着指向Ob ject-C对象的指针和其他标识信息, 与对象相关的操作基本上在这个结构的基础上完成。
4. 根据权利要求3所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述桥接器将与〇b ject-C对象对应的userdata结构以key-value对的方式存放在两 个映射表中,其中key为userdata结构中的Ob ject-C对象的指针,value为userdata结 构。
5. 根据权利要求4所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述两个映射表中,其中一个表是弱表,存储了在Lua层面创建的Object-C对象的弱 引用;另一个表是用于保存在桥接器层面创建的〇b ject-C对象,是一个强引用表。
6. 根据权利要求5所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述桥接器包括Object-C类对象的创建、为一个类注册新方法以及对方法的调用。
7. 根据权利要求6所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征 在于:所述Object-C类对象的创建包括:在Lua元函数中通过定义的类名称字符串和 Object-C的运行时API创建一个类,并构造 Lua可以识别的userdata类型的结构,再将该 userdata结构放入上述的两个映射表中。
8. 根据权利要求6所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:上述为一个类注册新方法的过程为:通过〇b ject-C的运行时API给一个类注册新的 方法,该运行时API为class_addMethod,该class_addMethod接收一个IMP类型的函数指 针,该函数指针指向这个新方法的实现。
9. 根据权利要求6所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在 于:所述方法调用的过程为:在桥接器的元方法index里将方法的调用作为一个闭包压入 Lua当前维护的堆栈中,在元方法newindex中进行方法的覆盖。
10. 根据权利要求9所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征 在于:所述方法调用在闭包中是完成Object-C层面的事情,先从Lua中获取当前调用的 方法的名称,由方法名称通过〇bject-C的运行时API_sel_getUid获取到已注册的方法名 称对应的方法标识-SEL,再根据方法标识由Object-C层面的API生成NSMethodSignature 对象,然后由NSMethodSignature对象构造 NSInvocation对象,最后由NSInvocation对象 完成方法的调用。
【文档编号】G06F9/445GK104111855SQ201410367963
【公开日】2014年10月22日 申请日期:2014年7月29日 优先权日:2014年7月29日
【发明者】余敬龙 申请人:广东能龙教育股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1