禁用 WKWebView 打开链接以重定向到我的 iPhone 上安装的应用程序

问题描述 投票:0回答:4

当我在 google 上搜索并点击 Etsy.com 查找 exmaple 时,WKWebView 会将我重定向到 iPhone 上安装的 Etsy 应用程序。 我怎样才能禁用这种行为?我希望 WKWebView 将我重定向到 etsy.com 移动网站。 我用的是迅捷。

ios swift wkwebview
4个回答
10
投票

不幸的是,

WKWebView
不会将带有自定义方案的URL发送回您的应用程序以自动处理。

如果您在没有特殊处理的情况下尝试此操作,那么在用户通过第三方服务进行身份验证后,您的 Web 视图看起来会挂起,并且您将永远不会收到回调。您可以尝试使用带有标准 http 或 https 方案的重定向 URI,但是

WKWebView
只会尝试加载它,而不是将其从 Web 视图定向到本机应用程序来处理。

为了处理重定向,您需要在

decidePolicyForNavigationAction
WebPolicyDelegate
中实现
WKWebView
来检测自定义 URL 方案并将其定向到要处理的应用程序:

func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: ((WKNavigationActionPolicy) -> Void)) {
        print("webView:\(webView) decidePolicyForNavigationAction:\(navigationAction) decisionHandler:\(decisionHandler)")

        let app = UIApplication.sharedApplication()
        let url = navigationAction.request.URL
        let myScheme: NSString = "https"
        if (url!.scheme == myScheme) && app.canOpenURL(url!) {
            print("redirect detected..")
            // intercepting redirect, do whatever you want
            app.openURL(url!) // open the original url
            decisionHandler(.Cancel)
            return
        }

        decisionHandler(.Allow)
    }

您可以在这里找到详细信息


0
投票

我已经安装了 Etsy 应用程序,并确认在 Safari 中搜索“etsy”并点击第一个结果 (etsy.com) 将启动 Etsy 应用程序。

我在 Xcode 中创建了一个测试“单视图应用程序”,并将以下行添加到

ViewController
的 viewDidLoad 中:

 override func viewDidLoad() {
     super.viewDidLoad()

     let webView = WKWebView(frame:view.bounds, configuration: WKWebViewConfiguration())
     view.addSubview(webView)
     webView.loadRequest(NSURLRequest(URL: NSURL(string: "https://www.google.com")!))
}

搜索 etsy 并单击第一个结果后,我会在测试应用程序中转到 etsy.com(不会跳转到 Etsy 应用程序)。

您在代码中是否做了其他可能导致 WKWebView 允许重定向的操作?


0
投票

不幸的是,由于通用链接,您不能再依赖

url.scheme
来检测链接何时在另一个应用程序中打开。然而,亚历山德罗·奥尔纳诺 (Alessandro Ornano) 首次在此描述的技术似乎仍然有效。 (我在 iOS 17 的 Xcode 14.3.1 中编写此内容。)

这是我在类中使用的代码片段,它实现了

WKNavigationDelegate

    func webView(
        _ webView: WKWebView,
        decidePolicyFor navigationAction: WKNavigationAction,
        decisionHandler: ((WKNavigationActionPolicy) -> Void)
    ) {
        if navigationAction.navigationType == .linkActivated,
           let url = navigationAction.request.url,
           case let urlString = url.absoluteString,
           urlShouldNotRedirect(urlString: urlString) {
            service.logger.info("found URL to not redirect: '\(urlString)', attempting to open in-app.")
            decisionHandler(.cancel)
            webView.load(navigationAction.request)
            return
        }
        decisionHandler(.allow)
    }

请注意,如果我们不检查

navigationAction.navigationType
,当网址不是刚刚单击的网址时,这将导致无限重定向。 (谷歌的搜索结果经常出现这种情况,至少在我的测试中是这样。)

显然,

urlShouldNotRedirect()
返回一个布尔值,表示我是否允许从给定的
url.absoluteString
进行重定向。


-3
投票

在正常情况下,WKWebView 不应打开第 3 方应用程序而不是访问网站 - 但我知道有 2 个例外

  • 如果您已在
    WKNavigationDelegate
    处理程序中显式插入一些代码来打开第 3 方应用程序
  • 如果 iOS 工作不正常(重新启动设备进行修复)- 似乎存在一个错误,它偶尔会产生您所描述的行为(在 iOS10.2 中观察到)
© www.soinside.com 2019 - 2024. All rights reserved.