проблема с кастомным NSProtocol и кешированием на iPhone - PullRequest
2 голосов
/ 11 марта 2010

В моем приложении для 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?).

Идеи ???

...