一种基于LUA的IOS客户端功能动态更新的方法.pdf

上传人:小** 文档编号:623729 上传时间:2018-02-26 格式:PDF 页数:8 大小:639.70KB
返回 下载 相关 举报
摘要
申请专利号:

CN201410367963.5

申请日:

2014.07.29

公开号:

CN104111855A

公开日:

2014.10.22

当前法律状态:

实审

有效性:

审中

法律详情:

实质审查的生效IPC(主分类):G06F 9/445申请日:20140729|||公开

IPC分类号:

G06F9/445; H04L29/08; H04M1/725

主分类号:

G06F9/445

申请人:

广东能龙教育股份有限公司

发明人:

余敬龙

地址:

528403 广东省中山市东区中山四路49号二楼至四楼

优先权:

专利代理机构:

广州嘉权专利商标事务所有限公司 44205

代理人:

张海文

PDF下载: PDF下载
内容摘要

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

权利要求书

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客户端功能动态更新的方法,其特征在于:所述桥接器包括标识Object-C类对象和实例对象的userdata结构,该结构作为Lua中的userdata数据类型存在,该结构中存放着指向Object-C对象的指针和其他标识信息,与对象相关的操作基本上在这个结构的基础上完成。

4.
  根据权利要求3所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在于: 所述桥接器将与Object-C对象对应的userdata结构以key-value对的方式存放在两个映射表中,其中key为userdata结构中的Object-C对象的指针,value为userdata结构。

5.
  根据权利要求4所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在于: 所述两个映射表中,其中一个表是弱表,存储了在Lua层面创建的Object-C对象的弱引用;另一个表是用于保存在桥接器层面创建的Object-C对象,是一个强引用表。

6.
  根据权利要求5所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在于:所述桥接器包括Object-C类对象的创建、为一个类注册新方法以及对方法的调用。

7.
  根据权利要求6所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在于: 所述Object-C类对象的创建包括:在Lua元函数中通过定义的类名称字符串和Object-C的运行时API创建一个类,并构造Lua可以识别的userdata类型的结构,再将该userdata结构放入上述的两个映射表中。

8.
  根据权利要求6所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在于: 上述为一个类注册新方法的过程为:通过Object-C的运行时API给一个类注册新的方法,该运行时API为class_addMethod,该class_addMethod接收一个IMP类型的函数指针,该函数指针指向这个新方法的实现。

9.
  根据权利要求6所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在于: 所述方法调用的过程为:在桥接器的元方法index里将方法的调用作为一个闭包压入Lua当前维护的堆栈中,在元方法newindex中进行方法的覆盖。

10.
  根据权利要求9所述的一种基于Lua的iOS客户端功能动态更新的方法,其特征在于: 所述方法调用在闭包中是完成Object-C层面的事情,先从Lua中获取当前调用的方法的名称,由方法名称通过Object-C的运行时API-sel_getUid获取到已注册的方法名称对应的方法标识-SEL,再根据方法标识由Object-C层面的API生成NSMethodSignature对象,然后由NSMethodSignature对象构造NSInvocation对象,最后由NSInvocation对象完成方法的调用。

说明书

一种基于Lua的iOS客户端功能动态更新的方法
技术领域
本发明涉及iOS客户端,尤其是一种基于Lua的iOS客户端功能动态更新的方法。
背景技术
对于一个已经上线苹果商店的App,当开发者需要对客户端进行更新时,最传统的做法是将重新编译生成的完整的App提交到苹果商店,等待苹果商店的审核,当审核通过后,用户可以重新下载安装App以达到更新的目的。
由于iOS平台限制了不允许以动态的方式加载由原生代码编译生成的可执行程序,意味着开发者不可以以动态链接库的方式来组织App的软件架构,也就意味着不可以通过单独更新动态链接库来完成对客户端App的更新。
如果采用传统的方式更新客户端,由于从提交给苹果商店审核到审核通过往往需要耗费较长的等待时间,导致我们的更新版本不能迅速地传递到客户的移动设备上,用户也需要重新下载安装整个客户端App。
一种与本发明相近的实现方案是基于Javascript脚本语言和内置于iOS的WebKit框架的Web App,通过WebKit下载和解析执行Javascript脚本代码,同样可以达到动态更新客户端功能的目的。
如果客户端是做成基于Javascript和WebKit的Web App的方式,更新客户端不需要经过审核,非常便捷,用户也无需重新下载安装整个App,但Web App的运行依赖于WebKit,受Javascript解析库的执行性能的影响,使得用户体验与原生App相比存在一定差距。
名词解释:
Lua:由标准C编写而成的脚本语言,在所有操作系统和平台上都可以编译,运行;Lua是一种嵌入式脚本语言,即Lua不是可以单独运行的程序,在实际应用中,通过Lua提供的C API完成C/C++代码两种语言之间的通信的;
iOS:苹果移动设备操作系统;
App:应用软件;
JavaScript:是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML(标准通用标记语言的子集)网页添加动态功能,比如响应用户的各种操作;
WebKit是开源的Web浏览器引擎,苹果的Safari、谷歌的Chrome浏览器都是基于这个框架来开发的。WebKit 还支持移动设备和手机,包括iPhone和Android手机都是使用WebKit做为浏览器的核心。
发明内容
针对上述缺点,本发明提出一种基于Lua的iOS客户端功能动态更新的方法,既可以达到客户端在无需提交审核的情况下及时更新的目的,用户也无需重新下载安装一次App,同时能够保持良好的用户体验。
本发明采用的技术方案是:
一种基于Lua的iOS客户端功能动态更新的方法,包括以下步骤:
A、将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配置相关客户端App代码模块的版本号;
B、客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号下载需要更新的Lua脚本业务逻辑代码;
C、当客户端执行到App代码模块时,通过Lua C API动态地加载已经下载好的Lua脚本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器来解析执行所述Lua脚本业务逻辑代码,以达到动态更新的目的。 
作为本方案的进一步改进,其还包括一桥接器,该桥接器用于转换Lua解析器不能解析的代码。
具体的,所述桥接器包括标识Object-C类对象和实例对象的userdata结构,该结构作为Lua中的userdata数据类型存在,该结构中存放着指向Object-C对象的指针和其他标识信息,与对象相关的操作基本上在这个结构的基础上完成。
进一步的,所述桥接器将与Object-C对象对应的userdata结构以key-value对的方式存放在两个映射表中,其中key为userdata结构中的Object-C对象的指针,value为userdata结构。
所述两个映射表中,其中一个表是弱表,存储了在Lua层面创建的Object-C对象的弱引用;另一个表是用于保存在桥接器层面创建的Object-C对象,是一个强引用表。
其中,所述桥接器包括Object-C类对象的创建、为一个类注册新方法以及对方法的调用。
进一步的,所述Object-C类对象的创建包括:在Lua元函数中通过定义的类名称字符串和Object-C的运行时API创建一个类,并构造Lua可以识别的userdata类型的结构,再将该userdata结构放入上述的两个映射表中。
上述为一个类注册新方法的过程为:通过Object-C的运行时API给一个类注册新的方法,该运行时API为class_addMethod,该class_addMethod接收一个IMP类型的函数指针,该函数指针指向这个新方法的实现。
所述方法调用的过程为:在桥接器的元方法index里将方法的调用作为一个闭包压入Lua当前维护的堆栈中,在元方法newindex中进行方法的覆盖。
所述方法调用在闭包中是完成Object-C层面的事情,先从Lua中获取当前调用的方法的名称,由方法名称通过Object-C的运行时API-sel_getUid获取到已注册的方法名称对应的方法标识-SEL,再根据方法标识由Object-C层面的API生成NSMethodSignature对象,然后由NSMethodSignature对象构造NSInvocation对象,最后由NSInvocation对象完成方法的调用。
本发明的有益效果:
本发明可以快速地迭代更新客户端,用户无需重新下载安装App,在大多数情况下,更新脚本量不会很大,更新过程不会影响用户的使用体验,最重要是Lua脚本解析器具有优秀的性能,使得客户端App能够保持良好的用户体验。
附图说明
下面结合附图对本发明的具体实施方式做进一步的说明。
图1是本发明的系统架构图;
图2是本发明的动态更新方法流程图。
具体实施方式
本技术方案基于以下技术基础:
1. Lua的设计理念是可以使它粘合其他的开发语言,它提供了一系列的Lua C API,根据其规范,我们可以编写一系列的元函数,作为Lua与其他语言编写的应用程序的粘合代码。
2. Object-C作为一种动态语言,提供了运行时丰富的API,提供了根据类名称来动态反射类对象、根据方法名称来动态绑定方法等特性。
3. Object-C可以方便地于C混合编程,为粘合代码的编写提供支持。
如图1-图2所示,为本发明的一种基于Lua的iOS客户端功能动态更新的系统及方法,该方法包括以下步骤:
A、将用Lua脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配置相关客户端App代码模块的版本号;
B、客户端启动运行时,通过访问服务端、查询相关App代码模块的版本号,根据版本号下载需要更新的Lua脚本业务逻辑代码;
C、当客户端执行到App代码模块时,通过Lua C API动态地加载已经下载好的Lua脚本业务逻辑代码,并通过已经集成到客户端程序中的Lua解析器和桥接器来解析执行所述Lua脚本业务逻辑代码,该桥接器用于转换Lua解析器不能解析的代码,以达到动态更新的目的。
下面针对上述步骤C展开阐述其实现方式:
桥接器主要维护了标识Object-C类对象和实例对象的userdata结构,该结构作为Lua中的userdata数据类型存在。该结构中存放着指向Object-C对象的指针和其他标识信息,与对象相关的操作基本上都是在这个结构的基础上完成。
    桥接器将上述与Object-C对象对应的userdata结构以key-value对的方式存放在两个表中,其中key为userdata结构中的Object-C对象的指针,value为userdata结构。其中一个表是弱表,存储了在Lua层面创建的Object-C对象的弱引用,当对象不再使用时会调用桥接器编写的__gc这个元方法来销毁对象。另一个表是用于保存在桥接器层面创建的Object-C对象,是一个强引用表,需要手动管理内存,框架运行时通过一个定时器不停地轮询这个表中的对象的引用计数,如果小于2,就会销毁对象。
如前面所述,我们可以编写一系列的元函数,作为Lua与Object-C的粘合代码,其中最核心的是在粘合代码中实现Object-C类、对象的创建以及对方法的调用。
1.  Object-C类对象的创建:
为了创建Object-C类对象,可以在Lua元函数中通过定义的类名称字符串和Object-C的运行时API(objc_getClass)创建一个类,并构造Lua可以识别的userdata类型的结构,再将该userdata结构放入上述的两个映射表中。
2.  为一个类注册新方法
通过Object-C的运行时API(class_addMethod)给一个类注册新的方法,class_addMethod接收一个IMP类型的函数指针,该函数指针指向这个新方法的实现。在Lua和Object-C的桥接器中,IMP函数包含了用户在Lua层面写的方法,也包括这个方法的参数和返回值在ObjC与Lua中的相互转换。也就是当调用一个Lua写的方法时会先把参数转化为Lua可识别的数据类型,然后由Lua C API中的lua_pcall函数调用Lua方法,执行完成后再把返回结果转换成ObjC类型。
3.  方法的调用
在桥接器的元方法__index里将方法的调用作为一个闭包(closure)压入Lua当前维护的堆栈中,在元方法__newindex中进行方法的override。在closure中主要是完成ObjC层面的事情,先从Lua中获取当前调用的方法的名称,由方法名称通过Object-C的运行时API(sel_getUid)获取到已注册的方法名称对应的方法标识(SEL),再根据方法标识由ObjC层面的API生成NSMethodSignature(NSMethodSignature存储了该方法的参数类型、数量和返回值类型)。然后由NSMethodSignature构造NSInvocation,最后由NSInvocation完成方法的调用。
以上所述仅为本发明的优先实施方式,本发明并不限定于上述实施方式,只要以基本相同手段实现本发明目的的技术方案都属于本发明的保护范围之内。

一种基于LUA的IOS客户端功能动态更新的方法.pdf_第1页
第1页 / 共8页
一种基于LUA的IOS客户端功能动态更新的方法.pdf_第2页
第2页 / 共8页
一种基于LUA的IOS客户端功能动态更新的方法.pdf_第3页
第3页 / 共8页
点击查看更多>>
资源描述

《一种基于LUA的IOS客户端功能动态更新的方法.pdf》由会员分享,可在线阅读,更多相关《一种基于LUA的IOS客户端功能动态更新的方法.pdf(8页珍藏版)》请在专利查询网上搜索。

1、10申请公布号CN104111855A43申请公布日20141022CN104111855A21申请号201410367963522申请日20140729G06F9/445200601H04L29/08200601H04M1/72520060171申请人广东能龙教育股份有限公司地址528403广东省中山市东区中山四路49号二楼至四楼72发明人余敬龙74专利代理机构广州嘉权专利商标事务所有限公司44205代理人张海文54发明名称一种基于LUA的IOS客户端功能动态更新的方法57摘要本发明公开了一种基于LUA的IOS客户端功能动态更新的方法,包括以下步骤A、将用LUA脚本语言编写的业务逻辑代码放置。

2、在服务端的指定位置,同时在服务端配置相关客户端APP代码模块的版本号;B、客户端启动运行时,通过访问服务端、查询相关APP代码模块的版本号,根据版本号下载需要更新的LUA脚本业务逻辑代码;C、当客户端执行到APP代码模块时,通过LUACAPI动态地加载已经下载好的LUA脚本业务逻辑代码,并通过已经集成到客户端程序中的LUA解析器和桥接器来解析执行所述LUA脚本业务逻辑代码,以达到动态更新的目的。51INTCL权利要求书2页说明书4页附图1页19中华人民共和国国家知识产权局12发明专利申请权利要求书2页说明书4页附图1页10申请公布号CN104111855ACN104111855A1/2页21一。

3、种基于LUA的IOS客户端功能动态更新的方法,其特征在于包括以下步骤A、将用LUA脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配置相关客户端APP代码模块的版本号;B、客户端启动运行时,通过访问服务端、查询相关APP代码模块的版本号,根据版本号下载需要更新的LUA脚本业务逻辑代码;C、当客户端执行到APP代码模块时,通过LUACAPI动态地加载已经下载好的LUA脚本业务逻辑代码,并通过已经集成到客户端程序中的LUA解析器来解析执行所述LUA脚本业务逻辑代码,以达到动态更新的目的。2根据权利要求1所述的一种基于LUA的IOS客户端功能动态更新的方法,其特征在于其还包括一桥接器,。

4、该桥接器用于转换LUA解析器不能解析的代码。3根据权利要求2所述的一种基于LUA的IOS客户端功能动态更新的方法,其特征在于所述桥接器包括标识OBJECTC类对象和实例对象的USERDATA结构,该结构作为LUA中的USERDATA数据类型存在,该结构中存放着指向OBJECTC对象的指针和其他标识信息,与对象相关的操作基本上在这个结构的基础上完成。4根据权利要求3所述的一种基于LUA的IOS客户端功能动态更新的方法,其特征在于所述桥接器将与OBJECTC对象对应的USERDATA结构以KEYVALUE对的方式存放在两个映射表中,其中KEY为USERDATA结构中的OBJECTC对象的指针,VA。

5、LUE为USERDATA结构。5根据权利要求4所述的一种基于LUA的IOS客户端功能动态更新的方法,其特征在于所述两个映射表中,其中一个表是弱表,存储了在LUA层面创建的OBJECTC对象的弱引用;另一个表是用于保存在桥接器层面创建的OBJECTC对象,是一个强引用表。6根据权利要求5所述的一种基于LUA的IOS客户端功能动态更新的方法,其特征在于所述桥接器包括OBJECTC类对象的创建、为一个类注册新方法以及对方法的调用。7根据权利要求6所述的一种基于LUA的IOS客户端功能动态更新的方法,其特征在于所述OBJECTC类对象的创建包括在LUA元函数中通过定义的类名称字符串和OBJECTC的运。

6、行时API创建一个类,并构造LUA可以识别的USERDATA类型的结构,再将该USERDATA结构放入上述的两个映射表中。8根据权利要求6所述的一种基于LUA的IOS客户端功能动态更新的方法,其特征在于上述为一个类注册新方法的过程为通过OBJECTC的运行时API给一个类注册新的方法,该运行时API为CLASS_ADDMETHOD,该CLASS_ADDMETHOD接收一个IMP类型的函数指针,该函数指针指向这个新方法的实现。9根据权利要求6所述的一种基于LUA的IOS客户端功能动态更新的方法,其特征在于所述方法调用的过程为在桥接器的元方法INDEX里将方法的调用作为一个闭包压入LUA当前维护的。

7、堆栈中,在元方法NEWINDEX中进行方法的覆盖。10根据权利要求9所述的一种基于LUA的IOS客户端功能动态更新的方法,其特征在于所述方法调用在闭包中是完成OBJECTC层面的事情,先从LUA中获取当前调用的方法的名称,由方法名称通过OBJECTC的运行时APISEL_GETUID获取到已注册的方法名称对应的方法标识SEL,再根据方法标识由OBJECTC层面的API生成NSMETHODSIGNATURE对象,然后由NSMETHODSIGNATURE对象构造NSINVOCATION对象,最后由NSINVOCATION对象权利要求书CN104111855A2/2页3完成方法的调用。权利要求书CN。

8、104111855A1/4页4一种基于LUA的IOS客户端功能动态更新的方法技术领域0001本发明涉及IOS客户端,尤其是一种基于LUA的IOS客户端功能动态更新的方法。背景技术0002对于一个已经上线苹果商店的APP,当开发者需要对客户端进行更新时,最传统的做法是将重新编译生成的完整的APP提交到苹果商店,等待苹果商店的审核,当审核通过后,用户可以重新下载安装APP以达到更新的目的。0003由于IOS平台限制了不允许以动态的方式加载由原生代码编译生成的可执行程序,意味着开发者不可以以动态链接库的方式来组织APP的软件架构,也就意味着不可以通过单独更新动态链接库来完成对客户端APP的更新。00。

9、04如果采用传统的方式更新客户端,由于从提交给苹果商店审核到审核通过往往需要耗费较长的等待时间,导致我们的更新版本不能迅速地传递到客户的移动设备上,用户也需要重新下载安装整个客户端APP。0005一种与本发明相近的实现方案是基于JAVASCRIPT脚本语言和内置于IOS的WEBKIT框架的WEBAPP,通过WEBKIT下载和解析执行JAVASCRIPT脚本代码,同样可以达到动态更新客户端功能的目的。0006如果客户端是做成基于JAVASCRIPT和WEBKIT的WEBAPP的方式,更新客户端不需要经过审核,非常便捷,用户也无需重新下载安装整个APP,但WEBAPP的运行依赖于WEBKIT,受J。

10、AVASCRIPT解析库的执行性能的影响,使得用户体验与原生APP相比存在一定差距。0007名词解释LUA由标准C编写而成的脚本语言,在所有操作系统和平台上都可以编译,运行;LUA是一种嵌入式脚本语言,即LUA不是可以单独运行的程序,在实际应用中,通过LUA提供的CAPI完成C/C代码两种语言之间的通信的;IOS苹果移动设备操作系统;APP应用软件;JAVASCRIPT是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。同时也是一种广泛用于客户端WEB开发的脚本语言,常用来给HTML(标准通用标记语言的子集)网页添加动态功能,比如响应用户的各种操作;WEBKIT是开源的WEB浏览器引擎,。

11、苹果的SAFARI、谷歌的CHROME浏览器都是基于这个框架来开发的。WEBKIT还支持移动设备和手机,包括IPHONE和ANDROID手机都是使用WEBKIT做为浏览器的核心。发明内容0008针对上述缺点,本发明提出一种基于LUA的IOS客户端功能动态更新的方法,既可以达到客户端在无需提交审核的情况下及时更新的目的,用户也无需重新下载安装一次说明书CN104111855A2/4页5APP,同时能够保持良好的用户体验。0009本发明采用的技术方案是一种基于LUA的IOS客户端功能动态更新的方法,包括以下步骤A、将用LUA脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配置相关客户。

12、端APP代码模块的版本号;B、客户端启动运行时,通过访问服务端、查询相关APP代码模块的版本号,根据版本号下载需要更新的LUA脚本业务逻辑代码;C、当客户端执行到APP代码模块时,通过LUACAPI动态地加载已经下载好的LUA脚本业务逻辑代码,并通过已经集成到客户端程序中的LUA解析器来解析执行所述LUA脚本业务逻辑代码,以达到动态更新的目的。0010作为本方案的进一步改进,其还包括一桥接器,该桥接器用于转换LUA解析器不能解析的代码。0011具体的,所述桥接器包括标识OBJECTC类对象和实例对象的USERDATA结构,该结构作为LUA中的USERDATA数据类型存在,该结构中存放着指向OB。

13、JECTC对象的指针和其他标识信息,与对象相关的操作基本上在这个结构的基础上完成。0012进一步的,所述桥接器将与OBJECTC对象对应的USERDATA结构以KEYVALUE对的方式存放在两个映射表中,其中KEY为USERDATA结构中的OBJECTC对象的指针,VALUE为USERDATA结构。0013所述两个映射表中,其中一个表是弱表,存储了在LUA层面创建的OBJECTC对象的弱引用;另一个表是用于保存在桥接器层面创建的OBJECTC对象,是一个强引用表。0014其中,所述桥接器包括OBJECTC类对象的创建、为一个类注册新方法以及对方法的调用。0015进一步的,所述OBJECTC类对。

14、象的创建包括在LUA元函数中通过定义的类名称字符串和OBJECTC的运行时API创建一个类,并构造LUA可以识别的USERDATA类型的结构,再将该USERDATA结构放入上述的两个映射表中。0016上述为一个类注册新方法的过程为通过OBJECTC的运行时API给一个类注册新的方法,该运行时API为CLASS_ADDMETHOD,该CLASS_ADDMETHOD接收一个IMP类型的函数指针,该函数指针指向这个新方法的实现。0017所述方法调用的过程为在桥接器的元方法INDEX里将方法的调用作为一个闭包压入LUA当前维护的堆栈中,在元方法NEWINDEX中进行方法的覆盖。0018所述方法调用在闭。

15、包中是完成OBJECTC层面的事情,先从LUA中获取当前调用的方法的名称,由方法名称通过OBJECTC的运行时APISEL_GETUID获取到已注册的方法名称对应的方法标识SEL,再根据方法标识由OBJECTC层面的API生成NSMETHODSIGNATURE对象,然后由NSMETHODSIGNATURE对象构造NSINVOCATION对象,最后由NSINVOCATION对象完成方法的调用。0019本发明的有益效果本发明可以快速地迭代更新客户端,用户无需重新下载安装APP,在大多数情况下,更新脚本量不会很大,更新过程不会影响用户的使用体验,最重要是LUA脚本解析器具有优秀的性能,使得客户端AP。

16、P能够保持良好的用户体验。说明书CN104111855A3/4页6附图说明0020下面结合附图对本发明的具体实施方式做进一步的说明。0021图1是本发明的系统架构图;图2是本发明的动态更新方法流程图。具体实施方式0022本技术方案基于以下技术基础1LUA的设计理念是可以使它粘合其他的开发语言,它提供了一系列的LUACAPI,根据其规范,我们可以编写一系列的元函数,作为LUA与其他语言编写的应用程序的粘合代码。00232OBJECTC作为一种动态语言,提供了运行时丰富的API,提供了根据类名称来动态反射类对象、根据方法名称来动态绑定方法等特性。00243OBJECTC可以方便地于C混合编程,为粘。

17、合代码的编写提供支持。0025如图1图2所示,为本发明的一种基于LUA的IOS客户端功能动态更新的系统及方法,该方法包括以下步骤A、将用LUA脚本语言编写的业务逻辑代码放置在服务端的指定位置,同时在服务端配置相关客户端APP代码模块的版本号;B、客户端启动运行时,通过访问服务端、查询相关APP代码模块的版本号,根据版本号下载需要更新的LUA脚本业务逻辑代码;C、当客户端执行到APP代码模块时,通过LUACAPI动态地加载已经下载好的LUA脚本业务逻辑代码,并通过已经集成到客户端程序中的LUA解析器和桥接器来解析执行所述LUA脚本业务逻辑代码,该桥接器用于转换LUA解析器不能解析的代码,以达到动。

18、态更新的目的。0026下面针对上述步骤C展开阐述其实现方式桥接器主要维护了标识OBJECTC类对象和实例对象的USERDATA结构,该结构作为LUA中的USERDATA数据类型存在。该结构中存放着指向OBJECTC对象的指针和其他标识信息,与对象相关的操作基本上都是在这个结构的基础上完成。0027桥接器将上述与OBJECTC对象对应的USERDATA结构以KEYVALUE对的方式存放在两个表中,其中KEY为USERDATA结构中的OBJECTC对象的指针,VALUE为USERDATA结构。其中一个表是弱表,存储了在LUA层面创建的OBJECTC对象的弱引用,当对象不再使用时会调用桥接器编写的_。

19、GC这个元方法来销毁对象。另一个表是用于保存在桥接器层面创建的OBJECTC对象,是一个强引用表,需要手动管理内存,框架运行时通过一个定时器不停地轮询这个表中的对象的引用计数,如果小于2,就会销毁对象。0028如前面所述,我们可以编写一系列的元函数,作为LUA与OBJECTC的粘合代码,其中最核心的是在粘合代码中实现OBJECTC类、对象的创建以及对方法的调用。00291OBJECTC类对象的创建为了创建OBJECTC类对象,可以在LUA元函数中通过定义的类名称字符串和OBJECTC的运行时API(OBJC_GETCLASS)创建一个类,并构造LUA可以识别的USERDATA类型的结构,说明书。

20、CN104111855A4/4页7再将该USERDATA结构放入上述的两个映射表中。00302为一个类注册新方法通过OBJECTC的运行时API(CLASS_ADDMETHOD)给一个类注册新的方法,CLASS_ADDMETHOD接收一个IMP类型的函数指针,该函数指针指向这个新方法的实现。在LUA和OBJECTC的桥接器中,IMP函数包含了用户在LUA层面写的方法,也包括这个方法的参数和返回值在OBJC与LUA中的相互转换。也就是当调用一个LUA写的方法时会先把参数转化为LUA可识别的数据类型,然后由LUACAPI中的LUA_PCALL函数调用LUA方法,执行完成后再把返回结果转换成OBJC。

21、类型。00313方法的调用在桥接器的元方法_INDEX里将方法的调用作为一个闭包(CLOSURE)压入LUA当前维护的堆栈中,在元方法_NEWINDEX中进行方法的OVERRIDE。在CLOSURE中主要是完成OBJC层面的事情,先从LUA中获取当前调用的方法的名称,由方法名称通过OBJECTC的运行时API(SEL_GETUID)获取到已注册的方法名称对应的方法标识(SEL),再根据方法标识由OBJC层面的API生成NSMETHODSIGNATURE(NSMETHODSIGNATURE存储了该方法的参数类型、数量和返回值类型)。然后由NSMETHODSIGNATURE构造NSINVOCATION,最后由NSINVOCATION完成方法的调用。0032以上所述仅为本发明的优先实施方式,本发明并不限定于上述实施方式,只要以基本相同手段实现本发明目的的技术方案都属于本发明的保护范围之内。说明书CN104111855A1/1页8图1图2说明书附图CN104111855A。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1