JSContext
JSContext是JavaScriptCore框架中的东西。JavaScriptCore是iOS7中新加入的框架,用来处理JavaScript。JavaScriptCore 是苹果 Safari 浏览器的 JavaScript 引擎,JavaScriptCore在 OS X 平台上很早就存在的,而在 iOS 平台,直到IOS7才对外开放,并提供了 Objective-C 的接口。该框架让Objective-C和JavaScript代码直接的交互变得更加的简单方便。
简单的一句话:苹果官方提供的JSContext可以实现Objective-C和JavaScript代码的交互。
1、早期我们用什么来与js交互
早期我们使用UIWebViewDelegate来拦截URL从而实现交互。
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
当我们点击webView上的某个按钮的时候,会跳转上述代理,然后使用
NSString *requestString = [[request URL] absoluteString];
来得出点击按钮的URL事件,根据地址的不同来实现原生的页面跳转或者其他功能。
2、JSContext该如何使用
JSContext:Aninstance of JSContext represents a JavaScript execution environment.(一个 Context 就是一个 JavaScript 代码执行的环境,也叫作用域。)
JSValue:Conversionbetween Objective-C and JavaScript types.(JS是弱类型的,ObjectiveC是强类型的,JSValue被引入处理这种类型差异,在Objective-C 对象和 JavaScript 对象之间起转换作用)
直接贴一段代码
- (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来调用你block中的内容。
@“youShouldA”
@"youShouldB"
这两个是js端需要告诉你的方法。
一旦此处代码执行完毕后,就好像是一直放了个context这个东西在这里,一旦你点击webView上A按钮,js就跑到你告诉他的方法里,即:comHere,然后代码就会执行block里的内容,接着走你写好的逻辑判断
if ([str isEqualToString:@"youShouldA" ] )
最后实现逻辑判断里方法。
3、JSContext你应该要注意的一点
失效原因
网上很多例子都是上述办法,但是当你界面需要再次刷新的时候,即:
[self.webView loadRequest:self.request];
这样会导致js代码重新注入,JSContext就会失效。
解决办法
这个时候你其实还需要一句代码,就是当你执行到
- (void)webViewDidFinishLoad:(UIWebView *)webView
这里的时候必须重新告诉js端,所以我们还需要一个方法,让js端知道我们走到了这个方法,让他再主动调用一次@“comeHere”。
我们可以随便定义这个方法的名字,让js端写好这个方法,等待我们调用。则最终的代码为
- (void)webViewDidFinishLoad:(UIWebView *)webView{
//此处写刚刚贴的JSContext代码
//加上这句
[webView stringByEvaluatingJavaScriptFromString:@"javaCallback()"];
}
4、总结
网上关于JSContext的文章,有些很复杂,其实我们不用具体了解,核心就是几句代码而已。另外当你的JSContext失效的时候,可以仔细检查一下是不是js端和app端的方法搞反了,更好的是可以创个demo,单纯的写几个简单的代码自己去分析。
_本站文章为 宝宝巴士 SD.Team 原创,转载务必在明显处注明:(作者官方网站: 宝宝巴士 ) __转载自【宝宝巴士SuperDo团队】原文链接: http://www.jianshu.com/p/1ecd7416b2fd