我正在一个应用程序中工作,我需要在按下由网络本身设置的后退按钮时返回网络视图。 从网络上,按下后退时我收到一个 JS 事件,下面是我在 web 视图中单击后退按钮时处理的代码。
func goBackInWebView(_ webView: WKWebView?) {
if webView?.canGoBack ?? false {
webView?.goBack()
return
}
close() //this line just dismisses/pops the controller based on the controller presentation.
}
现在,当我在 WebView 中打开任何内容时,WebView 的另一个页面将打开,并且后退按钮可见。当我按下后退按钮时,会触发 JS 事件并调用上述函数。但后退功能无法正常工作。
webView?.canGoBack ?? false
)webView?.canGoBack ?? false
)webView?.canGoBack ?? false
)我在 StackOverflow 上检查了其他解决方案,建议使用
webView.stopLoading()
,但这对我来说也不起作用。
规格:
编辑***
客户要求我们必须在每个请求中传递 webview 中的自定义标头(我们发出的请求和 webview 发出的请求)。
为了解决这个问题,我添加了
decidePolicyFor
方法来将自定义标头传递给 webview 发出的请求。
下面是代码。
override func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
self.currentLoadedUrl = navigationAction.request.url
let requestHeaders = navigationAction.request.allHTTPHeaderFields ?? [:]
if (navigationAction.navigationType == .linkActivated || navigationAction.navigationType == .backForward),
requestHeaders["header_key1"] == nil || requestHeaders["header_key2"] == nil,
let currentUrl = navigationAction.request.url,
currentUrl != self.getInitialUrl() {
decisionHandler(.cancel)
var request = URLRequest(url: currentUrl)
request.setValue("header_value1", forHTTPHeaderField: "header_key1")
request.setValue("header_value2", forHTTPHeaderField: "header_key2")
webView.load(request)
} else {
return super.webView(webView, decidePolicyFor: navigationAction, decisionHandler: decisionHandler)
}
}
添加上述条件是因为自定义标头在 Web 视图的每个后续请求中无法正常工作。
现在我假设这可能是webview后退导航失败的原因。
提前致谢!
尝试使用 WebKit,
导入WebKit
let configuration = WKWebViewConfiguration()
webView = WKWebView(frame: view.bounds, configuration: configuration)
webView.navigationDelegate = self // Set the navigation delegate
view.addSubview(webView)
// Load your initial URL in the webView
if let url = URL(string: "https://your-initial-url.com") {
let request = URLRequest(url: url)
webView.load(request)
}
并且在
WKNavigationDelegate
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
if navigationAction.navigationType == .backForward {
if webView.canGoBack {
webView.goBack() // Go back in the WebView's navigation history
decisionHandler(.cancel) // Cancel the default action
return
}
}
decisionHandler(.allow) // Allow the default action (i.e., load the new page)
}