第一階段學習 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 端是無法用此工具進行調試。和官方人員聊判莉,其意思是不建議用這個做調試豆挽,可能存在某些未知問題吧。
最開始想實現(xiàn)斷點調試券盅,?由于官方沒有 Debugger 相關的文檔帮哈,故自己去琢磨其 SDK 的 Debuger 類源碼,從中分析用法锰镀。本地搭建個服務器娘侍,設置好端口和 IP 咖刃,調試器設置為開啟,demo 跑起來后私蕾,套接字創(chuàng)建好僵缺,也成功鏈接,run了一個腳本踩叭,發(fā)現(xiàn)最后一直在? DebugReadCmd 和 DebugSleep 倆方法死循環(huán),界面也沒渲染成功翠胰,卡死在那容贝。后來不明所以詢問官方人員,就叫使用其提供的 Debug 服務器之景。如有此方面經驗的斤富,麻煩告知我自己實現(xiàn)錯在哪里,謝謝锻狗!
Download
之前運行的腳本都是放在項目的本地目錄下满力。實際運用中,腳本會放在 Server 端轻纪,進行動態(tài)下發(fā)油额,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
由此實現(xiàn) Native 下載服務器的 zip 腳本包,然后解壓存儲眯漩,讀取運行芹扭,實現(xiàn) lua 腳本控制 Native 的界面渲染等。
擴展 —— 腳本控制下載腳本坤塞,并運行
在實現(xiàn)本地下載腳本的時候冯勉,突然有個想法:能否實現(xiàn) run 一個腳本 a,這個腳本 a 的作用是去服務器下載腳本 b摹芙,腳本 b 才是控制界面渲染的灼狰,a 控制下載 b 成功后,直接運行腳本 b浮禾。
當然這個官方文檔也沒用相關說明交胚,只能從源碼入手查找思路份汗。結果照了半天沒找到,求助官方群蝴簇。官方人員解答其 demo 里有個 dynamicsCode.lua 就是實現(xiàn)想法中 a 的功能杯活。結果搜尋了下此腳本,發(fā)現(xiàn) iOS 的 demo 里面沒有這個腳本熬词,只有 android 的 demo 目錄里有個 NUI_DynamicCode.lua 文件旁钧。關鍵方法如下:
查找其 SDK 里對應的 load 相關源碼,發(fā)現(xiàn)了如下所示:
腳本里加載另一個腳本的方法有如下三種:
loadfile? :參數(shù)是需要加載的腳本的路徑
load:參數(shù)是需要加載的腳本方法
loadstring:參數(shù)是需要加載的腳本內容
注:android 的 SDK 源碼中此處有點不同互拾。android 中只有 loadfile 和 load歪今,其中 load 的參數(shù)可以是方法也可以是腳本內容,故 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 環(huán)境中即可在腳本中使用教沾。
Demo 效果如下:?
如有紕漏蒲跨,歡迎指出,謝謝授翻!