UIWebViewからWKWebViewに【objective-c】

この記事は約4分で読めます。

UIWebViewからWKWebViewに置き換える資料でobjective-cは少なかったので投稿。

やりたいこと

ページ内のリンク(目次でジャンプなど)はスクロール。ページ外のリンクはsafariを開く。

コード

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    NSURL *visibleUrl = self.WebView.URL;
    NSURL *linkUrl =  navigationAction.request.URL;

    if (![[visibleUrl host] isEqualToString:[linkUrl host]] || ![[visibleUrl relativePath] isEqualToString:[linkUrl relativePath]]) {
        // ブラウザ起動確認アラート表示
        [self showBrowserLaunchConfirmAlertWithURLString:[linkUrl absoluteString]];
        decisionHandler(WKNavigationActionPolicyCancel);
    } else {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}

解説

メソッド

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
}

WebViewを表示する前にナビゲーションするメソッド。
許可拒否ができる(どちらかが無いとエラー、両方あってもエラー)

//拒否
decisionHandler(WKNavigationActionPolicyCancel);
//許可
decisionHandler(WKNavigationActionPolicyAllow);

エラー

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Completion handler passed to -[NTENoteDetailWebViewController webView:decidePolicyForNavigationAction:decisionHandler:] was not called'

ー>呼ばれてないよ

Completion handler passed to -[WKPrivateNavigationDelegate webView:decidePolicyForNavigationAction:decisionHandler:] was called more than once

ー>何回か呼ばれてるけど、どういうことだい?

中の処理

visibleUrlにはwebViewですでに表示しているURL。linkUrlにはタップして遷移するページのURLが入る。

ifの中でhostとrelativePathでそれぞれ比較して異なっていれば、URLを引数にブラウザ表示に移る。

    NSURL *visibleUrl = self.WebView.URL;
    NSURL *linkUrl =  navigationAction.request.URL;

    if (![[visibleUrl host] isEqualToString:[linkUrl host]] || ![[visibleUrl relativePath] isEqualToString:[linkUrl relativePath]]) {
        // ブラウザ起動確認アラート表示
        [self showBrowserLaunchConfirmAlertWithURLString:[linkUrl absoluteString]];
        decisionHandler(WKNavigationActionPolicyCancel);
    } else {
        decisionHandler(WKNavigationActionPolicyAllow);
    }

コメント

タイトルとURLをコピーしました