本文主要講如何完成lua和object-c的相互調用。 lua是一種腳本語言,可以方便的移植到各種宿主語言中,並且可以支持熱更新,在游戲開發中也能當做主要的語言來編寫游戲的邏輯,但是要接入第三方(例如支付寶等)時需要在不同的平台上(比如Android和ios)分別接入,這是就需要oc和lua完成通信
首先cocos2d 對oc和lua調用進行了封裝,這就更有利於我們調用
cocos/cocos2d/luaoc
函數原型:
- -- 調用Objective-C類的接口。
- -- @function [parent=#luaoc] callStaticMethod
- -- @param string className Objective-C類名
- -- @param string methodName Objective-C類方法名
- -- @param table args Objective-C類方法所需要的各種參數字典,key值為方法的參數名
- -- @return boolean#boolean ret (return value: bool) ok, mixed ret ok為是否調用成功, ok為true時,ret為Objective-C方法的返回值,ok為false時,ret為出錯原因
- function luaoc.callStaticMethod(className, methodName, args)
- end
———————————————————————開始—————————————————————————————————
lua調用oc
.lua代碼:
m.applePay = function (userid, price)
local luaoc = require("cocos.cocos2d.luaoc")
local className = “ApplePayMoney” —要調用的oc中的類名
local methodName = “payMoney” —要調用的oc中的類中的指定方法名 要注意的是:OC里被調用方法必須是類方法,也就是前面是“+”號的方法!
local args = {callBack = m.ocCallBack,userid = “1234",price = “500"} —要傳遞給OC的參數(以表的形式傳輸,OC層以字典的形式接收) 注意callBack參數
local ok = luaoc.callStaticMethod(className, methodName, args) —調用的返回值
end
--oc的回調方法
m.ocCallBack = function(str)
-- body
print(“oc回調lua成功”..str); —str即oc回傳給lua的參數
end
end
object-C代碼
1.創建一個類ApplePayMoney(lua中已經指定)繼承自NSObject 將.m文件的后綴名改為.mm ( 可以實現oc與c的混編 )
2.在.mm文件中引入頭文件:
#import "CCLuaBridge.h"
#import "CCLuaEngine.h"
報錯:Undefined symbols for architecture x86_64: "CreateRSADataSigner(NSString*)時 因為在在該文件中調用了調用了DataSigner.m里面的一個方法
解決:把DataSigner.m也改成DataSigner.mm后綴
3.在ApplePayMoney創建一個類方法(+方法)
//蘋果內支付(供lua端調用)
+ (void)payMoney:(NSDictionary *)dict{
NSLog(@"lua call ocFounction succeed");
NSString *userid = [dict valueForKey:@"userid"];
NSString *userid = [dict valueForKey:@"userid"];
NSString *price = [dict valueForKey:@"price"];
//這里獲取lua層的數據后 對數據進行操作(例如調用支付寶接口等) 將返回的數據再通過下面的方法回傳給lua層
int handlerID = (int)[[dict objectForKey:@"callBack"] integerValue]; // lua傳輸過來的回調lua的方法名 取inergerValue 這里可以將該id緩存在oc層的一個全局變量中 在合適的位置再回調lua層
LuaBridge::pushLuaFunctionById(handlerID); //壓入需要調用的方法id
LuaStack *stack = LuaBridge::getStack(); //獲取lua棧
stack->pushString(“oc傳遞給lua的參數"); //將需要傳遞給lua層的參數通過棧傳遞
stack->executeFunction(1); //共有1個參數 (“oc傳遞給lua的參數”),這里傳參數 1
LuaBridge::releaseLuaFunctionById([ApplePayMoney sharedApplePayMoney].handleID); //最后記得釋放
}
———————————————————————結束—————————————————————————————————
就是這么簡單