WKWebView的基本使用

一、WKWebView的基本使用

  1. 初始化方法
    - (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration
  2. 简单介绍一下configuration,WKWebViewConfiguration里面有个userContentController。可通过它为webview注入javaScript代码。并且可以添加监听javaScript的回调。
    (1)初始化configurationWKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc]init];
    (2)获取javaScript代码,我把javaScript代码写在了一个文件中NSString *jsStr = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"WKWebViewJS" ofType:@"js"] encoding:NSUTF8StringEncoding error:nil];
    (3)初始化script对象
    /*@abstract 初始script对象
     @param source javaScript代码
     @param injectionTime 注入javaScript代码的时机
     @param forMainFrameOnly 是不是仅为MainFrame注入
     */
    WKUserScript *userScript = [[WKUserScript alloc]initWithSource:jsStr injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];

(4)添加script对象[configuration.userContentController addUserScript:userScript];
(5)添加scriptMessage回调
[configuration.userContentController addScriptMessageHandler:self name:@"imageClick"]; [configuration.userContentController addScriptMessageHandler:self name:@"popToPreviousVC"];
若添加过回调之后,在结束调用这个方法window.webkit.messageHandlers.<handleName>.postMessage(<messageBody>) 系统会调用这个方法- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

  1. WKWebView 执行javaScript代码
    self.webview evaluateJavaScript:@"changeFontSize(12)" completionHandler:^(id _Nullable result, NSError * _Nullable error) { }];
  2. WKWebView的一些简单属性的介绍
backForwardList            浏览历史
title                      网页标题             支持KVO
URL                        正在显示的URL        支持KVO
loading                    是否正在加载          支持KVO
estimatedProgress          加载进度             支持KVO
canGoBack  canGoForward    能否后退 前进         支持KVO
reload                     重新加载
stopLoading                停止加载
allowsBackForwardNavigationGestures  是否允许侧滑返回上一页

5、WKWebView的加载方法跟UIWebView基本一样

- (nullable WKNavigation *)loadRequest:(NSURLRequest *)request;
- (nullable WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
- (nullable WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL;

二 WKWebViewUIDelegate

//当需要打开一个新窗口的时候的调用,如a标签的target='_blank',需要返回一个新的Webview
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
以下三个类似alert的代理,一定要调用completionHandler(),这个回调,告诉webview结果
//webview上需要弹出alert的时候调用此方法,如果不实现此方法,则webview的alert是显示不出来,alert类似于只有确定按钮的UIAlertView
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
//webview上需要弹出confirm的时候调用此方法,如果不实现此方法,则webview的confirm是显示不出来,confirm类似于有确定按钮和取消按钮的UIAlertView
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler
 webview上需要弹出prompt的时候调用此方法,如果不实现此方法,则webview的prompt是显示不出来,prompt类似于带一个textField的UIAlertView。defaultText相当于textField的placeholed
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler
//window.close() 的时候调用
- (void)webViewDidClose:(WKWebView *)webView

三 WKWebViewNavigationDelegate

//决定是否允许发起这个请求
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
//在webview有响应之后,再次决定是否允许这个请求
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandle
//webview开始加载的时候调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(null_unspecified WKNavigation *)navigation
//webview内容已经加载结束,但是上面的某些资源比如图片加载之前调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation
//webview加载结束的时候调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation
//webview加载失败的时候调用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error
//webview在commit过程中失败的时候调用,例如在didCommitNavigation这个代理方法中调用webview的stopLoading方法
- (void)webView:(WKWebView *)webView didFailNavigation:(null_unspecified WKNavigation *)navigation withError:(NSError *)error

四 WKScriptMessageHandler

//收到JavaScript回调的时候调用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

五 接下来用一下做个小demo。

功能如下:
1、点击按钮可以控制webView上的字体的大小和颜色
2、点击webView上的返回,能pop到上一个VC
3、点击webView图片,弹出alert告诉我弹出的是第几张图片,和图片的大小和位置以及所有的图片的地址
4、验证代理方法
效果如下:

1.gif

(1)首先为webview注入JS代码,JS代码里主要实现的是:当window加载之后,为img标签添加click事件,定义改变字体颜色和大小的函数

   WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc]init];
   NSString *jsStr = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"WKWebViewJS" ofType:@"js"] encoding:NSUTF8StringEncoding error:nil];
   WKUserScript *userScript = [[WKUserScript alloc]initWithSource:jsStr injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO];
   [configuration.userContentController addUserScript:userScript];
   [configuration.userContentController addScriptMessageHandler:self name:@"imageClick"];
   [configuration.userContentController addScriptMessageHandler:self name:@"popToPreviousVC"];

(2)调用JS代码,实现改变字体颜色和大小

- (void)runJavaAcript:(UIButton *)button{
    if (button.tag == 0) {
        [self.webview evaluateJavaScript:@"changeTextColor('#f00')" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        }];
    }else if (button.tag == 1){
        [self.webview evaluateJavaScript:@"changeTextColor('#666')" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        }];
    }else if (button.tag == 2){
        [self.webview evaluateJavaScript:@"changeFontSize(38)" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        }];
    }else if (button.tag == 3){
        [self.webview evaluateJavaScript:@"changeFontSize(12)" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
        }];
    }
}

(3)点击webview上的返回按钮pop到上一个VC
1)在html中的定义

//返回标签的定义
<button onclick="popToPreviousVC()">返回</button>
//函数实现
function popToPreviousVC(){
    webkit.messageHandlers.popToPreviousVC.postMessage(true);
}

2)webview收到回调的处理

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
    if ([message.name isEqualToString:@"imageClick"]) {
        NSInteger current = [message.body[@"current"] integerValue];
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:[NSString stringWithFormat:@"你点击了第%ld张图片,该图片的坐标是%@",(long)current,message.body[@"rect"]] message:[NSString stringWithFormat:@"图片的地址分别是:%@",message.body[@"srcs"]] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil];
        [alert show];
    }else if([message.name isEqualToString:@"popToPreviousVC"]){
        [self.navigationController popViewControllerAnimated:YES];
    }
}

要想接收到回调,一定要先在先添加回调,而且添加的名字一定要和发送的名字一致
[configuration.userContentController addScriptMessageHandler:self name:@"popToPreviousVC"];

(4)点击webView图片,弹出alert告诉我弹出的是第几张图片,和图片的大小和位置以及所有的图片的地址,回调的信息如上,下面展示js代码

function initImageClick(obj,index) {
    obj.onclick = function imgOnclick() {
        //获取image的位置
        var rect = obj.getBoundingClientRect();
        //获取所有的img标签
        var imgs = document.getElementsByTagName('img');
        var srcs = new Array();
        for(var i in imgs){
            //判断img的src是否为未定义,加入srcs数组
            if(imgs[i].src != undefined)
            srcs.push(imgs[i].src);
        }
        //由于OC不识别rect这个对象,在这把rect转成了符合CGRect格式的字符串
        var message = {'rect':'{{'+rect.left+', '+rect.top+'}, {'+rect.width+', '+rect.height+'}}}'};
        //为message这个js对象的属性赋值
        message.current = index;
        message.srcs = srcs;
        //发送消息
        webkit.messageHandlers.imageClick.postMessage(message);
    }
}

代理方法的验证具体看demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 之前一直是使用UIWebView与后台交互,这些天刚接触WKWebView,感觉速度要比UIWebVeiw快很多,...
    大_龙_虾阅读 1,803评论 0 0
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 这是一个难题,是在一生里 多年的心事都已沉入海底 我站在岸堤,望着天际 不知道,那会不会随着潮汐 来到这里 这多年...
    二莎子阅读 245评论 0 0
  • 我没有参加挑战杯,帮忙修改进了省赛的结题论文;没有参加演说比赛,观看了大量精彩的演说谈话节目;没有谈恋爱,经常有朋...
    简二阅读 289评论 0 1
  • 1. 人,其实不需要太多的东西,只要健康的活着,真诚的爱着,也不失为一种富有。 2. 想不开,就不想,得不到,就不...
    指尖传奇阅读 510评论 0 0