SDK使用说明 - iOS
如何接入
Pods引入(推荐)
在目标工程Podfile中加入如下命令,可以自动将最新的LuaViewSDK和对应的Lua虚拟机代码同时引入:
pod 'LuaViewSDK', :git => 'git@gitlab.alibaba-inc.com:luaview/LuaViewSDK.git'
源码引入
在Github上clone或者下载最新版本源代码:https://github.com/alibaba/LuaViewSDK,将LuaViewSDK和Lua虚拟机的源代码拷贝到目标工程中。如下图所示,红色表示的是LuaViewSDK源代码,绿色表示的是Lua虚拟机源代码
基本用法
LuaViewSDK提供了两种方法进行LuaView脚本的动态渲染,一种使用LuaView对象进行脚本的加载和渲染,两一种是使用LuaViewCore虚拟机对象进行脚本加载,并对任意的View进行动态渲染
使用LuaView对象加载脚本和渲染:
- 创建LuaView对象
LuaView *luaview = [[LuaView alloc] initWithFrame:rect];
- 创建Bundle对象,用于文件搜索;如果只使用本地文件,则可跳过第2步
LVBundle *bundle = [[LVBundle alloc] init]; luaview.bundle = bundle; //2.1 设置脚本的搜索路径,可添加多个路径;如果只使用工程本地脚本,则无需设置 [luaview.bundle addScriptPath:packagePath]; //2.2 设置资源文件的搜索路径;如果只使用工程本地资源,则无需设置 [luaview.bundle addResourcePath:packagePath];
- 加载并运行脚本
//3.1 加载明文脚本 [luaview runFile:scriptFileName]; //3.2 加载加密脚本 [luaview runSignFile:scriptFileName];
- 使用完毕清理内存
//LuaView对象被回收之前必须清理内存 [luaview releaseLuaView];
这样生成的View可以作为单个view嵌入到任意view中使用,也可以作为独立页面添加到ViewController中使用。如果需要使用独立的VC页面,推荐使用SDK中
LViewController
,已经做好了各种生命周期和内存管理的处理- 直接使用LViewController
//1. 创建LuaView VC LViewController *luaVC = [[LViewController alloc] init]; //2. 加载并运行脚本 [luaVC.lv runFile:scriptFileName];
进阶:
开发者也可以使用完全自定义的View Controller,将LuaView作为一个普通的view加入到view层级中,处理好view的事件,并做好内存回收即可,例:
//创建LuaView -(void)viewDidLoad{ self.luaview = [[LuaView alloc] init]; self.luaview.viewController = self; [self.view addSubview:self.luaview]; } //事件管理 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event { [self.luaview motionBegan:motion withEvent:event]; } - (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event { [self.luaview motionCancelled:motion withEvent:event]; } - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event { [self.luaview motionEnded:motion withEvent:event]; } -(void) viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.luaview viewWillAppear]; } -(void) viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; [self.luaview viewDidAppear]; } -(void) viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self.luaview viewWillDisAppear]; } -(void) viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:animated]; [self.luaview viewDidDisAppear]; } //清理内存 -(void)dealloc{ [self.luaview releaseLuaView]; }
进阶:使用LuaViewCore加载脚本进行共享虚拟机渲染 - 一个虚拟机渲染多个页面
由于LuaView可以作为一个标准的View放到任何页面使用,虽然LuaViewSDK性能相对较高,但是当一个页面中有过多个LuaView时,依然可能会造成性能下降;在这种情况下,为了提高性能和渲染效率,我们建议使用LuaViewCore作为共享虚拟机进行渲染。如下图所示,聚划算客户端的首页是Native结构,但是其中所有的商品坑位都是使用同一个LuaViewCore进行共享渲染
如何使用共享LuaViewCore进行渲染?
a. 创建一个LuaViewCore
LuaViewCore *lvCore = [[LuaViewCore alloc] init];
b. 设置脚本和资源搜索路径(可选)
LVBundle *bundle = [[LVBundle alloc] init]; lvCore.bundle = bundle; //2.1 设置脚本的搜索路径,可添加多个路径;如果只使用工程本地脚本,则无需设置 [luaview.bundle addScriptPath:packagePath]; //2.2 设置资源文件的搜索路径;如果只使用工程本地资源,则无需设置 [luaview.bundle addResourcePath:packagePath];
c. 加载脚本文件
[lvCore loadFile:scriptName];
d. 渲染指定View(可以是任意view)
//targetView可以是用户指定的任意一个view,不必是LuaView对象 //luaFunctionName是加载的LuaView脚本里的函数 NSString *functionName = @"luaFuntionName"; [lvCore callLua:functionName environment:targetView args:nil];
如何使用加密脚本
LuaViewSDK支持RSA2048非对称加密。如果脚本使用了RSA加密,那么在加载脚本之前需要加载公钥证书。
LuaView *luaview = [[LuaView alloc] init]; NSString filePath = @"CertificatePath"; //公钥证书路径 [luaview.rsa setPublicKeyFilePath:filePath];
或
LuaViewCore *luaviewCore = [[LuaViewCore alloc] init]; NSString filePath = @"CertificatePath"; //公钥证书路径 [luaviewCore.rsa setPublicKeyFilePath:filePath];
然后使用加密接口运行脚本
[luaview runSignFile:luaviewScript];
SDK接口
LuaView对象方法
API | 参数 | 返回值 | 备注 |
---|---|---|---|
bundle | - | Bundle对象 | LuaView的bundle属性用于脚本目录管理 |
loadFile | url: NSString | 错误信息 | 加载指定脚本 |
loadSignFile | url: NSString | 错误信息 | 加载指定加密脚本,需要预先加载加密证书 |
runFile | url: NSString | 错误信息 | 运行指定脚本 |
runSignFile | url: NSString | 错误信息 | 运行指定加密脚本,需要预先加载加密证书 |
runData | data: 数据块, fileName:调试信息 | 错误信息 | 加载指定数据块 |
viewWillAppear | - | - | viewWillAppear |
viewDidAppear | - | - | viewDidAppear |
viewWillDisAppear | - | - | viewWillDisAppear |
viewDidDisAppear | - | - | viewDidDisAppear |
motionBegan | - | - | motionBegan |
motionEnded | - | - | motionEnded |
LuaViewCore对象方法
API | 参数 | 返回值 | 备注 |
---|---|---|---|
bundle | - | LVBundle对象 | LuaView的bundle属性,用于脚本和资源的搜索路径管理 |
ras | LVRSA对象 | LVRSA对象,用于脚本加密证书管理 | |
loadFile | url: NSString | 错误信息 | 加载指定脚本 |
loadSignFile | url: NSString | 错误信息 | 加载指定加密脚本,需要预先加载加密证书 |
runFile | url: NSString | 错误信息 | 加载指定脚本 |
runSignFile | url: NSString | 错误信息 | 加载指定加密脚本,需要预先加载加密证书 |
runData | data: 数据块, fileName:调试信息 | 错误信息 | 加载指定数据块 |
LVBundle对象方法
API | 参数 | 返回值 | 备注 |
---|---|---|---|
addResourcePath | path:NSString | - | 资源搜索路径 |
removeResourcePath | path:NSString | - | 去除资源搜索路径 |
addScriptPath | path:NSString | - | 脚本搜索路径 |
removeScriptPath | path:NSString | - | 去除脚本搜索路径 |
resourcePathWithName | name:NSString | - | 资源 |
resourceWithName | name:NSString | - | 获取资源 |
imageWithName | name:NSString | - | 获取图片 |
scriptPathWithName | name:NSString | - | 获取脚本路径 |
scriptWithName | name:NSString | - | 获取脚本 |
signedScriptWithName | name:NSString | - | 获取签名脚本 |
LVRSA对象方法
API | 参数 | 返回值 | 备注 |
---|---|---|---|
verifyData:withSignedData | data:NSData sign:NSData |
BOOL | 验证数据的签名是否正确 |
aesKeyBytes | - | NSData | 获取证书的NSData格式内容 |
setPublicKeyFilePath: | filePath:String | - | 设置RSA公钥证书路径 |
lv_SHA256HashBytes | fileData | 静态方法,获取文件数据的SHA256签名 |