js與OC互相調(diào)用 —— JavaScriptCore使用

在本系列交互文章中,第一篇的第二種方法已經(jīng)簡單介紹過使用的方式了巢掺,這里再單獨(dú)拎出來補(bǔ)充以下細(xì)節(jié)句伶。
(以下步驟劲蜻,因?yàn)槭前阎暗奈恼卵a(bǔ)充以下,所以步驟大致相同考余,了解可跳過先嬉。)
1.html文件及編譯環(huán)境配置


html文件.png

JavaScriptCore庫的導(dǎo)入


導(dǎo)入框架.png
導(dǎo)入頭文件.png

2.加載UIWebView
self.webView = [[UIWebView alloc] initWithFrame:self.view.frame];
    self.webView.delegate = self;
    NSURL *htmlURL = [[NSBundle mainBundle] URLForResource:@"index.html" withExtension:nil];
//    NSURL *htmlURL = [NSURL URLWithString:@"http://www.baidu.com"];
    NSURLRequest *request = [NSURLRequest requestWithURL:htmlURL];

在UIWebViewDelegate方法中,頁面結(jié)束加載后開始進(jìn)行交互操作

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    [self addCustomActions]; // UIWebview加載結(jié)束后開始進(jìn)行交互
}

3.交互操作
JSContext是為JavaScript的執(zhí)行提供運(yùn)行環(huán)境楚堤,所有的JavaScript的執(zhí)行都必須在JSContext環(huán)境中疫蔓。JSContext也管理JSVirtualMachine中對象的生命周期。每一個(gè)JSValue對象都要強(qiáng)引用關(guān)聯(lián)一個(gè)JSContext身冬。當(dāng)與某JSContext對象關(guān)聯(lián)的所有JSValue釋放后衅胀,JSContext也會被釋放。

獲取JSContext有多種方式酥筝,這里先使用這一種滚躯。

- (void)addCustomActions
{
    // 拿到context
    JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    
//    [context evaluateScript:@"var arr = [3, 4, 'abc'];"];

    [self addScanWithContext:context];
    
    [self addLocationWithContext:context];
    
    [self addSetBGColorWithContext:context];
    
    [self addShareWithContext:context];
    
    [self addPayActionWithContext:context];
    
    [self addShakeActionWithContext:context];
    
    [self addGoBackWithContext:context];
}

OC調(diào)用JS方法有多種。
方式一
使用JSContext的方法-evaluateScript嘿歌,可以實(shí)現(xiàn)OC調(diào)用JS方法掸掏。

- (void)addShareWithContext:(JSContext *)context
{
    context[@"share"] = ^() {
        NSArray *args = [JSContext currentArguments]; // 獲取參數(shù)列表
        
        if (args.count < 3) {
            return ;
        }
        NSString *title = [args[0] toString];
        NSString *content = [args[1] toString];
        NSString *url = [args[2] toString];
        // 在這里執(zhí)行分享的操作
        
        // 將分享結(jié)果返回給js
        NSString *jsStr = [NSString stringWithFormat:@"shareResult('%@','%@','%@')",title,content,url];
//        使用[JSContext currentContext]而不是self.context來在block中使用JSContext,來防止循環(huán)引用搅幅。
        
        [[JSContext currentContext] evaluateScript:jsStr];
    };
}

方式二
使用JSValue的方法-callWithArguments阅束,也可以實(shí)現(xiàn)OC調(diào)用JS方法。
示例

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

[context[@"payResult"] callWithArguments:@[@"支付彈窗"]];

方法中實(shí)際使用茄唐,在執(zhí)行原生OC方法之后息裸,想要在OC執(zhí)行完操作后,將結(jié)果回調(diào)給JS時(shí)沪编。

- (void)addPayActionWithContext:(JSContext *)context
{
    context[@"payAction"] = ^() {
        NSArray *args = [JSContext currentArguments];
        
        if (args.count < 4) {
            return ;
        }
        
        NSString *orderNo = [args[0] toString];
        NSString *channel = [args[1] toString];
        long long amount = [[args[2] toNumber] longLongValue];
        NSString *subject = [args[3] toString];
        
        // 支付操作
        NSLog(@"orderNo:%@---channel:%@---amount:%lld---subject:%@",orderNo,channel,amount,subject);
        
        // 將支付結(jié)果返回給js
//        NSString *jsStr = [NSString stringWithFormat:@"payResult('%@')",@"支付成功"];
//        [[JSContext currentContext] evaluateScript:jsStr];
        [[JSContext currentContext][@"payResult"] callWithArguments:@[@"支付成功"]];
    };
}

關(guān)于JavaScriptCore的使用方法呼盆,簡單介紹到這里。關(guān)于JavaScriptCore庫的詳細(xì)介紹蚁廓,之后再整理访圃。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市相嵌,隨后出現(xiàn)的幾起案子腿时,更是在濱河造成了極大的恐慌,老刑警劉巖饭宾,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件批糟,死亡現(xiàn)場離奇詭異,居然都是意外死亡看铆,警方通過查閱死者的電腦和手機(jī)徽鼎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人否淤,你說我怎么就攤上這事悄但。” “怎么了石抡?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵檐嚣,是天一觀的道長。 經(jīng)常有香客問我汁雷,道長净嘀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任侠讯,我火速辦了婚禮挖藏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厢漩。我一直安慰自己膜眠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布溜嗜。 她就那樣靜靜地躺著宵膨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炸宵。 梳的紋絲不亂的頭發(fā)上辟躏,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音土全,去河邊找鬼捎琐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛裹匙,可吹牛的內(nèi)容都是我干的瑞凑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼概页,長吁一口氣:“原來是場噩夢啊……” “哼籽御!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惰匙,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤技掏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后项鬼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體零截,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年秃臣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奥此,死狀恐怖弧哎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情稚虎,我是刑警寧澤撤嫩,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站蠢终,受9級特大地震影響序攘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜寻拂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一程奠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧祭钉,春花似錦瞄沙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至垮卓,卻和暖如春垫桂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粟按。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工诬滩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人钾怔。 一個(gè)月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓碱呼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宗侦。 傳聞我的和親對象是個(gè)殘疾皇子愚臀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

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

  • 本文由我們團(tuán)隊(duì)的 糾結(jié)倫 童鞋撰寫。 寫在前面 本篇文章是對我一次組內(nèi)分享的整理矾利,大部分圖片都是直接從keynot...
    知識小集閱讀 15,242評論 11 172
  • 隨著H5技術(shù)的興起姑裂,在iOS開發(fā)過程中,難免會遇到原生應(yīng)用需要和H5頁面交互的問題男旗。其中會涉及方法調(diào)用及參數(shù)傳值等...
    Chris_js閱讀 3,068評論 1 8
  • 注:本文copy自http://www.reibang.com/p/ac534f508fb0舶斧,純屬當(dāng)筆記使用。 概...
    BookKeeping閱讀 731評論 1 3
  • 寫在前面 本篇文章是對我一次組內(nèi)分享的整理察皇,大部分圖片都是直接從keynote上截圖下來的茴厉,本來有很多炫酷動(dòng)效的泽台,...
    等開會閱讀 14,442評論 6 69
  • 周一晚上有幸參加了獨(dú)立旅行愛好者Sothie的獨(dú)家旅途直播分享怀酷,確實(shí)是受益匪淺! 我們都說想要一場說走就走的旅行嗜闻,...
    秀秀秀Love閱讀 307評論 0 2