基于wax的lua IOS插件开发
作者:朱克锋
邮箱:zhukefeng@iboxpay.com
转载请注明出处:http://blog.csdn.net/linux_zkf
Objective-C的运行时支持新增类型和方法,但是由于苹果的限制,开发者无法在iOS上动态加载Objective-C原生代码,所以只能寻求替代方案。
脚本语言就可以一定程度上解决这一问题,一般情况下可以使用html+js实现例如支付宝的插件的实现就是用的是html+js技术,也可以基于lua脚本实现,下面介绍wax+lua的实现方式
关于wax请参见下面的连接
Wax项目(http://github.com/probablycorey/wax)
当然多数熟悉iOS的开发人员不一定会赞同采用这种开发方式,所以我们在引入Wax的同时希望能够和已有的iOS项目无缝的结合起来,不改变项目使用Objective-C开发的方式,在项目上线后通过Wax来改变程序运行时的行为。这样就可以避免漫长的AppStore上线审核,随时对线上程序进行调整,甚至是修复线上程序的问题或缺陷。
下面是IOS代码,这里是IOS列表的简单的几个接口的实现,其实只是写了一下接口,并没有实现具体的方法,只是为了和lua脚本做个比较
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell =[[UITableViewCellalloc] initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:@"Cell"];
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
{
}
下面是基于wax的lua代码,看上去和IOS原生方法有很多类似的地方,不过要注意lua特殊的语法格式,下面有风云翻译的lua教程可以参考学习
waxClass{"LIViewController",UITableViewController}
function viewDidLoad(self)
print("viewDidLoad")
end
function tableView_numberOfRowsInSection(self, tableView,section)
return 20;
end
function tableView_cellForRowAtIndexPath(self, tableView,indexPath)
local cell =self:ORIGtableView_cellForRowAtIndexPath(tableView, indexPath)
cell:textLabel():setText("".. indexPath:row())
cell:detailTextLabel():setText("TESTDATA LUA HUHUHU~~~")
cell:textLabel():setTextColor(UIColor:redColor())
print("cell num is :" .. indexPath:row())
--if (1 ==indexPath:row()) then
--print("OMG---------!!!!!!!")
--end
return cell
end
function tableView_didDeselectRowAtIndexPath(self,tableView, indexPath)
print("you selected row num is : "..indexPath:row())
end
基于wax的lua使用并不复杂,下面就是一种很简单的实现方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window = [[[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]]autorelease];
// Override point for customization after applicationlaunch.
wax_start("init.lua",nil);
self.viewController = [[LIViewControlleralloc] init];
self.window.rootViewController =self.viewController;
[self.windowmakeKeyAndVisible];
returnYES;
}
Lua脚本的编写方式和Objective-C有很多的相似支出,在方法和类名上都和iOS的原生框架保持了一致。iOS开发人员只需要略微了解一下Lua的语法,就可以编写对应的Lua补丁。更多的细节可以参见Wax项目的介绍:https://github.com/probablycorey/wax/wiki/Overview。
需要注意的是Wax项目本身不支持方法覆盖和从Objective-C反向调用Lua修改后的实例
lua语法参照
http://www.codingnow.com/2000/download/lua_manual.html
项目代码地址
https://github.com/zhukefeng-ios/LuaIOS
基于wax的lua IOS插件开发的更多相关文章
- Ios插件开发
Ios插件开发 http://www.exmobi.cn/course/course_26.html Android插件开发 http://www.exmobi.cn/course/course_25 ...
- 【spring boot】【redis】spring boot基于redis的LUA脚本 实现分布式锁
spring boot基于redis的LUA脚本 实现分布式锁[都是基于redis单点下] 一.spring boot 1.5.X 基于redis 的 lua脚本实现分布式锁 1.pom.xml &l ...
- 打造基于Clang LibTooling的iOS自动打点系统CLAS(一)
1. 手动打点的弊端 在很多ios工程师的日常工作中,不但要对接产品提出的功能性需求,还会收到产品出于数据统计分析需求目的而提出的附带的隐形需求:统计打点.大多数公司的基础框架层都会对统计打点功能做高 ...
- 打造基于Clang LibTooling的iOS自动打点系统CLAS(二)
1. 配置LLVM和Clang 在这篇文章里,我们会基于上一篇所述的方案进行展开,详细讲解如何从0开始创建一个基于Clang LibTooling的编译器前端工具.在开始之前,我们假设你已经基本了解何 ...
- 打造基于Clang LibTooling的iOS自动打点系统CLAS(三)
1. 源码变换 第一章我们提到过,CLAS的本质是对源码做一次非常简单的变换(有些文章里称作变形),即Source-Source-Transformation,将打点代码精确地插入到目标函数的首部,保 ...
- 基于LBS平台的iOS开发
LBS,即Location Based Services,基于位置服务,用于定位.导航等功能,比如地图应用.订外卖等的app就需要这个功能. 在这里我使用的是高德LBS开放平台,地址:http://l ...
- 基于C++/Lua的游戏服务器如何实现?
1.首先要自己实现一个网络库,或者选择已经开源的网络库.比如:muduo.libevent.boost的asio等.2.实现核心功能:连接管理,消息管理,定时器,事件机制,Lua脚本引擎,程序模块管理 ...
- (转)基于企业级证书的IOS应用打包升级功能介绍
IOS应用程序升级流程介绍:IOS手机端应用程序需要升级时,打开服务器端html文件(本文为ucab.html文件)->点击在线安装->打开plist文件(本文中为ucab.plist文件 ...
- 【Mac + Python3.6 + ATX基于facebook-wda】之IOS自动化(三):facebook-wda库--API学习以及附录:Github上对WDA的问题解答
下面简单介绍facebook-wda库--API的学习 import wda # debug模式,会在run运行时控制台生成消息 wda.DEBUG = False # False 关闭,True开启 ...
随机推荐
- vertical-align各属性对比
测试用代码 <!DOCTYPE html> <html> <head> <style> #dd { //line-height: 300px; back ...
- js如何设置网页横屏和竖屏切换
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- GCD多线程 在子线程中获取网络图片 在主线程更新
子线程中得所有数据都可以直接拿到主线程中使用 //当触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示 -(void)touchesBegan:(NSSet *)touches withEv ...
- MyBatis学习笔记(3)—— 利用mybatis灌入假数据
由于第三方厂商未能按时提供实时数据,故需要纯手动导入一些实时数据,用于统计分析.正好最近自己学习了mybatis .因此使用mybatis 配置一个select.insert 的简单操作语句,用于灌入 ...
- Spring4.0学习笔记(9) —— Spring泛型依赖注入
1.定义基础仓库 package com.spring.generic.di; public class BaseRepository<T> { } 2.定义基础服务层 package c ...
- C#语言的新特性及相关信息
.ENT版本 NET 2.0 :CLR, WinForms ,Wed Services,ASP.NET NET 3.0 :WCF,WF,WPF,CardSpace NET 3.5 :LINQ ,AJ ...
- sql server 利用首字母拼音排序和笔画排序的语句
--按笔画排序 select * from Student order by Sname COLLATE Chinese_PRC_Stroke_CS_AS_KS_WS --按字母拼音排序 select ...
- C#制作ActiveX控件及部署升级(摘自网络)
使用C#开发ActiveX控件 控件开发.制作CAB包.签名.部署 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序 ...
- 解决spring mvc 上传报错,Field [] isn't an enum value,Failed to convert value of type 'java.lang.String[]' to required type '
没有选择附件,但是点击上传按钮的时候会报错. 之前不选择文件,直接上传空文件是可以的,后来不知道改了什么就不行了. 错误信息: -- :: [http--] TRACE org.springframe ...
- Thinkphp 零散知识点(caa/js路径,引入第三方类,ajax返回,session/cookie)
一.关于JS和CSS路径问题 1.找路径是从入口文件index.php来找的,而不是从文件本身所在位置来找, 因为我们访问时是访问的入口文件 2.在存放JS和CSS的时候可以放到public文件夹下 ...