lua动态修复线上bug实践(iOS篇)

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都是可以修复的.


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。