【问题标题】:Prevent universal links from opening in `WKWebView`/`UIWebView`防止通用链接在 `WKWebView`/`UIWebView` 中打开
【发布时间】:2016-11-21 21:06:36
【问题描述】:

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

这在Apple Search Programming Guide中有描述

如果您实例化 SFSafariViewController、WKWebView 或 UIWebView 对象来处理通用链接,iOS 会在 Safari 中打开您的网站,而不是打开您的应用程序。但是,如果用户从嵌入式 SFSafariViewController、WKWebView 或 UIWebView 对象中点击通用链接,iOS 会打开您的应用。

在我的应用程序中,我有一个 WKWebView,但我不希望用户离开我的应用程序。我想处理我的WKWebView 中的链接。

如何防止通用链接打开?或者我可以知道一个 URL 是否可以被其他应用处理?

【问题讨论】:

    标签: ios uiwebview wkwebview


    【解决方案1】:

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

    可以查看LSAppLink头文件here

    【讨论】:

    • 对文档的引用无效
    【解决方案2】:

    WebKit 的源代码:

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

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

    【讨论】:

    • hk.saowen.com/a/… 这个博客对此有更详细的说明。以及我们的申请方式:func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { return decisionHandler((WKNavigationActionPolicy(rawValue: WKNavigationActionPolicy.allow.rawValue + 2)!)) }
    • 这是否被视为私有 API 调用?这意味着使用它可能会立即被 App Store 拒绝,对吧?
    • 强烈建议不要使用magic numbers — 可能会在未来的 iOS 版本中引起问题
    • 强烈建议不要使用magic numbers — 可能会在未来的 iOS 版本中引起问题
    【解决方案3】:

    基于@none 的回答,这里是 Swift 4 的示例

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

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

    【讨论】:

    • 不再适用于 iOS 11。此外,它是私有 API。
    【解决方案4】:

    你可以试试这个吗?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多