防止通用链接在`WKWebView`/`UIWebView`中打开

Prevent universal links from opening in `WKWebView`/`UIWebView`

当用户点击 WKWebView 中的通用 link 时,将打开相应的应用程序(如果已安装)。

这在Apple Search Programming Guide

中有描述

If you instantiate a SFSafariViewController, WKWebView, or UIWebView object to handle a universal link, iOS opens your website in Safari instead of opening your app. However, if the user taps a universal link from within an embedded SFSafariViewController, WKWebView, or UIWebView object, iOS opens your app.

在我的应用程序中,我有一个 WKWebView,但我不希望用户退出我的应用程序。我想在 WKWebView.

中处理 link

如何防止通用 link 打开?或者我可以知道 URL 是否可以由其他应用程序处理吗?

+[LSAppLink openWithURL:completionHandler:] 这就是通用link打开相应应用程序的方式。 你可以用自己的方法交换它的实现 但要小心,这是私人的 API.

你可以查看LSAppLink头文件here

WebKit 源代码:

static const WKNavigationActionPolicy WK_API_AVAILABLE(macosx(10.11), ios(9.0)) _WKNavigationActionPolicyAllowWithoutTryingAppLink = (WKNavigationActionPolicy)(WKNavigationActionPolicyAllow + 2);

如果您使用 WKWebView,只需使用 WKNavigationActionPolicyAllow + 2 而不是 WKNavigationActionPolicyAllow

根据@none 的回答,这里是 Swift 4

的例子

我已经测试过了,确实有效!

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    decisionHandler(WKNavigationActionPolicy(rawValue: WKNavigationActionPolicy.allow.rawValue + 2)!)
}

你能试试这个吗?

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    decisionHandler(WKNavigationActionPolicy(rawValue: WKNavigationActionPolicy.allow.rawValue + 2)!)
}