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);
}
コメント