WKWebViewでリンクがクリックされたことをどのように検出しますか? UIWebViewでこれに相当するものを探しています。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
if(navigationType == UIWebViewNavigationTypeLinkClicked)
{
}
return YES;
}
これをWKNavigationDelegate
で試しましたが、リンクをクリックしても、すべてのリクエストに対してWKNavigationTypeOther
しか取得できません。
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
if(navigationAction.navigationType == WKNavigationTypeLinkActivated)
{
}
decisionHandler(WKNavigationActionPolicyAllow);
}
WkWebView
でできることは次のとおりです。
override func viewDidLoad() {
super.viewDidLoad()
let webView = WKWebView()
self.view.addSubview(webView) // you need to also setup constraints here - I left out for clarity
// Make sure you set the delegate, so you get the callback
self.webView.navigationDelegate = self
}
// WKWebViewNavigationDelegate
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
guard let url = navigationAction.request.url, let scheme = url.scheme, scheme.contains("http") else {
// This is not HTTP link - can be a local file or a mailto
decisionHandler(.cancel)
return
}
// This is a HTTP link
open(url: url)
decisionHandler(.allow)
}
このデリゲートメソッドでは、WKWebView
が開こうとしているURLリクエストを取得します。そこで、URLRequest
の属性を確認し、それに応じて応答できます。
そのロジックを処理するURLRequest
の拡張機能を記述して、再利用することもできます。
extension URLRequest {
var isHttpLink: Bool {
return self.url?.scheme?.contains("http") ?? false
}
}
次に、デリゲートメソッドのlong条件を次のように変更できます。
// WKWebViewNavigationDelegate
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
guard navigationAction.request.isHttpLink else {
decisionHandler(.allow)
return
}
// ... handle url