概要
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
WKNavigationDelegateのwebView: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);
}
}