在开发的过程中,UIWebView加载网页会比较慢,所以为了追求更加良好的用户体验,苹果退出了WKWebView,关于WKWebView的有点好处云云,网上评价所得是。我在这里就简单的总结为:加载快,节省内存,用户体验好吧。
废话不多说,现在就把自己学习WKWebView的一些心得分享给需要的小伙伴吧。
***使用前的准备工作****
1.需要导入头文件,#import
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拥有两个参数 一个是返回错误 一个可以返回执行脚本后的返回值(暂时还不理解怎么用)。
先介绍这些吧,书写或者理解有错的地方欢迎大家指出!