ぽんぽこ日記

プログラミング、読書、日々の生活

【iOS8】 WKWebView内の画面遷移をフックする

以前、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へのアクセスのみを許可し、それ以外にはアクセスさせないようにしています。

サンプルコードはこちら

GitHub - ponpoko1968/WKNavigationActionExample: Page navigation sample on WebKit Framework using WKNavigationAction

[asin:B00NPOF80A:detail]