UIWebView 请求上的自定义 http 标头导致后退按钮中断



我使用以下代码将自定义 http 标头注入我的 UIWebView 请求中:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        let headerFields = request.allHTTPHeaderFields
        var headerIsPresent = contains(request.allHTTPHeaderFields?.keys.array as [String], "X-Test-App")
        if headerIsPresent || navigationType == UIWebViewNavigationType.Other {
            return true
        } else {
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
                dispatch_async(dispatch_get_main_queue(), {
                    let url = request.URL
                    var newRequest: NSMutableURLRequest = request as NSMutableURLRequest
                    // set new header
                    newRequest.addValue("MyValue", forHTTPHeaderField: "X-Test-App")
                    // reload the request
                    self.webView.loadRequest(newRequest)
                })
            })
            return false
        }
    }

问题是后退按钮历史记录未保留。因此,如果我点击 3 个请求深度。回击时,它只会转到上一页,然后再次回击将导致它返回到您刚刚返回的页面。这基本上是 2 个最新请求之间的无限循环。知道如何修改上面的代码以保留整个网络历史记录并允许后退/前进按钮按预期运行吗?

问题是UIWebView的内置goBack()只返回1页,但是通过拦截loadRequest并将其替换为新请求,webView将其视为历史记录中的新第二项。因此,需要做更多的工作来结合 1) UIWebview 内置历史记录,2) UIWebView goBack() 和 3) 这种拦截加载请求的方法。

调用goBack()的按钮可以调用goBack()两次 - 如果在同一个代码块中,我假设UIWebView会跳转到历史记录中的第二项。但这在其他方面是脆弱的,不推荐。

您可以创建一堆未修改的请求。设置一个数组,并在创建新请求之前调用 append() 以添加未修改的请求。但首先,对于每个未修改的请求,检查它是否是数组中的最后一个 Object。如果是这样,他们可能想要在此之前的那个,所以从数组的末尾删除它,并使用新的 lastObject 创建一个修改后的请求。

最新更新