JSContext

JSContext是JavaScriptCore框架中的東西狈癞。JavaScriptCore是iOS7中新加入的框架茄靠,用來處理JavaScript。JavaScriptCore 是蘋果 Safari 瀏覽器的 JavaScript 引擎蝶桶,JavaScriptCore在 OS X 平臺上很早就存在的慨绳,而在 iOS 平臺,直到IOS7才對外開放真竖,并提供了 Objective-C 的接口脐雪。該框架讓Objective-C和JavaScript代碼直接的交互變得更加的簡單方便。
簡單的一句話:蘋果官方提供的JSContext可以實現(xiàn)Objective-C和JavaScript代碼的交互恢共。

1战秋、早期我們用什么來與js交互

早期我們使用UIWebViewDelegate來攔截URL從而實現(xiàn)交互。

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 

當我們點擊webView上的某個按鈕的時候讨韭,會跳轉(zhuǎn)上述代理脂信,然后使用

NSString *requestString = [[request URL] absoluteString];

來得出點擊按鈕的URL事件,根據(jù)地址的不同來實現(xiàn)原生的頁面跳轉(zhuǎn)或者其他功能透硝。

2狰闪、JSContext該如何使用

JSContext:Aninstance of JSContext represents a JavaScript execution environment.(一個 Context 就是一個 JavaScript 代碼執(zhí)行的環(huán)境,也叫作用域濒生。)

JSValue:Conversionbetween Objective-C and JavaScript types.(JS是弱類型的埋泵,ObjectiveC是強類型的,JSValue被引入處理這種類型差異甜攀,在Objective-C 對象和 JavaScript 對象之間起轉(zhuǎn)換作用)

直接貼一段代碼

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

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

    context[@"comeHere"] = ^() {
        NSArray *args = [JSContext currentArguments];
        for (JSValue *jsVal in args) {

            NSString *str= [NSString stringWithFormat:@"%@",jsVal];
            if ([str isEqualToString:@"youShouldA" ] ) {
                 [self A];
            }else if ([str isEqualToString:@"youShouldB"]) {
                 [self B];
            }   

        }
    };
}

代碼中@“comeHere”是你需要告訴js端的方法秋泄,這個方法就是讓js來調(diào)用你block中的內(nèi)容。

@“youShouldA”
@"youShouldB"

這兩個是js端需要告訴你的方法规阀。

一旦此處代碼執(zhí)行完畢后恒序,就好像是一直放了個context這個東西在這里,一旦你點擊webView上A按鈕谁撼,js就跑到你告訴他的方法里芦倒,即:comHere,然后代碼就會執(zhí)行block里的內(nèi)容,接著走你寫好的邏輯判斷

if ([str isEqualToString:@"youShouldA" ] ) 

最后實現(xiàn)邏輯判斷里方法啥容。

3凿蒜、JSContext你應該要注意的一點

失效原因
網(wǎng)上很多例子都是上述辦法技矮,但是當你界面需要再次刷新的時候,即:

[self.webView loadRequest:self.request];

這樣會導致js代碼重新注入,JSContext就會失效。

解決辦法
這個時候你其實還需要一句代碼呵曹,就是當你執(zhí)行到

- (void)webViewDidFinishLoad:(UIWebView *)webView

這里的時候必須重新告訴js端,所以我們還需要一個方法何暮,讓js端知道我們走到了這個方法奄喂,讓他再主動調(diào)用一次@“comeHere”。
我們可以隨便定義這個方法的名字海洼,讓js端寫好這個方法跨新,等待我們調(diào)用。則最終的代碼為

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    //此處寫剛剛貼的JSContext代碼

    //加上這句
    [webView stringByEvaluatingJavaScriptFromString:@"javaCallback()"];
}

4坏逢、總結(jié)

網(wǎng)上關于JSContext的文章域帐,有些很復雜,其實我們不用具體了解是整,核心就是幾句代碼而已肖揣。另外當你的JSContext失效的時候,可以仔細檢查一下是不是js端和app端的方法搞反了贰盗,更好的是可以創(chuàng)個demo许饿,單純的寫幾個簡單的代碼自己去分析阳欲。


_本站文章為 寶寶巴士 SD.Team 原創(chuàng)舵盈,轉(zhuǎn)載務必在明顯處注明:(作者官方網(wǎng)站: 寶寶巴士 ) __轉(zhuǎn)載自【寶寶巴士SuperDo團隊】原文鏈接: http://www.reibang.com/p/1ecd7416b2fd

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市球化,隨后出現(xiàn)的幾起案子秽晚,更是在濱河造成了極大的恐慌,老刑警劉巖筒愚,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赴蝇,死亡現(xiàn)場離奇詭異,居然都是意外死亡巢掺,警方通過查閱死者的電腦和手機句伶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陆淀,“玉大人考余,你說我怎么就攤上這事≡唬” “怎么了楚堤?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我身冬,道長衅胀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任酥筝,我火速辦了婚禮滚躯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘿歌。我一直安慰自己哀九,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布搅幅。 她就那樣靜靜地躺著阅束,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茄唐。 梳的紋絲不亂的頭發(fā)上息裸,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音沪编,去河邊找鬼呼盆。 笑死,一個胖子當著我的面吹牛蚁廓,可吹牛的內(nèi)容都是我干的访圃。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼相嵌,長吁一口氣:“原來是場噩夢啊……” “哼腿时!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起饭宾,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤批糟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后看铆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體徽鼎,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年弹惦,在試婚紗的時候發(fā)現(xiàn)自己被綠了否淤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡棠隐,死狀恐怖石抡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宵荒,我是刑警寧澤汁雷,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布净嘀,位于F島的核電站,受9級特大地震影響侠讯,放射性物質(zhì)發(fā)生泄漏挖藏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一厢漩、第九天 我趴在偏房一處隱蔽的房頂上張望膜眠。 院中可真熱鬧,春花似錦溜嗜、人聲如沸宵膨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辟躏。三九已至,卻和暖如春土全,著一層夾襖步出監(jiān)牢的瞬間捎琐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工裹匙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瑞凑,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓概页,卻偏偏與公主長得像籽御,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惰匙,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

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