利用JavaScriptCore實(shí)現(xiàn)OC和JS交互

JavaScriptCore

JavaScriptCore是webkit的一個(gè)重要組成部分了袁,主要是對(duì)JS進(jìn)行解析和提供執(zhí)行環(huán)境。iOS7后蘋果在iPhone平臺(tái)推出,極大的方便了我們對(duì)js的操作。

首先創(chuàng)建webView,讀取本地的html文件
 NSURL* htmlURL = [[NSBundle mainBundle] URLForResource: @"demo" withExtension: @"html"];
[_webView loadRequest: [NSURLRequest requestWithURL: htmlURL]];

在demo中棵里,我們要實(shí)現(xiàn)4種情況

  • JS調(diào)用OC
  • JS調(diào)用OC并傳遞參數(shù)
  • OC調(diào)用JS
  • OC調(diào)用JS并傳遞參數(shù)

html文件中代碼如下

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript">
    function showAlert(){
        alert('OC call JS with no argument');
    }
    function showAlertWithString(string){
        alert(string);
    }
    function callOCWithArgument() {
        jsCallOCWithArgument('參數(shù)1 ','參數(shù)2 ','參數(shù)3');
    }
    </script>
</head>
<body>
    </br>
    </br>
    </br>
    </br>
    <form>
        <button type='button' onclick='callOC()'>jsCallOC</button>
        <button type='button' onclick='callOCWithArgument()'>jsCallOCWithArgument</button>
    </form>
</body>
</html>
JS調(diào)用OC

在webView的代理方法webViewDidFinishLoad中

-(void)webViewDidFinishLoad:(UIWebView *)webView
{
    
    _context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    __weak typeof(self) weakSelf = self;
    _context.exceptionHandler = ^(JSContext *context, JSValue *exception) {
        weakSelf.context.exception = exception;
    };
    
    //js調(diào)用OC
    _context[@"callOC"] = ^() {
        NSArray *args = [JSContext currentArguments];
        for (JSValue *jsVal in args) {
            NSLog(@"%@", jsVal.toString);
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"arguments" message:@"JS Call OC With No Argument" preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction * action = [UIAlertAction actionWithTitle:@"Done" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
                
            }];
            [alertView addAction:action];
            [weakSelf presentViewController:alertView animated:YES completion:nil];
        });
    };
    
    _context[@"jsCallOCWithArgument"] = ^() {
        NSArray *args = [JSContext currentArguments];
        NSMutableString * stirng = [NSMutableString string];
        for (JSValue * value in args) {
            [stirng appendString:value.toString];
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertController *alertView = [UIAlertController alertControllerWithTitle:@"arguments" message:stirng preferredStyle:UIAlertControllerStyleAlert];
            UIAlertAction * action = [UIAlertAction actionWithTitle:@"Done" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
            }];
            [alertView addAction:action];
            [weakSelf presentViewController:alertView animated:YES completion:nil];
        });
    };   
}

我們定義一個(gè)block,然后保存到context里面,其實(shí)就是轉(zhuǎn)換成了JS中命名為callOC的function衍慎。然后我們直接執(zhí)行這個(gè)function,調(diào)用的就是我們的block里面的內(nèi)容了皮钠。
傳過(guò)來(lái)的參數(shù)可以通過(guò)[JSContext currentArguments]這個(gè)array接受稳捆,里面是JSValue對(duì)象。

OC調(diào)用JS

初始化兩個(gè)Button麦轰,在點(diǎn)擊事件中實(shí)現(xiàn)如下方法

- (IBAction)callJS:(id)sender {
    [_context evaluateScript:@"showAlert()"];
}
- (IBAction)callJSWithArguments:(id)sender {
    
    [_context evaluateScript:@"showAlertWithString('OC call JS with arguments')"];
//    [_context[@"showAlertWithString"] callWithArguments:@[@"OC call JS with arguments"]];
}

即可實(shí)現(xiàn)OC調(diào)用JS乔夯。

demo已上傳到github,需要的可以看一下款侵。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末末荐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子新锈,更是在濱河造成了極大的恐慌甲脏,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件妹笆,死亡現(xiàn)場(chǎng)離奇詭異块请,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拳缠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門墩新,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人窟坐,你說(shuō)我怎么就攤上這事海渊。” “怎么了哲鸳?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵臣疑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我徙菠,道長(zhǎng)朝捆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任懒豹,我火速辦了婚禮芙盘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脸秽。我一直安慰自己儒老,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布记餐。 她就那樣靜靜地躺著驮樊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上囚衔,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天挖腰,我揣著相機(jī)與錄音,去河邊找鬼练湿。 笑死猴仑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肥哎。 我是一名探鬼主播辽俗,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼篡诽!你這毒婦竟也來(lái)了崖飘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤杈女,失蹤者是張志新(化名)和其女友劉穎朱浴,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體达椰,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赊琳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砰碴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片躏筏。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呈枉,靈堂內(nèi)的尸體忽然破棺而出趁尼,到底是詐尸還是另有隱情,我是刑警寧澤猖辫,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布酥泞,位于F島的核電站,受9級(jí)特大地震影響啃憎,放射性物質(zhì)發(fā)生泄漏芝囤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一辛萍、第九天 我趴在偏房一處隱蔽的房頂上張望悯姊。 院中可真熱鬧,春花似錦贩毕、人聲如沸悯许。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)先壕。三九已至瘩扼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垃僚,已是汗流浹背集绰。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谆棺,地道東北人栽燕。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像包券,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子炫贤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • 隨著H5技術(shù)的興起溅固,在iOS開發(fā)過(guò)程中,難免會(huì)遇到原生應(yīng)用需要和H5頁(yè)面交互的問(wèn)題兰珍。其中會(huì)涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,074評(píng)論 1 8
  • 前言 Web 頁(yè)面中的 JS 與 iOS Native 如何交互是每個(gè) iOS 猿必須掌握的技能侍郭。而說(shuō)到 Nati...
    幽城88閱讀 2,205評(píng)論 1 8
  • 前言### 最近公司項(xiàng)目進(jìn)行比較激烈,沒(méi)有時(shí)間寫demo掠河,但是時(shí)間就像是海綿里的水亮元,擠擠總是會(huì)有的。在公司的項(xiàng)目中...
    摸著石頭過(guò)河_崖邊樹閱讀 2,288評(píng)論 2 14
  • 寫在前面 本篇文章是對(duì)我一次組內(nèi)分享的整理唠摹,大部分圖片都是直接從keynote上截圖下來(lái)的爆捞,本來(lái)有很多炫酷動(dòng)效的,...
    等開會(huì)閱讀 14,451評(píng)論 6 69
  • 本文由我們團(tuán)隊(duì)的 糾結(jié)倫 童鞋撰寫勾拉。 寫在前面 本篇文章是對(duì)我一次組內(nèi)分享的整理煮甥,大部分圖片都是直接從keynot...
    知識(shí)小集閱讀 15,245評(píng)論 11 172