Загрузка ресурсов из относительных путей через подкласс NSURLProtocol

У меня есть NSURLProtocol, зарегистрированный для приложения на основе UIWebView, настроенного для ответа на запросы file схемы.

В веб-представлении загружаются изображения, CSS, JS и т. Д., И все это работает нормально; проблема возникает, когда я пытаюсь ссылаться на изображение в файле CSS, который не находится в корневом каталоге дерева HTML. Например

 <html> <head> <style type="text/css"> .1 { background-image: url("1.png"); } </style> <link href="css/style.css" rel="stylesheet" type="text/css" /> <!-- contents of css/style.css might be: .2 { background-image: url("../2.png"); } --> </head> <body> <div class="1">properly styled</div> <div class="2">not styled</div> </body> </head> 

Глядя на запросы, поступающие на мой NSURLProtocol, я не вижу способа определить, где в моем исходном дереве сидит запрашивающий файл.

Например, если вышеуказанный HTML был в файле source/index.html , мой подкласс NSURLProtocol получил бы запрос на ../2.png из ../2.png source/css/style.css .

Это должно решить source/2.png , но я не могу сказать, что должен быть такой подкаталог css включен в путь.

Есть ли способ получить больше контекста относительно источника запроса, так что я исправлю пути, когда я ищу запрошенный файл?

У меня была очень похожая проблема, поясняемая здесь: Загрузка ресурсов из относительных путей через подкласс NSURLProtocol

В моем NSURLProtocol меня было следующее:

 - (void)startLoading { [self.client URLProtocol:self didReceiveResponse:[[NSURLResponse alloc] init] cacheStoragePolicy:NSURLCacheStorageNotAllowed]; //Some other stuff } 

и решил проблему следующим образом:

 - (void)startLoading { [self.client URLProtocol:self didReceiveResponse:[[NSURLResponse alloc] initWithURL:_lastReqURL MIMEType:nil expectedContentLength:-1 textEncodingName:nil] cacheStoragePolicy:NSURLCacheStorageNotAllowed]; //Some other stuff } 

Где _lastReqURL – _lastReqURL = request.URL; , из

 - (id)initWithRequest:(NSURLRequest *)request cachedResponse:(NSCachedURLResponse *)cachedResponse client:(id < NSURLProtocolClient >)client { self = [super initWithRequest:request cachedResponse:cachedResponse client:client]; if (self) { _lastReqURL = request.URL; // Some stuff } } 

Я могу только предположить, что часть URL в NSURLResponse имеет решающее значение при работе с относительными путями (кажется логичным).

Interesting Posts
Давайте будем гением компьютера.