当前位置: 首页 > 科技观察

iOSApp的lua起源

时间:2023-03-13 01:44:07 科技观察

其实很早的时候参加沙龙,听说评论的同学都是用lua做ab测试的。虽然当时觉得自己牛逼,但还是一无所知,直到今天才回过神来,仔细看看这个东西。Lua(简称Lua)在iOS中的应用确实很广泛,业界最火的就是移动互联网上的魔兽世界(山口山)和愤怒的小鸟。Lua广泛应用于cocos2d和iOS应用的动态变化。让我们用两个例子来说明。框架不得不说最好的就是wax和waxpatch,一个是可以在iOS中使用lua语言编写界面控件,一个是可以动态更新。对于wax,我们首先需要下载wax.framework,然后新建一个iOSapp项目,将这个模块添加到我们的项目中。那么我们需要在AppDlegate的实现中在AppDelegate.h中添加import#import-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{//Overridepointforcustomizationafterapplicationlaunch.wax_start("init.lua",nil);returnYES;}接下来我们添加这个init.lua,下面的代码其实和ViewController头文件的定义是一样的。-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{//Overridepointforcustomizationafterapplicationlaunch.wax_start("init.lua",nil);returnYES;}我们有了头文件之后,还需要实现它,这段代码的可读性比oc高很多,但是oc中的类名需要声明在第一行。waxClass{"ViewController",UIViewController}functionviewDidLoad(self)self.super:viewDidLoad(self)locallabel=UILabel:initWithFrame(CGRect(0,120,320,40))label:setColor(UIColor:blackColor())label:setText("HelloWax!")label:setTextAlignment(UITextAlignmentCenter)localfont=UIFont:fontWithName_size("Helvetica-Bold",50)label:setFont(font)self:view():addSubview(label)end别急着编译,我们还需要改成编译确认框架正确导入的方式来看看效果:waxpatchwaxpatch是一个基于wax框架的动态更新组件。让我们看一下动态更新过程。第一步:添加一个加载的协议,添加一个ProtocolLoader.h,其中添加了需要动态更新的组件的名称。#import@interfaceProtocolLoader:NSObject{}@end@implementationProtocolLoader@end第二步:声明要加载的远程服务器地址,并添加解压缩的头文件和实现我首先在AppDelegate.m中声明了我的远程更新库的地址:#defineWAX_PATCH_URL@"https://github.com/monkeytest15/waxDemo/raw/master/patch.zip"并添加了解决方案压缩实现:第三步:加载当然我们都明白加载的逻辑是在AppDelegate.m中实现的,但实际上这个文件只是调用了加载的方法。我在调试过程中在wax中找到了具体的实现。在.m文件中,核心代码如下://Loadstdlib//----------------#ifdefWAX_STDLIB//ifthestdlib是自动生成并包含在源码中的,loadcharstdlib[]=WAX_STDLIB;size_tstdlibSize=sizeof(stdlib);#elsecharstdlib[]="require'wax'";size_tstdlibSize=strlen(stdlib);#endifif(luaL_loadbuffer(L,stdlib,stdlibSize,"loadingwaxstdlib")||lua_pcall(L,0,LUA_MULTRET,0)){fprintf(stderr,"Erroropeningwaxscripts:%s\n",lua_tostring(L,-1));}加载后会动态加载我们远程服务器的逻辑.远程压缩包接下来我们看一下远程服务器上都有什么。远程服务器可以自己定义压缩包的名称和内容,但约定的内容是必须有一个patch.lua文件和其他.lua文件。在patch.lua中,需要定义更新View的主类名,比如require"MainViewController",其他类自然就是需要更新的逻辑,比如:waxClass{"MainViewController",UITableViewController}functiontableView_cellForRowAtIndexPath(self,tableView,indexPath)localcell=self:ORIGtableView_cellForRowAtIndexPath(tableView,indexPath)cell:textLabel():setText(""..(20-indexPath:row()))cell:detailTextLabel():setText("Thisismonkey")cell:textLabel():setTextColor(UIColor:blueColor())returncellend动态效果再看看我更新后的效果:原文链接:http://blog.sina.com.cn/s/blog_7022adbf0102vcg3。网页格式