Как получить запрос UIWebView изнутри NSURLProtocol - PullRequest
4 голосов
/ 30 июля 2010

Мое приложение использует подклассы NSURLProtocol. В приложении есть несколько UIWebView, и для конкретного алгоритма, реализованного в NSURLProtocol, мне нужно знать, какой из UIWebView отправляет запрос.

Насколько я понимаю, объект, возвращаемый [собственным клиентом], должен быть в некоторой степени связан с запрашивающим объектом. Но ни NSURLProtocolClient (то есть протокол, реализованный объектом, возвращаемым [self client]), ни базовый объект _NSCFURLProtocolBridge не имеют никаких свойств / методов для получения отправителя запроса.

Может кто-нибудь помочь мне с идеями?

Ответы [ 5 ]

3 голосов
/ 15 марта 2012

NSURLRequest имеет метод с именем mainDocumentURL, который возвращает URL корневого документа. Вы можете сохранить это в методе UIWebViewDelegate, например,

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
   if([[request.URL absoluteString] isEqualToString:[request.mainDocumentURL absoluteString]]) 
   {
      // associate this URL with this UIWebview
   }
}

Затем вы можете взглянуть на mainDocumentURL в ваших NSURLProtocol методах, чтобы определить UIWebView. Это не является надежным доказательством, поскольку не учитывает случаи, когда несколько UIWebViews загружают один и тот же URL. Но это лучшее решение, которое я мог придумать.

1 голос
/ 01 ноября 2013

См. https://stackoverflow.com/a/19700910/502149. Подводя итог, вы можете установить пользовательский агент для каждого UIWebView, прежде чем создавать его с использованием пользовательских настроек по умолчанию.Поскольку в представлении не учитываются последующие изменения пользовательского агента, в каждом UIWebView вы получите отдельный пользовательский агент.Вы можете использовать это в NSURLProtcol для идентификации представления, и вы можете передать реального агента UA, чтобы сервер не видел никакой разницы.

Обратите внимание, что для UIWebView нужно «запомнить»Настройка строки UA, она должна сделать как минимум один запрос до изменения настройки.

0 голосов
/ 31 марта 2016
- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

Запрос имеет изменяемый тип. Так что вы можете использовать
+[NSURLProtocol setProperty:forKey:inRequest:], чтобы установить пользовательское свойство. А +[NSURLProtocol propertyForKey:inRequest] изнутри NSURLProtocol

0 голосов
/ 08 ноября 2011

в loadRequest:

static NSString* ProtocolClient=@"urAPP_ProtocolClient";

    NSMutableURLRequest* Request=[request mutableCopy];
    [Request setValue:[NSString stringWithFormat:@"someID",self.someID] forHTTPHeaderField:ProtocolClient];

в протоколе:

NSString* header=[_currentRequest valueForHTTPHeaderField:ProtocolClient];

if (header) {
0 голосов
/ 09 июня 2011

В идеале, вам не нужно ссылаться на UIWebView непосредственно из NSURLProtocol. Однако в прошлом мне нужно было отправлять NSURLProtocol сообщения в UIWebView, которые находятся за пределами сообщений обычного делегата ... использовать NSNotificationCenter, я отправляю уведомления, используя объект NSURLRequest в качестве объекта, и подписываюсь на эти уведомления на интересующие меня слушатель.

...