我使用以下代码将自定义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个请求之间的无限循环。知道如何修改上面的代码,以便能够保持整个网络历史记录并允许后退/前进按钮按预期运行吗?
答案 0 :(得分:0)
问题在于UIWebView的内置goBack()仅返回1页,但是通过拦截loadRequest并将其替换为新请求,webView将其视为历史记录中的新第二项。因此需要做更多的工作来组合1)UIWebview内置历史记录,2)UIWebView goBack(),以及3)这种拦截加载请求的方法。
调用goBack()的按钮只能调用goBack()两次 - 如果在同一个代码块中,我假设UIWebView会跳转到历史记录中的第二个项目。但这在其他方面很脆弱,不推荐。
您可以创建一堆未修改的请求。设置一个数组,并在创建新数组之前调用append()添加未修改的请求。但首先,对于每个未修改的请求,检查它是否是数组中的lastObject。如果是这样,他们可能想要之前的那个,所以从数组的末尾删除它并使用新的lastObject创建一个修改过的请求。