
WKWebVIEw的优势
性能高,稳定性好,占用的内存比较小,支持Js交互支持HTML5 新特性可以添加进度条(然并卵,不好用,还是习惯第三方的)。支持内建手势,据说高达60fps的刷新频率(不卡)1.Xcode新建My.HTML文件,自定义HTML内容,主要代码如下:
(1)标签为UI样式(写了简单的Js代码,目的用于讲解交互)
(2)onClick为Js事件,当Js想给OC传递参数时,采用如下代码:window.webkit.messageHandlers.<方法名>.postMessage(数据)
<h1 >欢迎来到Js世界</h1> <p > <a href="github://callname_?https://github.com/wslcmk" rel="external nofollow" >Github主页</a> :截获URL调用OC</p><p > <a href="http://192.168.0.116/monkey/iOS-URNetworking/commits/master" rel="external nofollow" >GitLab主页</a> </p><p > <button ID="btn1" type = "button" onclick = "JsToOcFunctionOne()" > Js调用OC->不带参数 </button> </p><p > <button ID="btn2" type = "button" onclick = "JsToOcFunctionTwo()"> Js调用OC->带参数 </button> </p><p > <button ID="btn3" type = "button" onclick = "showAlert()" > oc捕获到HTML的d出框 </button> </p><!-- Js语法--><script type = "text/JavaScript">function JsToOcFunctionOne(){ window.webkit.messageHandlers.JsToOcnoprams.postMessage({});}function JsToOcFunctionTwo(){ window.webkit.messageHandlers.JsToOcWithPrams.postMessage({"params":"我是Js参数"});}function showAlert(){ alert("我来自Js世界,被你发现了");}//改变背景色function changeBgcolor(){ document.body.style.backgroundcolor = randomcolor();}2.KVO实现加载进度条以及标题
// KVO监听:获取进度并显示 获取标题并显示 [self.webVIEw addobserver:self forKeyPath:@"estimatedProgress" options:NSkeyvalueObservingOptionNew context:nil]; [self.webVIEw addobserver:self forKeyPath:@"Title" options:NSkeyvalueObservingOptionNew context:nil];#pragma mark - KVO- (voID)observeValueForKeyPath:(Nsstring *)keyPath ofObject:(ID)object change:(NSDictionary<NSkeyvalueChangeKey,ID> *)change context:(voID *)context{ if ([keyPath isEqualToString:@"Title"]&&object == _webVIEw) { self.Title = _webVIEw.Title; }else if ([keyPath isEqualToString:@"estimatedProgress"] && object == _webVIEw) { self.progressVIEw.progress = _webVIEw.estimatedProgress; if (_webVIEw.estimatedProgress >= 1.0f) { dispatch_after(dispatch_time(disPATCH_TIME_Now,(int64_t)(1 * NSEC_PER_SEC)),dispatch_get_main_queue(),^{ self.progressVIEw.progress = 0; }); } }}3.通过拦截url方式,Js调用OC代码,决定是否跳转(WKNavigationDelegate代理)
#pragma mark -- WKNavigationDelegate WKNavigationDelegate主要处理一些跳转、加载处理 *** 作// 根据WebVIEw对于即将跳转的http请求头信息和相关信息来决定是否跳转- (voID)webVIEw:(WKWebVIEw *)webVIEw decIDePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(voID (^)(WKNavigationActionPolicy))decisionHandler { Nsstring * urlStr = navigationAction.request.URL.absoluteString; NSLog(@"发送跳转请求:%@",urlStr); //自己定义的协议头 Nsstring *HTMLheadString = @"github://"; if([urlStr hasPrefix:HTMLheadString]){ UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"通过截取URL调用OC" message:@"前往Github?" preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:([UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { }])]; [alertController addAction:([UIAlertAction actionWithTitle:@"打开" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { NSURL * url = [NSURL URLWithString:[urlStr stringByReplacingOccurrencesOfString:@"github://callname_?" withString:@""]]; [[UIApplication sharedApplication]canopenURL:url]; }])]; [self presentVIEwController:alertController animated:YES completion:nil]; decisionHandler(WKNavigationActionPolicyCancel); }else{ decisionHandler(WKNavigationActionPolicyAllow); }}4.OC获取Js alert内容(WKUIDelegate处理警告、输入、以及确认,这里只列举了alert。输入和确认就不一一列举了,分别是Js端confirm和prompt函数触发)
当调用Js端alert函数时:通过如下代理获取alert内容
#pragma mark -- WKUIDelegate WKUIDelegate主要处理Js脚本,确认框,警告框等- (voID)webVIEw:(WKWebVIEw *)webVIEw runJavaScriptAlertPanelWithMessage:(Nsstring *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(voID (^)(voID))completionHandler { UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Js-alert-Action" message:message?:@"" preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { completionHandler(); }])]; [self presentVIEwController:alertController animated:YES completion:nil];}5.OC调用Js代码,实现改变Js页面颜色(通过evaluateJavaScript函数、jsstring为Js端方法名)
#pragma mark -navigationItem Action- (voID)ocToJs{ // changecolor()是Js方法名 Nsstring *jsstring = [Nsstring stringWithFormat:@"changeBgcolor()"]; [_webVIEw evaluateJavaScript:jsstring completionHandler:^(ID _Nullable data,NSError * _Nullable error) { }];}6.通过接受Js方法名捕捉方法(带参数和不带参数,Js端向IOS传递参数,采用window.webkit.messageHandlers.<方法名>.postMessage(数据))
(1)需要引入WKUserContentController、主要代码如下
//创建网页配置对象 WKWebVIEwConfiguration *config = [[WKWebVIEwConfiguration alloc] init]; WKUserContentController * wkUController = [[WKUserContentController alloc] init]; //注册一个name为JsToOcnoprams的Js方法 设置处理接收Js方法的对象 [wkUController addScriptMessageHandler:self name:@"JsToOcnoprams"]; [wkUController addScriptMessageHandler:self name:@"JsToOcWithPrams"]; config.userContentController = wkUController;
(2)核心代码
#pragma mark - 通过接收Js传出消息的name进行捕捉的回调方法- (voID)userContentController:(WKUserContentController *)userContentController dIDReceiveScriptMessage:(WKScriptMessage *)message{ NSLog(@"name:%@\\n body:%@\\n frameInfo:%@\\n",message.name,message.body,message.frameInfo); //用message.body获得Js传出的参数体 NSDictionary * parameter = message.body; //Js调用OC if([message.name isEqualToString:@"JsToOcnoprams"]){ UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Js调用到了oc" message:@"不带参数" preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }])]; [self presentVIEwController:alertController animated:YES completion:nil]; }else if([message.name isEqualToString:@"JsToOcWithPrams"]){ UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Js调用到了oc" message:parameter[@"params"] preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }])]; [self presentVIEwController:alertController animated:YES completion:nil]; }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
总结以上是内存溢出为你收集整理的简单说说iOS之WKWebView的用法小结全部内容,希望文章能够帮你解决简单说说iOS之WKWebView的用法小结所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)