goBack() 方法在 swift iOS 中的 WKWebView 中无法正常工作

问题描述 投票:0回答:1

我正在一个应用程序中工作,我需要在按下由网络本身设置的后退按钮时返回网络视图。 从网络上,按下后退时我收到一个 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 事件并调用上述函数。但后退功能无法正常工作。

  • 第一次按后退按钮,没有任何反应。 (控制进入 if 条件
    webView?.canGoBack ?? false
  • 第二次按返回按钮,没有任何反应。 (控制进入 if 条件
    webView?.canGoBack ?? false
  • 第三次按返回按钮,控制器关闭。 (控制不进入if条件
    webView?.canGoBack ?? false

我在 StackOverflow 上检查了其他解决方案,建议使用

webView.stopLoading()
,但这对我来说也不起作用。

规格:

  • Xcode:14.1
  • 测试:iPhone 11 (15.0)(模拟器)(注意:即使在设备中也不起作用)

编辑***

客户要求我们必须在每个请求中传递 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后退导航失败的原因。

提前致谢!

ios swift webview back
1个回答
0
投票

尝试使用 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)
}
© www.soinside.com 2019 - 2024. All rights reserved.