WKUIDelegate從名稱能看出它是webView在user interface上的代理,共有5個(gè)可選類型的代理方法。它為webView提供了原生的彈框,而不是JavaScript里的提示框。
雖然JavaScript的提示框可以做的跟原生一樣,但是對于ios開發(fā)者來說,如果要更改提示框就不方便了。提供這個(gè)代理,可以讓ios端更加靈活的修改提示框的樣式。
js中有三種提示框:Alert,Confirm,prompt對應(yīng)到該代理如下:
/* 警告 */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
[[[UIAlertView alloc] initWithTitle:@"警告框" message:message delegate:nil cancelButtonTitle:@"確認(rèn)" otherButtonTitles: nil] show];
completionHandler();
}
///** 確認(rèn)框 */
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler{
[[[UIAlertView alloc] initWithTitle:@"確認(rèn)框" message:message delegate:nil cancelButtonTitle:@"確認(rèn)" otherButtonTitles: nil] show];
completionHandler(1);
}
/** 輸入框 */
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler{
[[[UIAlertView alloc] initWithTitle:@"輸入框" message:prompt delegate:nil cancelButtonTitle:@"確認(rèn)" otherButtonTitles: nil] show];
completionHandler(@"你是誰!");
}
看下效果:


除了上面的三個(gè)方法我們發(fā)現(xiàn)還有兩個(gè)代理方法沒用用到。
// 創(chuàng)建新的webView
// 可以指定配置對象、導(dǎo)航動作對象、window特性。如果沒用實(shí)現(xiàn)這個(gè)方法,不會加載鏈接,如果返回的是原webview會崩潰。
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
// webview關(guān)閉時(shí)回調(diào)
- (void)webViewDidClose:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);
要調(diào)用下面的方法是有條件的
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
WKNavigationDelegate中的該方法是用戶點(diǎn)擊網(wǎng)頁上的鏈接,需打開新頁面時(shí),將先調(diào),是否允許跳轉(zhuǎn)到鏈接。
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
WKFrameInfo *sFrame = navigationAction.sourceFrame;//navigationAction的出處
WKFrameInfo *tFrame = navigationAction.targetFrame;//navigationAction的目標(biāo)
//只有當(dāng) tFrame.mainFrame == NO;時(shí),表明這個(gè) WKNavigationAction 將會新開一個(gè)頁面。
//才會調(diào)用- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
}
但是新開一個(gè)webView。如果我們只是顯示網(wǎng)頁,就感覺這么做耗性能,沒有必要。
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
WKFrameInfo *frameInfo = navigationAction.targetFrame;
if (![frameInfo isMainFrame]) {
[webView loadRequest:navigationAction.request];
}
return nil;
}
參考鏈接:http://www.itdecent.cn/p/3a75d7348843 (WKWebView遇到_blank的處理方法)