1.使用时首先导入WebKit.framework
2.常用UIWebView与WKWebView方法比较如下:
UIWebView:
- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
url的获得方法:NSString *url = [[request URL] absoluteString];
WKWebView:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
url的获得方法:NSString *url = [navigationAction.request.URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
通过decisionHandler(WKNavigationActionPolicyCancel);decisionHandler(WKNavigationActionPolicyAllow)
决定是否允许跳转
- (void)webViewDidFinishLoad:(UIWebView *)webView
对应
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
在这个方法里通常的操作是OC调JS的操作,使用
[webView evaluateJavaScript: completionHandler:^(id object, NSError * _Nullable error) {
}];
- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error
对应
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error
以上三个方法,可以完成WKWebView与UIWebView的等价替换,暂时完成了异步与同步的交换。
众所周知,同样是与JS交互,Android就容易的多了,与安卓类似的是WKWebView在“形式”上,也像这种交互方式靠拢。
来看看WK仿的是不是有些可笑:
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
WKUserContentController *userContent = [[WKUserContentController alloc] init];
[userContent addScriptMessageHandler:self name:@"JSInterface"];
config.userContentController = userContent;
um…看到这里是不是看到了希望,写一个类给JS调用,瞬间感觉高大上啊。别急,这里self是要遵守代理协议WKScriptMessageHandler的,那么本质区别来了,JS调用OC的实质是在这个代理方法中进行的:
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
是不是大跌眼镜呢。。。。。
来看看与JS交互的代码吧:
1、JS调OC
window.webkit.messageHandlers.JSInterface.postMessage("2");
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSLog(@"%@",message.name);//注册的名称
NSLog(@"%@",message.body);//传值,此处为2 支持字典、数组等的传值。
}
}
2、OC调JS
[webView evaluateJavaScript: completionHandler:^(id object, NSError * _Nullable error) {
}];
官方文档:https://developer.apple.com/reference/webkit
方法调用的先后顺序
//根据请求信息决定是否条转,在这个方法里可以立即调用block执行跳转,也可以保留block,之后异步调用。
1、- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
//在webView中刚开始加载网页内容时调用
2、- (void)webView:(WKWebView *)webView
didStartProvisionalNavigation:(WKNavigation *)navigation;
//根据相应信息决定是否跳转
3、webView:decidePolicyForNavigationResponse:decisionHandler:
//开始接收网页内容时调用
4、- (void)webView:(WKWebView *)webView
didCommitNavigation:(WKNavigation *)navigation;
//导航加载完成时调用
5、- (void)webView:(WKWebView *)webView
didFinishNavigation:(WKNavigation *)navigation;
未完待续。。。。