iOS中webview和JavaScriptCore的交互笔记

2017-05-15  本文已影响119人  __Seven

对于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。

上一篇下一篇

猜你喜欢

热点阅读