美文网首页
iOS中webview和JavaScriptCore的交互笔记

iOS中webview和JavaScriptCore的交互笔记

作者: __Seven | 来源:发表于2017-05-15 21:54 被阅读119次

    对于webView和JavaScriptCore的交互又很多,这里只是自己在做这个的时候一些遇到的问题:
    如首先要知道JavaScriptCore什么鬼,JavaScriptCore中有几个比较重要的东西:
    JSContext(JS执行的环境,同时也通过JSVirtualMachine管理着所有对象的生命周期,每个JSValue都和JSContext相关联并且强引用context),
    JSValue(JS对象在JSVirtualMachine中的一个强引用,其实就是Hybird对象。我们对JS的操作都是通过它。并且每个JSValue都是强引用一个context),
    JSExport(一个协议,如果JS对象想直接调用OC对象里面的方法和属性,那么这个OC对象只要实现这个JSExport协议就可以了)
    常用的是

        -(void)webViewDidFinishLoad:(UIWebView *)webView{
                          JSContext  *context =  [self.webview 
      valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        context[@"openScanner"] = ^(){TamScanViewController *scanCtr = 
              [[TamScanViewController alloc] init];
        scanCtr.fromePageName = @"TMS";
        [scanCtr getUrl:^(NSString *urlStr) {
            self.urlString = urlStr;
            [self.webview reload]; }];
        [weakSelf.navigationController pushViewController:scanCtr 
        animated:YES];
    };
    }
    

    documentView.webView.mainFrame.javaScriptContext是一个webview调用的路径。
    context[]方法通常会用block来实现具体的操作,或者可以使用JSExport protocol这个协议中实现。

        -(void)webViewDidFinishLoad:(UIWebView *)webView  {  
       [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
             NSString *allHTML = [webView 
       stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
       //页面显示titile
       [self setWebNavagationTitle : [self.webview 
       stringByEvaluatingJavaScriptFromString:@"document.title"]];
       if ( [self.webview stringByEvaluatingJavaScriptFromString:@"document.title"] 
        .length == 0 || [self.webview 
          stringByEvaluatingJavaScriptFromString:@"document.title"] == nil) {
           [self setWebNavagationTitle :  @"扫描结果"]; }
             //    看看html内有没有body
             NSRange notFound = [allHTML rangeOfString:@"404 Not Found"];
            if (notFound.length > 0)
         {
             webView.hidden = YES;
             [self showErrorInfoWithMessage:MSG_CMN_LOAD_MORE_ERROR 
                 delegate:nil];
             return;
         }}
    

    document.title是webview的名称,document.body.innerHTML是webview加载的实体内容。
    这里现总结到这里,后面在补充,主要就是这个[self.webview stringByEvaluatingJavaScriptFromString:@"document.title"]函数。还有webview的回调webViewDidFinishLoad。

    相关文章

      网友评论

          本文标题:iOS中webview和JavaScriptCore的交互笔记

          本文链接:https://www.haomeiwen.com/subject/rsqqxxtx.html