IOS 动态更新 waxpatch (lua in iOS App)

起源

其实很早我在参加一个沙龙的时候,就听到了点评的同学在用lua做ab test,虽然那个时候我觉得我自己很牛逼了,但是其实还是啥都没有听懂,直到今天才回过神来仔细看了下这个东西。

Lua(简称撸啊)在iOS中的确被广泛的使用着,在行业中最著名的莫过于魔兽世界(山口山)以及移动互联网的愤怒的小鸟。

Lua在cocos2d以及iOS的应用动态变化上面使用比较广泛,下面我们用两个例子来说明下。

框架

不得不说,最著名的莫过于wax和waxpatch,一个是能够在iOS中使用lua语言编写界面控件,一个是能够动态更新。

wax

我们首先先要下载wax.framework,然后新建一个iOS app的project,将该模块添加到我们的工程中去。

接着我们需要在AppDelegate.himport#import

在AppDlegate的实现中增加

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

wax_start("init.lua", nil);

returnYES;

}

接着我们来增加这个init.lua,如下代码,其实就如同ViewController头文件定义一样。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

// Override point for customization after application launch.

wax_start("init.lua", nil);

returnYES;

}

有了头文件之后我们也需要有实现吧,这个代码可读性就比oc来的高多了,但是需要在第一行声明在oc中的这个类名。

waxClass{"ViewController", UIViewController}

functionviewDidLoad(self)

self.super:viewDidLoad(self)

local label = UILabel:initWithFrame(CGRect(0, 120, 320, 40))

label:setColor(UIColor:blackColor())

label:setText("Hello Wax!")

label:setTextAlignment(UITextAlignmentCenter)

local font = UIFont:fontWithName_size("Helvetica-Bold",50)

label:setFont(font)

self:view():addSubview(label)

end

先不要急着编译,我们还需要更改一下编译的方式以及确认framework已经被准确导入

我们来看下效果:

waxpatch

waxpatch完全就是基于这个wax的框架之上去做的一个动态更新的组件了。我们来看下动态更新的流程。

第一步:增加一个加载的协议

增加一个ProtocolLoader.h,其中添加需要去动态更新的组建名称。

#import < UIKit/UIKit.h>

@interface ProtocolLoader : NSObject < UIApplicationDelegate, UIWebViewDelegate, UIActionSheetDelegate, UIAlertViewDelegate, UISearchBarDelegate, UITextViewDelegate, UITabBarControllerDelegate> {}

@end

@implementation ProtocolLoader

@end

第二步:声明需要加载的远程服务器地址,并且增加解压缩的头文件和实现

我在AppDelegate.m中先声明了我远程更新库的地址:

1

#define WAX_PATCH_URL @"https://github.com/monkeytest15/waxDemo/raw/master/patch.zip"

同时增加解压缩实现:

第三步:加载

当然,我们都会理解为加载的逻辑是在AppDelegate.m中实现的,不过其实在该文件中只是调用了加载这个方法,具体的实现我在debug的过程发现在wax.m的文件中,核心代码如下:

// Load stdlib

// ---------------

#ifdef WAX_STDLIB

// If the stdlib was autogenerated and included in the source, load

char stdlib[] = WAX_STDLIB;

size_t stdlibSize = sizeof(stdlib);

#else

char stdlib[] ="require 'wax'";

size_t stdlibSize = strlen(stdlib);

#endif

if(luaL_loadbuffer(L, stdlib, stdlibSize,"loading wax stdlib") || lua_pcall(L, 0, LUA_MULTRET, 0)) {

fprintf(stderr,"Error opening wax scripts: %s\n", lua_tostring(L,-1));

}

加载之后就会动态的加载我们远程服务端的逻辑.

远程zip包

接着我们来看下远程服务端上都有什么,远程服务端可以自己定义zip包的名字以及内容,但约定的内容是必须有一个patch.lua文件以及其他的.lua的文件,patch.lua中是需要定义本次更新的View的主类名称。比如require "MainViewController"

而其他的类自然就是需要更新的逻辑,如:

waxClass{"MainViewController", UITableViewController}

functiontableView_cellForRowAtIndexPath(self, tableView, indexPath)

local cell = self:ORIGtableView_cellForRowAtIndexPath(tableView, indexPath)

cell:textLabel():setText("".. (20 - indexPath:row()))

cell:detailTextLabel():setText("This is monkey")

cell:textLabel():setTextColor(UIColor:blueColor())

returncell

end

动态效果

然后我们来看下我更新之后的效果吧:

总结

xcode对于lua动态支持做的还是不错的,不过资料的确比较少,之后看看是不是还有很多可做之处。不过做ab test应该绰绰有余了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • Wax Lua是什么? Lua 我就不介绍了,我们都在使用的脚本语言,游戏开发的神器。 而 Wax 就是使用 Lu...
    零纪年阅读 1,446评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,639评论 18 139
  • 那些多余的话 在ios平台的基础框架中,代码的直接动态部署一直是一个无法解决的问题,所以我们只能退而求其次,通过建...
    淡淡如水舟阅读 4,670评论 3 15
  • 2017年11月10日 星期五 多云 连着看完三毛的两本书后,我突然想缓一缓了。可能是觉得自己需要休息了,每...
    张艳妮yani阅读 354评论 4 11
  • 提到网红自然而然地就会想起芙蓉姐姐和凤姐,由于同属于网红界鼻祖,而且出道时身上散发出来的相似的感觉,让人本能的就会...
    林晓枫FZ阅读 437评论 0 1