Файлы cookie не работают в UIWebView, отображающем «локальный контент» - PullRequest
1 голос
/ 18 февраля 2011

Существует множество потоков об использовании UIWebView с кэшами и / или файлами cookie, но, похоже, все они связаны с удаленными URL-адресами.

Я не могу заставить файлы cookie работать при «отображении локального контента» (как его называют в документах iPhone).

Например, если я загружаю простой старый HTML-файл из моего ресурса пакета:

     - (void) viewDidLoad {
        [super viewDidLoad];

        NSString* path = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
        NSURL* url = [NSURL fileURLWithPath:path];
        NSData* data = [NSData dataWithContentsOfFile:path];
        [web loadData:data MIMEType:@"text/html" textEncodingName:@"us-ascii" baseURL:url];
    }

, то:

    - (void) webViewDidFinishLoad:(UIWebView*)webView {
        NSString* result = [web stringByEvaluatingJavaScriptFromString:
                            @"try{document.cookie='name=value';''+document.cookie;}catch(e){''+e}"];
        NSLog(@"Result = '%@'", result);
    }

Результат:

    Result = ''

Установка URL-адреса в качестве действительного имени файла, а не каталога не позволяет получить: Result = 'Error: SECURITY_ERR: DOM Exception 18', но файлы cookie, похоже, не сохраняются.

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

Я нашел удовлетворительное решение.Указав реальный URL-адрес, такой как http://localhost/..., а затем перехватив загрузку, создав подкласс класса NSURLCache, для извлечения фактического локального содержимого.

- (NSCachedURLResponse*) cachedResponseForRequest:(NSURLRequest *)request {
    NSString* path = [[request URL] path];

    NSData* data = [... get content of local file ...];

    NSURLResponse *response = [[NSURLResponse alloc] 
                               initWithURL:[request URL]
                               MIMEType:[self mimeTypeForPath:path]
                               expectedContentLength:[data length]
                               textEncodingName:nil];

    NSCachedURLResponse* cachedResponse = [[NSCachedURLResponse alloc] 
                                           initWithResponse:response 
                                           data:data];
    [response release];

    return [cachedResponse autorelease];
}
2 голосов
/ 18 февраля 2011

Хорошо, вы можете проверить Ссылка класса NSHTTPCookieStorage .Но если вы используете webView для локального контента, какова цель использования файлов cookie?Почему бы просто не сохранить эту информацию другим способом в вашем приложении?

1 голос
/ 04 мая 2011

Если ваша цель - сохранить данные в UIWebView, вы также можете использовать window.localStorage.Это хеш-таблица, в которой вы можете хранить макс.5 МБ строковых данных.

например,

window.localStorage['highscore_level_1']='12000';

alert(window.localStorage['highscore_level_1']);

Я успешно использовал это для реализации таблицы рекордов в приложении для iPhone на основе UIWebView.

...