Как добавить настраиваемые заголовки HTTP в запросе UIWebView, мой UIWebView основан на проекте Cordova?

Моя страница iOS UIWebView основана на платформе Cordova с открытым исходным кодом, и я хочу добавить некоторые настраиваемые заголовки http в свой URL-запрос веб-просмотра, мое решение - добавить их в следующем методе делегата UIWebView.

Отладка показывает, что заголовки успешно добавлены, но на самом деле запрос не выводит их. Использование 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];
}

4 ответа

Решение

У вас есть два варианта: либо создать NSMutableUrlRequest в начале и загрузить его с помощью webView loadReqest, либо взять на себя полную загрузку URL вашего приложения с помощью NSURLProtocol.

Самый простой способ - это первый выбор, поскольку он содержит только одну дополнительную строку кода:

[webView loadRequest:mRequest];

Второй вариант использует NSURLProtocol для загрузки URL вашего приложения. это включает в себя регистрацию вашего собственного решения с использованием создания конкретного класса. основной метод для переопределения canonicalRequestForRequest,

Я предлагаю вам взглянуть на эти два руководства NSNipster и Raywenderlich для руководства.

Я знаю, что уже поздно, но может помочь другим для 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)

Иногда файлы cookie не устанавливаются даже после назначения всех заголовков http. Лучше создать изменяемый запрос, скопировать ваш 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;

}

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)

чистый ответ соответствия 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. Больше не нужно использовать изменяемое выражение. var - это то, что вы идете по URLRequest.

Другие вопросы по тегам