返回
巧用 WebKit 检测页面切换:解密位置标识符奥秘
IOS
2023-09-30 19:03:17
背景
在使用 WKWebView 加载页面时,通常可以通过代理方法来感知页面切换的时机,例如:
-webView:didFinishNavigation:
:当页面加载完成时调用。-webView:didFailNavigation:
:当页面加载失败时调用。
但是,当通过更改页面哈希来打开新页面时,这些代理方法不会被调用。这是因为哈希更改不会触发新的页面加载请求,因此 WebKit 不会将其视为页面切换。
巧妙的解决方案
为了解决这一限制,我们可以利用以下巧妙的方法:
- 监听 URL 变化: 哈希更改会影响页面的 URL。因此,我们可以通过监听 URL 变化来检测页面切换。
- 拦截 URL 请求: 当用户单击链接或输入新哈希时,WebKit 会发出 URL 请求。我们可以拦截这些请求,并在发送到服务器之前修改它们。
实施步骤
要实施此解决方案,我们可以按照以下步骤进行:
- 创建一个自定义
WKNavigationDelegate
子类: 该子类将覆盖-webView:shouldAllowNavigation:
方法,以拦截 URL 请求。 - 使用
KVO
监听URL
属性: 这将使我们能够在 URL 更改时收到通知。 - 修改 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 应用。