iOS 开发OC与js交互2019IV

JSContext

2016-05-31  本文已影响7909人  babybus_superdo

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

上一篇下一篇

猜你喜欢

热点阅读