JavaScriptCore的基本用法(一)

剛來(lái)新公司的第一天就要加班凯旭,一臉的苦逼坯墨。還好這是被安排研究一下OC和js的交互,對(duì)于這個(gè)apple新推出的庫(kù)還沒(méi)接觸過(guò)权逗,所以就在這里做一個(gè)簡(jiǎn)單的記錄美尸。

JavaScriptCore簡(jiǎn)介

iOS 7中加入了JavaScriptCore框架。該框架讓Objective-C和JavaScript代碼直接的交互變得更加的簡(jiǎn)單方便斟薇。而且使得js可以脫離webview與oc交互师坎。
在項(xiàng)目中引入JavaScriptCore后,鏈到頭文件中堪滨,除了大段的Copyright注釋可以看到里面只要引入了5個(gè)文件胯陋,每個(gè)文件里都定義跟文件名對(duì)應(yīng)的類(lèi):


Paste_Image.png
JSContext和JSValue

<a style = "color:red; font: bold;">JSContext</a>

//JSVirtualMachine為JavaScript的運(yùn)行提供了底層資源,JSContext就為其提供著運(yùn)行環(huán)境,該方法用來(lái)執(zhí)行一段
//JS代碼椿猎,并且如果其中有方法惶岭、變量等信息都會(huì)被存儲(chǔ)在其中以便在需要的時(shí)候使用。
- (JSValue *)evaluateScript:(NSString *)script
//JSContext的創(chuàng)建都是基于JSVirtualMachine,如果是使用- (id)init;
//進(jìn)行初始化犯眠,那么在其內(nèi)部會(huì)自動(dòng)創(chuàng)建一個(gè)新的JSVirtualMachine
//對(duì)象然后調(diào)用前邊的初始化方法
- (id)initWithVirtualMachine:(JSVirtualMachine *)virtualMachine;

<a style = "color:red; font: bold;">JSValue</a>
則可以說(shuō)是JavaScript和Object-C之間互換的橋梁按灶,它提供了多種方法可以方便地把JavaScript數(shù)據(jù)類(lèi)型轉(zhuǎn)換成Objective-C,或者是轉(zhuǎn)換過(guò)去筐咧。其一一對(duì)應(yīng)方式可見(jiàn)下表:


4ABEE7D7-1DCB-4A21-A708-4CEA36782D6C.png

基本類(lèi)型的轉(zhuǎn)換

JSContext *context = [[JSContext alloc] init];
JSValue *jsVal = [context evaluateScript:@"2+7"];
int iVal = [jsVal toInt32];
NSLog(@"JSValue: %@, int: %d", jsVal, iVal);
//輸出9

還可以存一個(gè)Js變量在JSContext中鸯旁,然后通過(guò)下標(biāo)取出來(lái)。對(duì)于數(shù)組或者對(duì)象類(lèi)型量蕊,JSValue也可以通過(guò)下表直接取值和賦值.

[context evaluateScript:@"var arr = [21, 7 ,'leo']"];
JSValue *value = context[@"arr"];
value[1] = @"blog";
value[7] = @7;
NSArray *array = [value toArray];
打印數(shù)組看一下
Printing description of array:
<__NSArrayM 0x7fabc144ea40>(
21,
blog,
leo,
<null>,
<null>,
<null>,
<null>,
7

代碼成功把數(shù)據(jù)從OC?賦值到了Js數(shù)組上铺罢,而且jsValue遵循js數(shù)組的特性,無(wú)下標(biāo)越位残炮,自動(dòng)延展數(shù)組大小

方法的轉(zhuǎn)換(js調(diào)用oc的第一種方法)

各種數(shù)據(jù)類(lèi)型可以轉(zhuǎn)換韭赘,Objective-C的Block也可以傳入JSContext中當(dāng)做JavaScript的方法使用。

  context[@"add"] = ^(NSInteger a, NSInteger b){
       //獲取該方法的對(duì)象
        JSValue *v = [JSContext currentThis];
        //獲取當(dāng)前的參數(shù)
        NSArray *args = [JSContext currentArguments];
        NSLog(@"當(dāng)前對(duì)象:%@",v);
        NSLog(@"當(dāng)前參數(shù):%@",args);
        NSLog(@"和是%ld",a + b);
    };
    [context evaluateScript:@"add(1,2)"];
    
    輸出如下:
    當(dāng)前對(duì)象:GlobalObject
    當(dāng)前參數(shù):(
    1,
    2)
    和是3

上邊的例子中對(duì)于"this"輸出的內(nèi)容是GlobalObject势就,這也是JSContext對(duì)象方法- (JSValue *)globalObject;所返回的內(nèi)容泉瞻。因?yàn)槲覀冎涝贘avaScript里脉漏,所有全局變量和方法其實(shí)都是一個(gè)全局變量的屬性,在瀏覽器中是window袖牙,在JavaScriptCore是什么就不得而知了侧巨。

Block可以傳入JSContext作方法,但是JSValue沒(méi)有toBlock方法來(lái)把JavaScript方法變成Block在Objetive-C中使用鞭达。畢竟Block的參數(shù)個(gè)數(shù)和類(lèi)型已經(jīng)返回類(lèi)型都是固定的司忱。雖然不能把方法提取出來(lái),但是JSValue提供了- (JSValue *)callWithArguments:(NSArray *)arguments;方法可以反過(guò)來(lái)將參數(shù)傳進(jìn)去來(lái)調(diào)用方法畴蹭。

JSContext *context = [[JSContext alloc]init];
    NSString *js = @"function add(a,b){return a+ b;}";
    [context evaluateScript:js];
    JSValue *value = [context[@"add"] callWithArguments:@[@3,@4]];
    NSLog(@"%@",value);
    
    輸出如下:
    7
    

JSValue還提供

- (JSValue *)invokeMethod:(NSString *)method withArguments:(NSArray *)arguments;

讓我們可以直接簡(jiǎn)單地調(diào)用對(duì)象上的方法坦仍。只是如果定義的方法是全局函數(shù),那么很顯然應(yīng)該在JSContext的globalObject對(duì)象上調(diào)用該方法撮胧;如果是某JavaScript對(duì)象上的方法桨踪,就應(yīng)該用相應(yīng)的JSValue對(duì)象調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末芹啥,一起剝皮案震驚了整個(gè)濱河市锻离,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌墓怀,老刑警劉巖汽纠,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異傀履,居然都是意外死亡虱朵,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)钓账,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)碴犬,“玉大人,你說(shuō)我怎么就攤上這事梆暮》” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵啦粹,是天一觀(guān)的道長(zhǎng)偿荷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)唠椭,這世上最難降的妖魔是什么跳纳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮贪嫂,結(jié)果婚禮上寺庄,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好铣揉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布饶深。 她就那樣靜靜地躺著餐曹,像睡著了一般逛拱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上台猴,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天朽合,我揣著相機(jī)與錄音,去河邊找鬼饱狂。 笑死曹步,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的休讳。 我是一名探鬼主播讲婚,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼俊柔!你這毒婦竟也來(lái)了筹麸?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雏婶,失蹤者是張志新(化名)和其女友劉穎物赶,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體留晚,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酵紫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了错维。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奖地。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赋焕,靈堂內(nèi)的尸體忽然破棺而出参歹,到底是詐尸還是另有隱情,我是刑警寧澤宏邮,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布泽示,位于F島的核電站,受9級(jí)特大地震影響蜜氨,放射性物質(zhì)發(fā)生泄漏械筛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一飒炎、第九天 我趴在偏房一處隱蔽的房頂上張望埋哟。 院中可真熱鬧,春花似錦、人聲如沸赤赊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抛计。三九已至哄孤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吹截,已是汗流浹背瘦陈。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留波俄,地道東北人晨逝。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像懦铺,于是被迫代替她去往敵國(guó)和親捉貌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 項(xiàng)目中涉及OC與網(wǎng)頁(yè)的交互冬念,查找資料時(shí)看到了JavaScriptCore.framework趁窃,就對(duì)照文章ios7 ...
    YaoYaoX閱讀 2,353評(píng)論 7 11
  • 本文由我們團(tuán)隊(duì)的 糾結(jié)倫 童鞋撰寫(xiě)。 寫(xiě)在前面 本篇文章是對(duì)我一次組內(nèi)分享的整理刘急,大部分圖片都是直接從keynot...
    知識(shí)小集閱讀 15,255評(píng)論 11 172
  • 注:本文copy自http://www.reibang.com/p/ac534f508fb0棚菊,純屬當(dāng)筆記使用。 概...
    BookKeeping閱讀 732評(píng)論 1 3
  • 寫(xiě)在前面 本篇文章是對(duì)我一次組內(nèi)分享的整理叔汁,大部分圖片都是直接從keynote上截圖下來(lái)的统求,本來(lái)有很多炫酷動(dòng)效的,...
    等開(kāi)會(huì)閱讀 14,469評(píng)論 6 69
  • OC與JS交互之JavaScriptCore 本文摘抄自:https://hjgitbook.gitbooks.i...
    大沖哥閱讀 1,023評(píng)論 0 1