美文网首页
oc与js交互之WKWebView

oc与js交互之WKWebView

作者: Jessica124 | 来源:发表于2017-08-09 16:25 被阅读49次

WKWebView是苹果在 iOS 8 中引入的新组件,目的是给出一个新的高性能的 Web View 解决方案,摆脱过去 UIWebView 的老旧笨重特别是内存占用量巨大的问题,它使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safari一样快.

导入头文件
#import <WebKit/WebKit.h>
配置webView加载页面
    WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
    config.userContentController = [[WKUserContentController alloc] init];
    //注册js方法
    [config.userContentController addScriptMessageHandler:self name:@"myWebView"];
    _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height - 80) configuration:config];
    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://192.168.0.114:8020/AppTest/index.html"]]];
    self.webView.navigationDelegate = self;
    self.webView.UIDelegate = self;
    [self.view addSubview:self.webView];
遵守的代理方法有:
WKNavigationDelegate, WKUIDelegate, WKScriptMessageHandler
  • WKNavigationDelegate (webview.navigationDelegate = self)
// 页面开始加载时调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation {
    NSLog(@"didStartProvisionalNavigation");
}
// 已开始加载页面,可以在这一步向view中添加一个过渡动画
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation {
}
// 页面已全部加载,可以在这一步把过渡动画去掉
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
}
// 页面加载失败时调用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation {
}
  • WKUIDelegate (self.webView.UIDelegate = self;)
/**
 *  web界面中有弹出警告框时调用(js中alert的拦截)
 *
 *  @param webView           实现该代理的webview
 *  @param message           警告框中的内容
 *  @param frame             主窗口
 *  @param completionHandler 警告框消失调用
 */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(nonnull WKFrameInfo *)frame completionHandler:(nonnull void (^)(void))completionHandler {
    NSLog(@"%@", message);//哈哈,我是alert
   //显示弹出框代码略,弹出框消失时需要回调completionHandler,否则会crash
    completionHandler();
}

对应js的代码

 <script type="text/javascript">
    alert("哈哈,我是alert");
 </script>
  • WKScriptMessageHandler ([config.userContentController addScriptMessageHandler:])
//初始化配置时注册js方法,当js调用oc代码时(如上面的myWebView),会回调此方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    NSLog(@"WKScriptMessage == %@", message.name);//myWebView
}

对应js代码

 <script type="text/javascript">
    window.webkit.messageHandlers.webViewApp.postMessage(null);
 </script>
oc调js方法

evaluateJavaScript方法,如果有参数格式是getAA(参数,参数...)

[self.webView evaluateJavaScript:@"getAA()" completionHandler:^(id _Nullable info, NSError * _Nullable error) {
        NSLog(@"%@", info);//返回值
    }];
js调oc方法

好像上面已经说过了,再说一遍。。

  • 注册js方法
    [config.userContentController addScriptMessageHandler:self name:@"js方法"];
  • 处理handler委托
    -(void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
其他
    //返回
    [self.webView goBack];
    //前进
    [self.webView goForward];
    
    [self.webView addObserver:self forKeyPath:@"loading" options:(NSKeyValueObservingOptionNew) context:nil];
    //监听加载进度
    [self.webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    if ([keyPath isEqualToString:@"loading"]) {
//        gobackBtn.enabled = self.webView.canGoBack;
//        forwardBtn.enabled = self.webView.canGoForward;
    }
    if ([keyPath isEqualToString:@"estimatedProgress"]) {
        //progress是UIProgressView
        progress.hidden = self.webView.estimatedProgress==1;
        [progress setProgress:self.webView.estimatedProgress animated:YES];
    }
}

参考链接
http://liuyanwei.jumppo.com/2015/10/17/ios-webView.html

相关文章

网友评论

      本文标题:oc与js交互之WKWebView

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