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

来源:互联网 发布:unity3d实现场景漫游 编辑:程序博客网 时间:2024/06/06 07:04
lua动态修复线上bug实践(iOS篇)


利用wax框架,wax可以把Lua脚本语言和原生Objective-C应用编程接口(API)结合起来。这意味着,你可以从Lua里面,使用任何和全部的Objective-C类及框架.

1.wax.framework的问题
https://github.com/probablycorey/wax
这个框架已经4年没更新了,而且不支持64位.
用它来替换原来ViewController中函数不生效.
所以替换为
https://github.com/maxfong/WaxPatch_X64


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=[NSURLURLWithString:@"http://localhost/change.lua"];
       
NSURLRequest *request=[NSURLRequestrequestWithURL:url];
       
NSError *error=nil;
       
NSData *data = [NSURLConnectionsendSynchronousRequest:requestreturningResponse:nilerror:&error];
        if([data
length]>0)
        {
           
NSLog(@"下载成功");
            if([data
writeToFile:directoryatomically:YES]){
               NSLog(@"保存成功");
                NSString *luaFilePath = [[NSStringalloc ] initWithFormat:@"%@/?.lua;%@/?/init.lua;%@/?.dat;",doc, doc,doc];
               setenv(LUA_PATH, [luaFilePathUTF8String], 1); //差点漏了设置路径
                wax_start("change.lua", nil);
            }else {
               
NSLog(@"保存失败");
            }
        } else {
           
NSLog(@"下载失败,失败原因:%@",error);
        }
    });
}


5.然后线上版本出现了bug就可以在下发的change.lua文件里修复了.

6.如果是出现了比较复杂的bug怎么办?深入学习lua,理论上什么bug都是可以修复的.


1 0
原创粉丝点击