以前、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へのアクセスのみを許可し、それ以外にはアクセスさせないようにしています。
サンプルコードはこちら
