我的iOS UIWebView页面基于Cordova开源框架,我想在其webview URL请求中添加一些自定义http标头,我的解决方案是将它们添加到以下UIWebView委托方法中。
Debug显示标题已成功添加,但实际上请求并未将它们删除。使用Wireshark捕获网络数据包,发现只有标准标头可用,没有我的自定义标头。
我的测试基于模拟器(iOS 7.1),任何有此主题经验的人都请提前共享和讨论。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
// Add customize http headers in UIWebView request
if([request isKindOfClass:[NSMutableURLRequest class]]) {
NSMutableURLRequest * mRequest = (NSMutableURLRequest *)request;
[mRequest setValue:@"1.1" forHTTPHeaderField:@"appVersion"];
[mRequest setValue:@"iPhone 4S" forHTTPHeaderField:@"deviceModel"];
}
return [super webView:webView shouldStartLoadWithRequest:request navigationType:navigationType];
}
答案 0 :(得分:15)
我知道它很晚但可能会帮助SWIFT 3.0的其他人
let weburl = NSURL(string: "http://www.mywebsite.com")
let request = NSMutableURLRequest(URL: weburl!)
request.setValue("HEADER_VALUE", forHTTPHeaderField:"HEADER_NAME")
myWebView.loadRequest(request)
答案 1 :(得分:4)
有时,即使分配了所有http标头,也不会设置Cookie。最好创建可变请求并复制您的nsurlrequest并向其添加自定义标头,以便原始请求中的所有信息都保留在可变请求中。
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType
{
if(check if key not present){
NSMutableURLRequest *re = [[NSMutableURLRequest alloc] init];//alloc init not required
re = (NSMutableURLRequest *) request.mutableCopy;
[re setValue:@"Your Custom Value" forHTTPHeaderField:@"Yout Custom Header"];
[webView loadRequest:re] ;
return NO;
}
return YES;
}
答案 2 :(得分:3)
您有两种选择:在开始时创建NSMutableUrlRequest并使用webView loadReqest加载,或者使用NSURLProtocol接管应用的完整网址加载。
最简单的方法是首选,因为它只有一行额外代码:
[webView loadRequest:mRequest];
第二种选择使用NSURLProtocol来接管您应用的网址加载。这涉及使用创建具体类来注册自己的解决方案。覆盖的主要方法是canonicalRequestForRequest
。
我建议您查看这两个教程NSNipster和raywenderlich以获取指南。
答案 3 :(得分:0)
纯 Swift 4合规性答案应如下所示:
if let anURL = URL(string: aString) {
var aRequest = URLRequest(url: anURL, cachePolicy: .reloadIgnoringCacheData, timeoutInterval: 5.0)
if let tmpToken = Network.shared.getAuthenticationToken() {
aRequest.setValue(tmpToken, forHTTPHeaderField: "Authorization")
}
self.loadRequest(aRequest)
}
其中 cachePolicy , timeoutInterval 将根据您的需要进行设置,以及if let语句,以便在请求中插入假设的令牌。
此处的相关部分是您在URLRequest上设置其他参数的方式。无需再使用 Mutable 语句。 var 是您继续使用网址请求。
答案 4 :(得分:0)
Swift 5.2解决方案
通过制作URLRequest
和setValue
@IBOutlet var wkWebView: WKWebView!
let url = URL(string: "https://YouAreBest.com")
var request = URLRequest(url: url!)
request.setValue("1", forHTTPHeaderField:"userid")
wkWebView.load(request)