Как получить запрос UIWebView изнутри NSURLProtocol

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

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

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


person okonov    schedule 29.07.2010    source источник


Ответы (5)


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. Но это лучшее решение, которое я мог придумать.

person Pradeep    schedule 15.03.2012

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

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

person Matthew Gertner    schedule 01.11.2013

в 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) {
person myeyesareblind    schedule 08.11.2011
comment
Я, конечно, могу различать запросы, которые создаю явно. Вопрос касался запросов на ссылочные ресурсы (например, изображения, файлы сценариев и т. д.), которые UIWebView отправляет сам. Спасибо, в любом случае. - person okonov; 01.02.2012

- (BOOL)webView:(UIWebView *)aWebView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

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

person None    schedule 31.03.2016

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

person BadPirate    schedule 09.06.2011