wax lua 脚本升级练习(1)

当发现线上app某一功能出现bug,即使在技术上很快的做出了这一bug的补丁,但是因为AppStore上线审核漫长,这将在一段时间里,用户用的都是这个款带有已知bug的产品。

这种情况的一个解决办法就是通过Lua给app打补丁,因为Lua是脚本语言,将脚本放在服务器上,在程序启动的某个时机动态的从服务器上下载Lua代码,并在本地执行,就实现了动态替换app代码,从而快速的给app打补丁。

现在就做一个小练习,模拟一下。

(1)功能就是点击“4 x 3 =”按钮,将4和3传到lua,然后在lua里面计算4和3的乘积,返回给objc,显示在旁边的TextField里。当然,在这里lua返回的得是一个错误得值,比如两数之和 “7”。

(2)然后点击“下载新脚本”,将命令传到lua,然后lua再到指定到服务器去下载新脚本,然后覆盖旧脚本,热加载新脚本,再次点击“4 x 3 =”按钮,将显示正确到值“12”。

这里先实现第一步,通过lua脚本计算乘积。

创建一个工程waxDemo,做一个如图到界面,将wax添加到工程里(可以参考xcode5中
wax 安装记录
)。

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *text;

- (IBAction)click:(id)sender;//4 x 3 =
- (IBAction)downlodNewLua:(id)sender;
@end
- (IBAction)click:(id)sender {
    //,@"delegate":self
    NSDictionary * dic= [[luaMain shareInstance] ExecLua:@{@"cmd":LUA_EVENT_CLICK, @"param":@{@"Multiplicand":@4,@"Multiplier":@3}}];
    NSString *str = dic[@"param"][@"value"];
    self.text.text = str;
}

上面到函数就是将‘4’和‘3’传到lua,ExecLua 接收到参数是一个NSDictionary类型,也可以是其他任意类型,因为luaMain类是自己写得一个封装,ExecLua函数可以随意更改。

返回的也是一个NSDictionary,dic对象里的key是oc和lua约定的规则。我自己定义的,也是可以随意修改的。下面就是luaMain类

luaMain.h

#import <Foundation/Foundation.h>
#import "wax.h"

//约定好的命令
#define LUA_EVENT_CLICK         @"10000"
#define LUA_EVENT_DOWNLOAD_NEN_SCRIPT         @"10001"

@interface luaMain : NSObject

@property(nonatomic) lua_State* curState;

+ (luaMain*) shareInstance;

- (NSDictionary*) ExecLua:(NSDictionary*)param;

@end

luaMain.m

#import "luaMain.h"
#import "lualib.h"
#import "../wax/lib/extensions/HTTP/wax_http.h"
#import "../wax/lib/extensions/json/wax_json.h"
#import "JSONKit.h"
static luaMain* instance = nil;
@implementation luaMain

+(luaMain*)shareInstance {

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        instance = [[self alloc] init];

    });
    return instance;

}

- (id)init
{
    self= [super init];
    if (self) {
        self.curState = wax_currentLuaState();
        wax_start("main.lua", luaopen_wax_http, luaopen_wax_json, nil);
    }
    return  self;
}

- (NSDictionary* )ExecLua:(NSDictionary *)param{
    if (param){

        NSString* strJSON = [param JSONString];//将NSDictionary转成JSON格式,使用第三方库JSONKIT
        lua_getglobal(_curState, "exeLuaCode");////lua里调用的函数exeLuaCode
        lua_pushstring(_curState, [strJSON UTF8String]);//将参数推送到lua

        if (0 != wax_pcall(_curState, 1, 1)){

            const char *msg = lua_tostring(_curState, -1);
            NSString* value = [NSString stringWithUTF8String:msg];
            NSLog(@"%@", value);

        }
        char * ch =lua_tostring(_curState,-1);//返回的是lua返回的字符串
        if (ch) {

            NSString * c = [NSString stringWithUTF8String: ch];
            lua_pop(_curState, 1);
            return [c objectFromJSONString];

        }
    }
    return nil;

}

main.lua

function printLog( log )
 	-- body
 	if 'table' == type(log) then
 		log = wax.json.generate(log);
 	end
   	print(log);
end 

function exeLuaCode( param )
	-- body
	print('exeLuaCode')

	if (not param) then
		return nil;
	end

	local dict_param = wax.json.parse(param);

	if dict_param then
		local cmd = dict_param['cmd'];
		if cmd == '10000' then
			return multiply(dict_param['param'])
		 elseif cmd == '10001' then
		-- 	updateScriptStatus()
		end
	end
end

function multiply( param)
	-- body
	printLog('multiply')
	if (not param) then
		return;
	end

	local delegate = param['delegate']
	local Multiplicand = param['Multiplicand']
	local Multiplier = param['Multiplier']
	printLog('Multiplicand = ' .. Multiplicand)
	printLog('Multiplier = ' .. Multiplier)
	local Product =  string.format("%d",Multiplicand*Multiplier)--这里将返回4*3的积
	printLog(Product)
	return wax.json.generate({param={value=Product}})

end

正常情况下将打印日志

exeLuaCode
multiply
Multiplicand = 4
Multiplier = 3
12

参考链接

Wax
Lua—使用lua编写原生ios程序的框架实现原理

用Lua给你的iOS程序打patch

用Lua给你的程序打patch(续)

Create-a-More-Flexible-App

wax lua 脚本升级练习(1),布布扣,bubuko.com

时间: 2024-12-05 19:45:06

wax lua 脚本升级练习(1)的相关文章

wax lua 脚本升级练习(2)

wax lua 脚本升级练习(1)介绍了object-c通过调用lua中的函数计算两值乘积并返回显示. 这一篇将介绍通过点击按钮下载新的lua脚本文件,并且热加载lua,使起能即时生效. 在写代码前需要做一点点准备. 1.启动本机的Apache服务,作为新lua脚本的存放位置 打开"终端(terminal)",输入sudo apachectl start(可能需要输入机器秘密),打开Safari浏览器地址栏输入 "127.0.0.1",可以看到内容为"It

第二十三篇:在SOUI中使用LUA脚本开发界面

像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑.当需求变化时,只需要在服务端把相关代码调整一下,用户即可看到新的内容(界面). 传统的客户端程序开发流程和网页开发可能完全不同. 首先是界面的布局,在老式的界面布局过程中,程序员先在界面上放好各种控件,然后需要自己通过相应的代码来维护界面在不同状态下控件的显示状态及位置.当界面中元素很多时,单纯布局

lua脚本之lua语言简介以及lua的安装

本博主不擅于进行文字创作,所以,相当一部分文字皆复制于其他博文.还希望能够得到谅解.  一.Lua语言简介 Lua是一个免费的开源软件,可以免费用于科研及商业.Lua具有一个专家团队在维护和升级,其设计旨在项目中扩展功能,因此其内核小而稳定.在游戏开发中,Lua在用户界面.游戏数据管理.实时游戏事件管理.游戏人工智能.创建功能原型等方面具有强大的支持.Lua不能直接访问数据库,但可以通过整合其他语言组件来访问数据库:对于一些耗时要求更高效率的工作,一般交给更加底层的语言去完成,Lua只是起到整合

Java中使用Lua脚本语言(转)

Lua是一个实用的脚本语言,相对于Python来说,比较小巧,但它功能并不逊色,特别是在游戏开发中非常实用(WoW采用的就是Lua作为脚本的).Lua在C\C++的实现我就不多说了,网上随便一搜,到处都是这方面的介绍,我想说的是如何在Java下使用Lua以提高编程效率.增强你的程序可扩展性. 首先,要在Java上使用Lua脚本,必须有关于Lua脚本解释器以及Java程序可以访问这些脚本的相关API,即相关类库.我使用的是一个叫做LuaJava的开源项目,可以在: http://www.keple

online_jf.lua --累计在线时间领取物品(积分)的lua脚本

原作者: ayase 8-27修正 修复首次使用后的红字不需要额外进数据库导入计分表,这lua全自动生成 --------------------------------------------------------------惯例写在前面: 写这玩意其实学习性更大于目的性..= =研究了两天晚上写的我人参中滴第一个lua脚本,居然还真给我写出来了,好感动由于写代码的基础基本是零 所以碰了N+N次壁 什么函数字母大小写还要区分  -- 闹哪样啊喂 因为这个原因我试了半个多钟才发现问题所在什么函

C程序与Lua脚本相互调用

Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows环境下Lua的下载以及安装注意事项:2.Visual C++6.0中Lua的配置:3.C程序与Lua脚本相互调用实例. 1.Windows环境下Lua的下载以及安装注意事项 a.下载Lua for Windows,笔者用的版本是V5.1.4-35: b.上微软官网,下载Visual C++运行库——vcred

redis限速器设计(不使用lua脚本及事物)

公司有一个需求,需要集群中的机器每分钟发送固定个数请求到局域网以外的一台服务器,固定个数,是指集群中的所有机器发送的所有的请求加起来是一个固定的个数,这就需要一个分布式的限速器. 首先想到的就是使用redis中的incr方法,在redis的官方文档中寻找到了一个示例 FUNCTION LIMIT_API_CALL(ip) ts = CURRENT_UNIX_TIME() keyname = ip+":"+ts current = GET(keyname) IF current != N

Cocos Code IDE里xcode工程lua脚本更新

lua脚本修改后xcode需要clean重新编译才能更新,这个是xcode里的老毛病了,网上有一些脚本但不是针对Cocos Code IDE的工程目录的,这里列出 cocos2dx版本3.1 首先在 Xcode 里选中工程,右侧会显示工程的设置界面. 从设置界面选择 Build Phases 标签,然后点击右下角的 Add Build Phases 按钮,并选择"Add Run Script". 在新出现的 Run Script 栏中输入以下内容: _TARGET_BUILD_CONT

.net core中加载lua脚本的类库: MoonSharp

前言 MoonSharp是一个支持C#调用lua脚本的类库,支持.net, .net core, mono, unity,因此在.net core中也能够使用,而且加载和调用lua也很方便简单: 官网:http://www.moonsharp.org/ 源码:https://github.com/xanathar/moonsharp nuget:PM> Install-Package MoonSharp 使用 加载脚本 1 string scriptCode = @" 2 sum = 0