码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-05-06 17:56:48      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:ios   lua   wax   

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


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

标签:ios   lua   wax   

原文地址:http://blog.csdn.net/rainlesvio/article/details/45536723

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!