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