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

时间:2015-01-20 17:08:02

标签: ios swift uiwebview nsurlrequest

我使用以下代码将自定义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个请求之间的无限循环。知道如何修改上面的代码,以便能够保持整个网络历史记录并允许后退/前进按钮按预期运行吗?

1 个答案:

答案 0 :(得分:0)

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

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

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