lua动态修复线上bug实践(iOS篇)
利用wax框架,wax可以把Lua脚本语言和原生Objective-C应用编程接口(API)结合起来。这意味着,你可以从Lua里面,使用任何和全部的Objective-C类及框架.
1.wax.framework的问题
这个框架已经4年没更新了,而且不支持64位.
用它来替换原来ViewController中函数不生效.
所以替换为
2.把wax框架拉进去还是运行不了,报错
可以看出,错误的意思是 TCPServerErrorDomain这个标志在wax和wax_server中重复定义,
解决:
把在wax_server中的TCPServerErrorDomain注释了.
3.试验动态修复bug.
以改变一个页面的颜色为例,原来显示为白色,现在版本发出去了,我想改变颜色为红色
(1)每次启动app时建立动态加载lua文件的入口(下面写)
然后启动lua文件:
wax_start("change.lua", nil);
(2)页面原来有一个方法:
- (void)setBackgroundColor{
NSLog(@"test");
}
如果没有这个方法可以hook其他的方法,然后用lua写一样的实现再加一个改变背景色的方法.
(3)写change.lua改变颜色的方法:
waxClass{"ViewController",UIViewController}
functionsetBackgroundColor(self)
self:view():setBackgroundColor(UIColor:redColor())
end
(4)ok了,运行的时候 setBackgroundColor的方法已经替换成lua修改后的这个方法了
4.建立动态加载lua文件的入口
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
[selfdownloadLuaFile];
return
YES;
}
- (void)downloadLuaFile {
dispatch_async(dispatch_get_main_queue(), ^{
NSString
*doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES)
objectAtIndex:0];
NSString
*directory = [doc
stringByAppendingPathComponent:@“change.lua"];
NSURL *url=[NSURL
URLWithString:@"http://localhost/change.lua"];
NSURLRequest *request=[NSURLRequest
requestWithURL:url];
NSError *error=nil;
NSData *data = [NSURLConnection
sendSynchronousRequest:request
returningResponse:nil
error:&error];
if([data
length]>0)
{
NSLog(@"下载成功");
if([data
writeToFile:directory
atomically:YES]){
NSLog(@"保存成功");
NSString *luaFilePath = [[NSString
alloc ] initWithFormat:@"%@/?.lua;%@/?/init.lua;%@/?.dat;",doc, doc,doc];
setenv(LUA_PATH, [luaFilePath
UTF8String],
1); //差点漏了设置路径
wax_start("change.lua", nil);
}else {
NSLog(@"保存失败");
}
} else {
NSLog(@"下载失败,失败原因:%@",error);
}
});
}
5.然后线上版本出现了bug就可以在下发的change.lua文件里修复了.
6.如果是出现了比较复杂的bug怎么办?深入学习lua,理论上什么bug都是可以修复的.