iOSアプリのWKWebViewからdeep linkがタップされたときに処理を行う

概要

WKWebViewを使ったiOSアプリがある。
WKWebViewの中でdeep linkがタップされたとき、アプリ側で処理を行いたい。
deep linkのタップを知るにはどうすればいいか。

環境

  • Xcode version 11.6
  • Objective-C

WKNavigationDelegate

WKNavigationDelegateを使うと、WKWebViewの画面遷移をフックして処理を行うことができる。

- (void)setupWKWebView
{
    WKWebViewConfiguration* webConfig = [[WKWebViewConfiguration alloc] init];
    WKWebView* webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:webConfig];
    [self.view addSubview:webView];
    // 画面遷移をフックする
    webView.navigationDelegate = self;
    NSURLRequest* request = [NSURLRequest requestWithURL:[NSURL URLWithString:kUrl]];
    [webView loadRequest:request];
}

WKNavigationDelegate

WKNavigationDelegatewebView:decidePolicyForNavigationAction:decisionHandler:は、画面遷移を行うかどうかを決めることができる。

画面遷移の前にリンクのURLを確認して、deep linkなら画面遷移を中止して特別な処理を行う。

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    NSLog(@"URL    = %@", navigationAction.request.URL.absoluteString);
    NSLog(@"scheme = %@", navigationAction.request.URL.scheme);
    NSURLComponents* components = [[NSURLComponents alloc] initWithURL:navigationAction.request.URL resolvingAgainstBaseURL:YES];
    NSLog(@"query  = %@", components.queryItems);

    if ([navigationAction.request.URL.scheme.lowercaseString isEqualToString:@"my-app"]) {
        // my-app://〜 のときは画面遷移をキャンセルして特別な処理を行う
        decisionHandler(WKNavigationActionPolicyCancel);
        // 特別な処理
    } else {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください