iOS--WKWebView的学习心得

在开发的过程中,UIWebView加载网页会比较慢,所以为了追求更加良好的用户体验,苹果退出了WKWebView,关于WKWebView的有点好处云云,网上评价所得是。我在这里就简单的总结为:加载快,节省内存,用户体验好吧。

废话不多说,现在就把自己学习WKWebView的一些心得分享给需要的小伙伴吧。

***使用前的准备工作****

1.需要导入头文件,#import,要不然无法调出WKWebView。

2.与此同时,还需要遵循代理WKNavigationDelegate,WKUIDelegate。WKScriptMessageHandler主要是跟JS交互才用到的,可以选择性的遵守。

***WKWebView加载链接****

//加载webView

[self.view addSubview:self.webView];

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]];

跟UIWebView加载连接的方法类似。

_webView.UIDelegate = self;

_webView.navigationDelegate = self;

(遵循代理)

***WKNavigationDelegate****WKNavigationDelegate来追踪加载过程***

首先逐一介绍下这个代理中的代理方法:

1.- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{

NSLog(@"WKNavigationDelegate来追踪加载过程  页面开始加载的时候调用");

}

在加载页面的时候调用此方法,类似于UIWebView中的-webViewDidStartLoad:这个方法。

2.- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{

NSLog(@"WKNavigationDelegate来追踪加载过程  页面开始返回时调用");

}

看网上大神们给这个方法的解释是:页面开始返回的时候调用。但我认为理解成在加载中会更好一些吧。

3.- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{

NSLog(@"WKNavigationDelegate来追踪加载过程  页面加载完成之后调用");

}

页面加载完成之后调用的,类似于UIWebView中的-webViewDidFinishLoad:

4.- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error{

NSLog(@"WKNavigationDelegate来追踪加载过程  页面加载失败时调用");

}

页面加载失败的时候调用的,类似于UIWebView中的- webView:didFailLoadWithError:

该方法是接收到服务器请求之后调用的。

小结:一般来说,WKWebView的加载过程是1 2 3方法按次序执行的。

***WKNavigationDelegate****WKNavigationDelegate来决定页面是否加载***

1.- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{

decisionHandler(WKNavigationActionPolicyAllow);

}

该方法是:在WKWebView发送请求之前,决定页面是否加载;WKNavigationActionPolicyAllow(允许加载),WKNavigationResponsePolicyCancel(不允许加载)

注意:在该代理方法中,假如设为WKNavigationResponsePolicyCancel(不允许加载),那么WKWebView是加载不出来的,与此同时,WKNavigationDelegate来追踪加载过程中的1  2  3 三个方法都将不再执行。decisionHandler(WKNavigationActionPolicyAllow);假如没有这句话的话,在程序运行的时候,会Crash。

2.- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(nonnull WKNavigationResponse *)navigationResponse decisionHandler:(nonnull void (^)(WKNavigationResponsePolicy))decisionHandler{

NSLog(@"%@", navigationResponse.response.URL.absoluteString);

decisionHandler(WKNavigationResponsePolicyAllow);

}

该方法是:在WKWebView收到响应之后,决定页面是否加载。同样的decisionHandler(WKNavigationActionPolicyAllow);假如没有这句话的话,在程序运行的时候,会Crash。假如设为decisionHandler(WKNavigationResponsePolicyCancel)的话,页面也会加载不出来,但是WKNavigationDelegate来追踪加载过程中会执行第一条(WKWebView开始加载)和WKWebView加载失败的方法。

3.- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation{

NSLog(@"WKNavigationDelegate来进行页面跳转  接收到服务器跳转请求之后再执行");

}

该方法是:接收到服务器跳转请求之后再执行。(目前还不理解该方法具体用途)

***WKUIDelegate****该代理中的方法还未曾使用过,简单罗列出来***

1.- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures{

return webView;

}

创建一个新的WebView。

2.- (void)webViewDidClose:(WKWebView *)webView{

NSLog(@"WebView的关闭");

}

WebView的关闭。

3.- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{

NSLog(@"显示一个JS的alter(和JS的交互)");

UIAlertController *alterVC = [UIAlertController alertControllerWithTitle:message message:nil preferredStyle:UIAlertControllerStyleAlert];

[alterVC addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {

}]];

[alterVC addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {

}]];

[self presentViewController:alterVC animated:YES completion:^{

}];

}

显示一个JS的alter(和JS的交互),JS里面的alert实现 如果不实现 网页的alert函数无效。

4.- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler{

completionHandler(@"弹出一个输入框(和JS的交互)");

}

弹出一个输入框(和JS的交互)。

5.-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler{

}

显示一个确认框。

***WKWebView的其他方法****

- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *))completionHandler{

completionHandler(@"15",nil);

}

completionHandler拥有两个参数 一个是返回错误 一个可以返回执行脚本后的返回值(暂时还不理解怎么用)。

先介绍这些吧,书写或者理解有错的地方欢迎大家指出!

你可能感兴趣的:(iOS--WKWebView的学习心得)