В моем приложении для iPhone встроен UIWebView, который загружает html через пользовательский обработчик NSProtocol, который я зарегистрировал.
Моя проблема в том, что ресурсы, на которые есть ссылки в возвращенном html, которые также загружаются через мой обработчик пользовательских протоколов, кэшируются и никогда не перезагружаются. В частности, моя таблица стилей кэшируется:
<link rel="stylesheet" type="text/css" href="./styles.css" />
Первоначальный запрос на загрузку html в UIWebView выглядит следующим образом:
NSString* strUrl = [NSMutableString stringWithFormat: @"myprotocol:///entry?id=%d", entryID ];
NSURL* url = [NSURL URLWithString: strUrl];
[_pCurrentWebView loadRequest: [NSURLRequest requestWithURL: url cachePolicy: NSURLRequestReloadIgnoringLocalCacheData timeoutInterval: 60 ]];
(обратите внимание, что политика кэширования настроена на игнорирование, и я убедился, что эта политика кэширования распространяется на последующие запросы ресурсов страницы при начальной загрузке)
Обработчик протокола загружает html из базы данных и возвращает его клиенту, используя следующий код:
// create the response record
NSURLResponse *response = [[NSURLResponse alloc] initWithURL: [request URL] MIMEType: mimeType expectedContentLength: -1 textEncodingName: textEncodingName];
// get a reference to the client so we can hand off the data
id client = [self client];
// turn off caching for this response data
[client URLProtocol: self didReceiveResponse:response cacheStoragePolicy: NSURLCacheStorageNotAllowed];
// set the data in the response to our jfif data
[client URLProtocol: self didLoadData:data];
[data release];
(обратите внимание, что политика кэширования ответов "не разрешена").
Любые идеи, как я могу сделать это НЕ кэшировать мой ресурс styles.css? Мне нужно иметь возможность динамически изменять содержимое этого ресурса при последующих загрузках HTML, который ссылается на этот файл.
Я думал, что очистка общего кэша URL будет работать, но это не так:
[[NSURLCache sharedURLCache] removeAllCachedResponses];
Одна вещь, которая работает, но ужасно неэффективно, это динамически кэшировать и очищать URL для таблицы стилей, добавляя параметр timestamp:
<link rel="stylesheet" type="text/css" href="./styles.css?ts=1234567890" />
Чтобы сделать это, я должен загрузить свой HTML из базы данных, найти и заменить URL таблицы стилей параметром очистки кэша, который изменяется при каждом запросе. Я бы предпочел не делать этого.
Я предполагаю, что нет проблем, если бы я загружал свой контент по встроенному протоколу HTTP. В этом случае я предполагаю, что UIWebView просматривает любые флаги Cache-Control в http-заголовках объекта NSURLHTTPResponse и соблюдает их. Поскольку мой NSURLResponseObject не имеет заголовков http (это не http ...), возможно, UIWebView просто решит кэшировать ресурс (игнорируя директиву кэширования NSURLRequest?).
Идеи ???