简单说说iOS之WKWebView的用法小结

简单说说iOS之WKWebView的用法小结,第1张

概述简单说说iOS之WKWebView的用法小结 WKWebView的优势 性能高,稳定性好,占用的内存比较小, 支持JS交互 支持HTML5 新特性 可以添加进度条(然并卵,不好用,还是习惯第三方的). 支持内建手势, 据说高达60fps的刷新频率(不卡) 1.Xcode新建My.html文件,自定义html内容,主要代码如下: (1)标签为UI样式(写了简单的JS代码,目的用于讲解交互) (2)onClick为JS事件,当JS想给OC传递参数时,采用如下代码:window.webkit.messageHandlers.<方法名> ...

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的用法小结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1109955.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存