利用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)容了。
傳過來的參數(shù)可以通過[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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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

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