返回

巧用 WebKit 检测页面切换:解密位置标识符奥秘

IOS

背景

在使用 WKWebView 加载页面时,通常可以通过代理方法来感知页面切换的时机,例如:

  • -webView:didFinishNavigation: :当页面加载完成时调用。
  • -webView:didFailNavigation: :当页面加载失败时调用。

但是,当通过更改页面哈希来打开新页面时,这些代理方法不会被调用。这是因为哈希更改不会触发新的页面加载请求,因此 WebKit 不会将其视为页面切换。

巧妙的解决方案

为了解决这一限制,我们可以利用以下巧妙的方法:

  1. 监听 URL 变化: 哈希更改会影响页面的 URL。因此,我们可以通过监听 URL 变化来检测页面切换。
  2. 拦截 URL 请求: 当用户单击链接或输入新哈希时,WebKit 会发出 URL 请求。我们可以拦截这些请求,并在发送到服务器之前修改它们。

实施步骤

要实施此解决方案,我们可以按照以下步骤进行:

  1. 创建一个自定义 WKNavigationDelegate 子类: 该子类将覆盖 -webView:shouldAllowNavigation: 方法,以拦截 URL 请求。
  2. 使用 KVO 监听 URL 属性: 这将使我们能够在 URL 更改时收到通知。
  3. 修改 URL 请求:-webView:shouldAllowNavigation: 方法中,我们可以检查 URL 是否已更改,如果是,则修改 URL 请求。

代码示例:

import WebKit

class CustomWKNavigationDelegate: WKNavigationDelegate {

    override func webView(_ webView: WKWebView, shouldAllowNavigation url: URL, navigationType: WKNavigationType) -> Bool {
        if url.hash != webView.url?.hash {
            // 哈希已更改,修改 URL 请求
            var request = webView.urlRequest
            request.url = url
            webView.load(request)
            return false
        }
        return true
    }

}

优点

这种方法具有以下优点:

  • 可靠: 它直接监听 URL 变化,因此不会错过任何页面切换。
  • 灵活: 我们可以自定义拦截和修改 URL 请求的方式,以满足特定的需求。
  • 高效: 它只会在 URL 更改时执行,因此不会对性能产生重大影响。

结论

通过巧妙地监听 URL 变化和拦截 URL 请求,我们可以扩展 WebKit 的功能,以检测通过哈希更改进行的页面切换。这为我们提供了更全面的感知页面切换的方式,从而可以构建更具响应性和用户友好的 Web 应用。