iOS javascript與object-c的交互(TSY版本-就是本人)

一:前言

? ? ? 有于本人對(duì)html,web網(wǎng)頁制作比較感興趣,所以身為ios程序員的我不務(wù)正業(yè)的看起了js,css,html,jq等的相關(guān)信息欲低,發(fā)現(xiàn)了一片新大陸啊坚洽,可惜本人學(xué)業(yè)不精只能學(xué)到一點(diǎn)皮毛爷肝。

由于最近web相關(guān)的都比較火嫉嘀,所以也開始研究了下ios與js的相關(guān)的一些通信交互炼邀,但是研究的比較淺,寫寫微博剪侮,這樣自己就也能記得住拭宁。

我的簡易的demo: https://github.com/taosiyu/TSYJavaScriptCoreDemo 請(qǐng)大家點(diǎn)個(gè)星星啊

二:關(guān)于javaScriptCore

? ? ? iOS7以后蘋果加入了JavaScriptCore.framework的框架。把 WebKit 的 JavaScript 引擎用 Objective-C 封裝瓣俯。讓Objective-C和JavaScript代碼的交互變得簡單方便杰标。至于ios7之前的方法框架由于現(xiàn)在ios7之前的機(jī)器較少而且利用截取方式調(diào)用感覺不怎么高大上,所以直接忽略彩匕,如果硬要了解請(qǐng)查看樓底的分享鏈接在旱。

? ? ? JSContext和JSValue

? ? ? ?JSVirtualMachine為JavaScript的運(yùn)行提供了底層資源,JSContext就為其提供著運(yùn)行環(huán)境推掸,通過- (JSValue *)evaluateScript:(NSString *)script;方法就可以執(zhí)行一段JavaScript腳本,并且如果其中有方法驻仅、變量等信息都會(huì)被存儲(chǔ)在其中以便在需要的時(shí)候使用谅畅。而JSContext的創(chuàng)建都是基于JSVirtualMachine:- (id)initWithVirtualMachine:(JSVirtualMachine *)virtualMachine;,如果是使用- (id)init;進(jìn)行初始化噪服,那么在其內(nèi)部會(huì)自動(dòng)創(chuàng)建一個(gè)新的JSVirtualMachine對(duì)象然后調(diào)用前邊的初始化方法毡泻。

JSValue則可以說是JavaScript和Object-C之間互換的橋梁,它提供了多種方法可以方便地把JavaScript數(shù)據(jù)類型轉(zhuǎn)換成Objective-C粘优,或者是轉(zhuǎn)換過去仇味。

JSContext 可以通過[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];來獲取js環(huán)境

當(dāng)然在使用框架之前首先要導(dǎo)入頭文件

#import<JavaScriptCore/JavaScriptCore.h>

然后再載入html頁面

在頁面加載完成之后

- (void)webViewDidFinishLoad:(UIWebView *)webView{

//獲取js的環(huán)境阐污,在這里獲取是為了避免頁面沒有加載完成導(dǎo)致oc調(diào)不到 js的方法

self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

// 打印異常,由于JS的異常信息是不會(huì)在OC中被直接打印的,所以我們?cè)谶@里添加打印異常信息,

self.context.exceptionHandler =

^(JSContext *context, JSValue *exceptionValue)

? ? ?{

? ? ?context.exception = exceptionValue;

? ? ?NSLog(@"%@", exceptionValue);

? ? ?}



JS --------調(diào)用------>OC

- (void)webViewDidFinishLoad:(UIWebView *)webView

{

// 以 html title 設(shè)置 導(dǎo)航欄 title

self.title = [webView stringByEvaluatingJavaScriptFromString:@"document.title"];

// Undocumented access to UIWebView's JSContext

self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

// 打印異常

self.context.exceptionHandler =

^(JSContext *context, JSValue *exceptionValue)

{

context.exception = exceptionValue;

NSLog(@"%@", exceptionValue);

};

// 以 JSExport 協(xié)議關(guān)聯(lián) native 的方法

self.context[@"app"] = self;

// 以 block 形式關(guān)聯(lián) JavaScript function

self.context[@"log"] =

^(NSString *str)

{

NSLog(@"%@", str);

};

self.context[@"wowowowow"] =

^(NSString *str)

{

NSLog(@"============================>>>>>>>>>>>>>%@",str);

};

// 以 block 形式關(guān)聯(lián) JavaScript function

self.context[@"alert"] =

^(NSString *str)

{

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"msg from js" message:str delegate:nil cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];

[alert show];

};

__block typeof(self) weakSelf = self;

self.context[@"addSubView"] =

^(NSString *viewname)

{

UIView *view = [[UIView alloc]initWithFrame:CGRectMake(10, 500, weakSelf.view.frame.size.width, 100)];

view.backgroundColor = [UIColor redColor];

[weakSelf.view addSubview:view];

};

//多參數(shù)

self.context[@"mutiParams"] =

^(NSString *a,NSString *b,NSString *c)

{

NSLog(@"%@ %@ %@",a,b,c);

};

[self.context evaluateScript:@"var squareFunc = function(value) { return value * 2 }"];

JSValue *S = [self.context evaluateScript:@"squareFunc(10)"];

NSLog(@"tonumber = %@",S.toNumber);

}

主要是看看js調(diào)用oc的方法比以前用截取的方法方便很多年堆,也更符合mvc的思想,讓js和oc的關(guān)系更緊密.


其它的請(qǐng)自行查看代碼兢仰,說一堆廢話不如直接上代碼(其實(shí)是樓主懶)嬉愧。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贩挣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌王财,老刑警劉巖卵迂,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異绒净,居然都是意外死亡见咒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門挂疆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改览,“玉大人,你說我怎么就攤上這事囱嫩∈逊瑁” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵墨闲,是天一觀的道長今妄。 經(jīng)常有香客問我,道長鸳碧,這世上最難降的妖魔是什么盾鳞? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮瞻离,結(jié)果婚禮上腾仅,老公的妹妹穿的比我還像新娘。我一直安慰自己套利,他們只是感情好推励,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著肉迫,像睡著了一般验辞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上喊衫,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天跌造,我揣著相機(jī)與錄音,去河邊找鬼族购。 笑死壳贪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的寝杖。 我是一名探鬼主播违施,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼朝墩!你這毒婦竟也來了醉拓?” 一聲冷哼從身側(cè)響起伟姐,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亿卤,沒想到半個(gè)月后愤兵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡排吴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年秆乳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钻哩。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屹堰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出街氢,到底是詐尸還是另有隱情扯键,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布珊肃,位于F島的核電站荣刑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏伦乔。R本人自食惡果不足惜厉亏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烈和。 院中可真熱鬧爱只,春花似錦、人聲如沸招刹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疯暑。三九已至忘渔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缰儿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工散址, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乖阵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓预麸,卻偏偏與公主長得像瞪浸,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吏祸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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