我使用以下代码将自定义 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 创建一个修改后的请求。