LuaView第二阶段学习—— Debugger & Download

第一阶段学习 LuaView,已经对其有一定的了解:什么是LuaView、LuaViewCore,自定义控件的桥接等。(详见 LuaView初识)此部分主要对 LuaViewSDK 自带的调试工具 LuaViewDebugger 和 如何下载 Server 端的 Lua 脚本进行 Native 界面的渲染做记录。

LuaViewDebugger

LuaViewDebugger 是 LuaViewSDK 提供的 Lua 脚本调试工具。因为在 Xcode 上无法断点调试 Lua 脚本,用指令调试又显得麻烦。LuaViewDebugger 刚好解决了 Lua 脚本断点调试的问题。

但是这个工具功能也过于简单了些。和 LuaViewSDK 官方人员聊了下,其实就是对 Lua 调试指令做了一次封装而已,没有其他扩展功能。

启动这个 LuaViewDebugger ,Mac OS 下需要下载 JDK 的支持,JDK 下载地址 。点击启动 LuaViewDebugger 如下图所示:

此时在项目里面随意 run 一个 Lua 脚本,LuaViewDebugger 就会展开成如下界面,

可以进行断点调试,也可以点击变量打印。其他也没啥功能了。目前 Android 端是无法用此工具进行调试。和官方人员聊,其意思是不建议用这个做调试,可能存在某些未知问题吧。

最开始想实现断点调试,�由于官方没有 Debugger 相关的文档,故自己去琢磨其 SDK 的 Debuger 类源码,从中分析用法。本地搭建个服务器,设置好端口和 IP ,调试器设置为开启,demo 跑起来后,套接字创建好,也成功链接,run了一个脚本,发现最后一直在  DebugReadCmd 和 DebugSleep 俩方法死循环,界面也没渲染成功,卡死在那。后来不明所以询问官方人员,就叫使用其提供的 Debug 服务器。如有此方面经验的,麻烦告知我自己实现错在哪里,谢谢!

Download

之前运行的脚本都是放在项目的本地目录下。实际运用中,脚本会放在 Server 端,进行动态下发,Native 下载好脚本后进行界面渲染等操作。

搭建本地服务器

网上有很多搭建本地服务器的方法,在此就不多说了。下面是我的配置 json

将 Lua 脚本放到服务器目录下,终端输入  npm run serveapp 启动服务器。

Native 下载 Server 端的 Lua 脚本资源

Demo 中,我直接尝试下载服务器的脚本 zip 包,然后本地解压:

- (void)loadData{

   NSString*urlStr = luaResourceUrlStr;

   NSString*saveZipFilePath = [[[NSBundlemainBundle]bundlePath]stringByAppendingString:@"XQOnlineLuas.zip"];

   NSString*saveUnzipFilePath = [[NSBundlemainBundle]bundlePath];

   BOOLloadZipSucess = [XQDataHelperloadZipLuaFilesWithUrl:urlStrsavePath:saveZipFilePath];

   if(loadZipSucess) {

     NSArray*ary = [XQDataHelperunzipFileWithFilePath:saveZipFilePathpath:saveUnzipFilePath];

     if(ary) {

         NSLog(@"解压成功,解压的文件是:\n %@",ary);

     }

  }

}

其中下载方法:

+ (BOOL)loadZipLuaFilesWithUrl:(NSString *)urlStr savePath:(NSString*)savePath{

if(urlStr.length==0|| savePath.length==0) {

returnNO;

}

NSURL*url = [NSURL URLWithString:urlStr];

NSURLRequest*request = [NSURLRequest requestWithURL:url];

NSError*error =nil;

NSData*data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&error];

if(data !=nil){

NSLog(@"下载成功");

NSString *filePath = savePath;

sucess = [datawriteToFile:filePathatomically:YES];

}else{

NSLog(@"%@", error);

}

return sucess;

zip 包解压我使用了第三方的 ZipArchive(SDK 里也有官方提供的 LVPkgManager 类可用于解压)。解压方法:

+ (NSArray*)unzipFileWithFilePath:(NSString*)zipFilePath path:(NSString*)unzipFilePath{

BOOLsucess =NO;

ZipArchive*zip = [[ZipArchivealloc]init];

if([zipUnzipOpenFile:zipFilePath]) {

sucess = [zipUnzipFileTo:unzipFilePathoverWrite:YES];

if(!sucess) {

[zipUnzipCloseFile];

}

}

if(sucess) {

NSLog(@"解压保存成功.");

return[zipgetZipFileContents];

}

else{

NSLog(@"解压保存失败.");

returnnil;

}

}

@end

由此实现 Native 下载服务器的 zip 脚本包,然后解压存储,读取运行,实现 lua 脚本控制 Native 的界面渲染等。

扩展 —— 脚本控制下载脚本,并运行

在实现本地下载脚本的时候,突然有个想法:能否实现 run 一个脚本 a,这个脚本 a 的作用是去服务器下载脚本 b,脚本 b 才是控制界面渲染的,a 控制下载 b 成功后,直接运行脚本 b。

当然这个官方文档也没用相关说明,只能从源码入手查找思路。结果照了半天没找到,求助官方群。官方人员解答其 demo 里有个 dynamicsCode.lua 就是实现想法中 a 的功能。结果搜寻了下此脚本,发现 iOS 的 demo 里面没有这个脚本,只有 android 的 demo 目录里有个 NUI_DynamicCode.lua 文件。关键方法如下:

查找其 SDK 里对应的 load 相关源码,发现了如下所示:

脚本里加载另一个脚本的方法有如下三种:

loadfile  :参数是需要加载的脚本的路径

load:参数是需要加载的脚本方法

loadstring:参数是需要加载的脚本内容

注:android 的 SDK 源码中此处有点不同。android 中只有 loadfile 和 load,其中 load 的参数可以是方法也可以是脚本内容,故 android 端的 load 等同于 iOS 端的 load 和 loadstring。所以在写一份脚本两端使用时,若使用 loadstring ,android端是无法识别的。

我的demo中,分别对以上三种方式做了尝试:

XQLuaLoad.lua 脚本是负责下载 server 端脚本 online0.lua ,并运行。

--待下载的脚本url

fileUrl = "http://xxxxx/XQOnline0.lua"

Download( fileUrl,"online0.lua",

       function (data)

       print( data );

       --使用loadstring的方式加载下载的脚本,并运行

       online0 = loadstring(tostring(data));

      online0();

end);

XQLuaLoad.lua 可以放在项目本地目录,也可以放在 server 端,Native 需要先下载运行 XQLuaLoad.lua。该脚本中,我用了 SDK 中 LVDownloader 类的下载方法。当然如 LuaView初识 描述的,你也可以自定义下载方法,然后桥接到 Lua 环境中即可在脚本中使用。

Demo 效果如下: 

如有纰漏,欢迎指出,谢谢!

Demo地址

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

推荐阅读更多精彩内容

  • 0. 前言 最近一直在写Lua脚本,有时候出了问题,不知道是Lua层的问题,还是上游的问题,不知道从何下手。于是我...
    ZSpirytus阅读 2,354评论 0 3
  • 前言 作为一名iOS开发工程师,App的动态化是一种趋势,毕竟需求的增多,频繁的提交版本、更新版本对用户体验上肯定...
    小千阅读 4,528评论 6 52
  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 3,637评论 2 7
  • 最近时常在想,成都让音乐人留下脍炙人口的民谣歌曲和外乡人痴痴的向往。然而成都让小思留下的只是一份西点情怀。...
    小思Yookee阅读 395评论 4 2
  • 语文学习了祖国多么广大,日积月累里面的词语,还学了谁和谁好。读读童谣和二歌,数学改试卷上的错题,美术课上画了云朵上...
    王梓旭1阅读 183评论 0 0