以前、UIWebViewを使ったアプリで、ユーザーが行うページ遷移操作を制御する方法について記事を書きました。
iOS8から、WebKit Frameworkが導入され、UIWebViewよりも細かな制御が出来るようになりました。
WebKit Frameworkでは、WKNavigationDelegateというプロトコルが導入され、リクエスト発行前と、レスポンス受信後にページ遷移するかどうかを決めることが出来るようになりました。
上の記事と同様のことは、当然WebKit Frameworkでも可能です。
WKWebViewのインスタンスにnavigationDelegate
とというプロパティがあるので、
-(void)loadView { [super loadView]; self.webView = [[WKWebView alloc] initWithFrame:self.view.bounds]; [self.view insertSubview:self.webView atIndex:0]; self.webView.navigationDelegate = self; }
として、デリゲートを設定します。
ユーザがリンクをクリックするなどしてページ遷移させようとしたら、デリゲートとして設定されたオブジェクトにwebView:decidePolicyForNavigationAction:decisionHandler:が送られます。 遷移先の情報はdecidePolicyForNavigationAction:で渡されるWKNavigationActionクラスのオブジェクトに含まれています。
その中のrequestプロパティはNSURLRequestなので、たいていの情報はここから得ることが出来ます。
そして、decisionHandler:の引数で渡されたblockを呼び出して、ページ遷移させるかどうかを決定します。
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { Log1(navigationAction); if([navigationAction.request.URL.host isEqualToString:@"www.apple.com"]){ decisionHandler(WKNavigationActionPolicyAllow); }else{ decisionHandler(WKNavigationActionPolicyCancel); } }
blockの引数には下記の2種類の定数のいずれかを指定します。
定数名 | 意味 |
---|---|
WKNavigationActionPolicyAllow | ページ遷移を許可 |
WKNavigationActionPolicyCancel | ページ遷移を禁止 |
このコード例ではwww.apple.comへのアクセスのみを許可し、それ以外にはアクセスさせないようにしています。
サンプルコードはこちら