使用LuaScriptCore來讓Lua與iOS進行交互

可能有一些人對lua并不是太熟悉,它其實跟JavaScript、Ruby、Python等同為腳本語言。但是更加輕量,更加簡潔,沒有任何多余的功能。這也使得它可以根據(jù)自己的需要來進行定制。例如作為應(yīng)用的配置文件,又或者是游戲的腳本引擎等等。

由于它的輕量,因此它要寫更多的代碼來實現(xiàn)自己所需的功能,有時候還需要使用Lua提供的C Api來進行功能擴展,對于移動設(shè)備來說更是如此,例如:訪問定位、照相機等等。

而且Lua的C Api相對來說不容易理解和掌握,需要投入一定的時間去學(xué)習(xí)和累積這方面的經(jīng)驗。而LuaScriptCore就是為了解決這些問題而誕生,他簡化了擴展Lua的難度,讓開發(fā)者可以通過自己熟悉的語言來擴展Lua,完美解決Lua與原生代碼之間的通訊問題。

目前的LuaScriptCore版本為1.2.1,它支持iOS、Android、OSX平臺,最新版本中還加入了對Unity3D的支持。日后可能會加入更多的平臺的支持,讓其在各個平臺下都能夠更加方便地擴展和操作Lua。下面我來舉一個例子,就是Lua作為iOS應(yīng)用的配置文件,讓視圖可以根據(jù)配置文件指定的顏色,來變更視圖的背景顏色:

  • 首先我們先到Github上下載LuaScriptCore。

  • 根據(jù)LuaScriptCore上的iOS集成文檔將其集成到項目中。

  • 然后在ViewController導(dǎo)入頭文件"LuaScriptCore.h",并在viewDidLoad方法中對LuaScriptCore進行初始化,如下面所示:

#import "ViewController.h"
#import "LuaScriptCore.h"

@interface ViewController ()

@property (nonatomic, strong) LSCContext *context;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.context = [[LSCContext alloc] init];
}

@end
  • 添加一個叫做config.lua的配置文件,并在上面添加一個叫backgroundColor的變量,并初始化為紅色,如:
添加lua配置文件
  • 然后在viewDidLoad方法中使用LSCContext來執(zhí)行該腳本,如:
[self.context evalScriptFromFile:@"config.lua"];
  • 再通過LSContext獲取lua里面的背景顏色變量backgroundColor并更改ViewController的view的背景顏色,如:
LSCValue *value = [self.context evalScriptFromString:@"return backgroundColor"];
if (value.valueType == LSCValueTypeNumber)
{
        NSInteger color = [value toInteger];
        self.view.backgroundColor = [UIColor colorWithRed:(color >> 16 & 0xff) / 255.0
                                                    green:(color >> 8 & 0xff)  / 255.0
                                                     blue:(color & 0xff) / 255.0
                                                    alpha:1.0];
}

然后編譯運行應(yīng)用,則可以看到視圖背景色變成了紅色,如下圖所示:

運行效果圖

這樣,一個簡單的lua交互例子就完成了。如果你需要動態(tài)修改配置文件,可以通過自己的數(shù)據(jù)器下發(fā)Lua配置文件到App,然后再讀取新的配置文件里面的值就可以實現(xiàn)動態(tài)更新了(如果是整個App的風(fēng)格配置處理過程也基本一樣_)。

接下來我們來看一下LuaScriptCore的一個比較強大的用法,那就是直接將OC中定義的類映射到Lua中進行使用。還是拿上面的例子來進行改造,我們新建一個叫Config的類型,該類型繼承LSCObjectClass類(注:必須繼承該類型)。代碼如下:

//----------------- Config.h ----------------------
#import "LSCObjectClass.h"
#import <UIKit/UIKit.h>

/**
 配置類
 */
@interface Config : LSCObjectClass

/**
 背景顏色
 */
@property (nonatomic) NSInteger backgroundColor;

/**
 初始化

 @param view 視圖對象
 @return 配置對象
 */
- (instancetype)initWithView:(UIView *)view;

@end

//----------------- Config.m ----------------------

@interface Config ()

/**
 視圖對象,不導(dǎo)出到lua的屬性要加下劃線
 */
@property (nonatomic, strong) UIView *_view;

@end

@implementation Config

- (instancetype)initWithView:(UIView *)view
{
    if (self = [super init])
    {
        self._view = view;
    }
    return self;
}

- (void)setBackgroundColor:(NSInteger)backgroundColor
{
    _backgroundColor = backgroundColor;
    self._view.backgroundColor = [UIColor colorWithRed:(_backgroundColor >> 16 & 0xff) / 255.0
                                                 green:(_backgroundColor >> 8 & 0xff)  / 255.0
                                                  blue:(_backgroundColor & 0xff) / 255.0
                                                 alpha:1.0];
}

@end

然后修改config.lua文件,增加一個初始化配置的方法,如所示:

function initWithConfig( config )
    
    config:setBackgroundColor(0xffff00);

end

上面的Lua代碼中的initWithConfig帶有一個config參數(shù),該參數(shù)就是OC中定義的Config類型,在方法中會對config的背景顏色進行更改。

那么,viewDidLoad中同樣要進行相應(yīng)的代碼修改,如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.context = [[LSCContext alloc] init];
    [self.context registerModuleWithClass:[Config class]];
    
    self.config = [[Config alloc] initWithView:self.view];
    [self.context evalScriptFromFile:@"config.lua"];
    
    [self.context callMethodWithName:@"initWithConfig" arguments:@[self.config]];
}

可以看到,LSCContext初始化后,又調(diào)用了registerModuleWithClass方法,該方法是告訴Lua要注冊一個Config的類型,這樣才能夠讓Lua識別OC中定義的類(關(guān)于更多關(guān)于類型定義的內(nèi)容可以參考LuaScriptCore的文檔)。

然后要先調(diào)用evalScriptFormFile來執(zhí)行config.lua腳本(這步很重要,必須要先執(zhí)行l(wèi)ua文件,否則定義的方法是不生效的),再通過callMethodWithName方法來調(diào)用其initWithConfig的方法,并將config對象傳給Lua進行操作。

然后編譯運行就可以看到視圖變成黃色了,如圖所示:

運行效果圖

可以看到LuaScriptCore可以很方便地將Lua與原生代碼結(jié)合起來使用,節(jié)省了學(xué)習(xí)Lua的C Api所需要的時間,讓App可以做得更加動態(tài)化(Lua腳本的更新可以使應(yīng)用動態(tài)地更新)。上面的兩個例子只是拋磚引玉,相信聰明你們利用LuaScriptCore創(chuàng)造到更多有趣好玩的東西。

最后,我想說的是LuaScriptCore是我寫的_,該項目完全開源,有興趣或者有疑問的同學(xué)可以給我發(fā)郵件,謝謝支持~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 1. 寫在前面 很多時候我們都需要借助一些腳本語言來為我們實現(xiàn)一些動態(tài)的配置,那么就會涉及到如何讓腳本語言跟原生語...
    杰嗒嗒的阿杰閱讀 3,508評論 9 31
  • 在互聯(lián)網(wǎng)公司,Nginx可以說是標(biāo)配組件,但是主要場景還是負載均衡、反向代理、代理緩存、限流等場景;而把Nginx...
    pure_adoration閱讀 4,211評論 4 77
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 7,388評論 0 17
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,288評論 6 342

友情鏈接更多精彩內(nèi)容