UIWebView
& UIWebViewDelegate
这个两个东西在 WKWebKit 中被重构成 14 个类 3 个协议。
WKWebKit Framework
Classes
WKBackForwardList
: 之前访问过的 web 页面的列表,可以通过后退和前进动作来访问到。WKBackForwardListItem
: webview 中后退列表里的某一个网页。
WKFrameInfo
: 包含一个网页的布局信息。WKNavigation
: 包含一个网页的加载进度信息。WKNavigationAction
: 包含可能让网页导航变化的信息,用于判断是否做出导航变化。WKNavigationResponse
: 包含可能让网页导航变化的返回内容信息,用于判断是否做出导航变化。
WKPreferences
: 概括一个 webview 的偏好设置。WKProcessPool
: 表示一个 web 内容加载池。WKUserContentController
: 提供使用 JavaScript post 信息和注射 script 的方法。WKScriptMessage
: 包含网页发出的信息。WKUserScript
: 表示可以被网页接受的用户脚本。 > -WKWebViewConfiguration
: 初始化 webview 的设置。
WKWindowFeatures
: 指定加载新网页时的窗口属性。
Protocols
WKNavigationDelegate
: 提供了追踪主窗口网页加载过程和判断主窗口和子窗口是否进行页面加载新页面的相关方法。WKScriptMessageHandler
: 提供从网页中收消息的回调方法。WKUIDelegate
: 提供用原生控件显示网页的方法回调。
JavaScript ↔︎ Swift 对话机制
WKUserScript
允许在正文加载之前或之后注入到页面中。这个强大的功能允许在页面中以安全且唯一的方式操作网页内容。
一个简单的例子如下,用户改变背景的用户脚本被插入到网页中:
Swift:
let source = "document.body.style.background = \"#777\";"let userScript = WKUserScript(source: source, injectionTime: .AtDocumentEnd, forMainFrameOnly: true)let userContentController = WKUserContentController()userContentController.addUserScript(userScript)let configuration = WKWebViewConfiguration()configuration.userContentController = userContentControllerself.webView = WKWebView(frame: self.view.bounds, configuration: configuration)
Objective-C:
NSString *source = @"document.body.style.background = \"#BECAC1\";"; WKUserScript *userScript = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:true]; WKUserContentController *userContentController = [[WKUserContentController alloc] init]; [userContentController addUserScript:userScript]; WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; configuration.userContentController = userContentController; _webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 0, SCREENWIDTH, SCREENHEIGHT) configuration:configuration]; _webView.navigationDelegate = self; _webView.UIDelegate = self; [_webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]]; [self.view addSubview:_webView];
webView生命周期和跳转代理
// 页面开始加载时调用- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;// 当内容开始返回时调用- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;// 页面加载完成之后调用- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;// 页面加载失败时调用- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;// 接收到服务器跳转请求之后调用- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;// 在收到响应后,决定是否跳转- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;// 在发送请求之前,决定是否跳转- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;