返回

突破壁垒:赋能 WKWebView 使用 window.open

IOS

为 WKWebView 赋能:巧妙应对 window.open() 挑战

在应用程序开发的浩瀚海洋中,我们经常面临在应用程序内打开新窗口或标签页的情景。WebKit 作为 macOS 和 iOS 应用程序的默认 Web 渲染引擎,提供了广泛的功能,其中包括使用 window.open() 方法打开新窗口。

然而,实现这一看似简单的任务并不轻松。在 WKWebView 中启用 window.open() 需要巧妙地绕过某些限制,同时确保您的代码符合平台准则。本文将深入探讨如何为 WKWebView 赋能,让其支持 window.open() 方法,并提供分步指南和实用示例,帮助您应对这一挑战。

window.open() 的本质

window.open() 是一种 JavaScript 方法,允许您在当前窗口或标签页之外打开一个新窗口或标签页。它接受三个参数:

  • URL: 您想要打开的新页面或文档的 URL。
  • target: 指定新页面或文档应在哪个窗口或标签页中打开。
  • 特征: 指定新窗口或标签页的特性,例如大小、位置和功能(例如工具栏和状态栏)。

WKWebView 中 window.open() 的限制

默认情况下,WKWebView 限制使用 window.open() 方法。这是出于安全考虑,因为恶意网站可能利用此功能打开弹出窗口或将用户重定向到不受信任的网站。

启用 WKWebView 中的 window.open()

要启用 WKWebView 中的 window.open(),请按照以下步骤操作:

  1. 创建 WKWebView 实例: 创建 WKWebView 实例并将其委托给自定义的 WKNavigationDelegate。
  2. 实现 WKNavigationDelegate 方法: 实现 decidePolicyFor navigationAction:decisionHandler: 方法。在此方法中,检查导航动作是否为 window.open() 调用。
  3. 创建新的 WKWebView 实例: 如果导航动作是 window.open() 调用,则创建一个新的 WKWebView 实例,并使用传入的 URL 和特征参数加载请求。
  4. 呈现新 WKWebView: 将新创建的 WKWebView 实例添加到应用程序的视图层次结构中。

代码示例

以下代码示例展示了如何在 WKWebView 中实现 window.open() 方法:

import WebKit

class CustomWKNavigationDelegate: WKNavigationDelegate {
    
    func decidePolicy(for navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if navigationAction.navigationType == .other {
            guard let url = navigationAction.request.url else {
                decisionHandler(.cancel)
                return
            }
            
            if url.absoluteString.contains("window.open") {
                let newWebView = WKWebView()
                newWebView.load(navigationAction.request)
                
                // 将新创建的 WKWebView 实例添加到视图层次结构中
                self.present(newWebView, animated: true, completion: nil)
                
                decisionHandler(.cancel)
                return
            }
        }
        
        decisionHandler(.allow)
    }
}

结论

通过遵循本指南,您可以让 WKWebView 支持 window.open() 方法,从而为您的 Web 应用程序添加新窗口或标签页的功能。请注意,在实施此技术时,确保遵守平台准则并考虑安全性影响非常重要。通过谨慎实施,您可以在应用程序中无缝地打开新窗口或标签页,从而增强用户体验并提高应用程序的功能。

常见问题解答

  1. 为什么 WKWebView 默认限制 window.open() 方法?

    这是出于安全考虑,以防止恶意网站滥用该功能。

  2. 在启用 window.open() 之前需要考虑哪些安全隐患?

    您需要确保只允许受信任的网站调用 window.open(),并采取措施防止弹出窗口或重定向到不受信任的网站。

  3. 除了使用自定义 WKNavigationDelegate 之外,还有其他方法可以启用 window.open() 吗?

    没有其他方法可以启用 window.open()。

  4. 新创建的 WKWebView 实例是否会继承父视图的特征?

    不会。您需要使用特征参数指定新创建的 WKWebView 实例的特征。

  5. 是否可以控制新窗口或标签页在屏幕上的位置?

    可以。在创建新 WKWebView 实例时,您可以指定其框架大小和位置。