NSCachedURLResponse возвращает объект, но UIWebView не интерпретирует контент

Я отправляю запрос в UIWebView. На загруженной странице есть AJAX-вызовы. Мне нужно проанализировать AJAX-трафик, чтобы определить, вошел ли пользователь в систему или нет. Для этого я установил NSURLCache в AppDelegate:

MYURLCache *cache = [[MYURLCache alloc] init];
[NSURLCache setSharedURLCache:cache];

Этот класс MYURLCache правильно принимает трафик, который проходит через веб-просмотр. Я могу завершить только AJAX-вызовы. Затем я создаю собственный запрос AJAX-вызовов. Он возвращает отличный ответ от веб-сервера. Итак, последний шаг, который нужно сделать сейчас, - это создать объект возврата NSCachedURLResponse. Мне тоже это удалось, но веб-просмотр просто ничего не делает при возврате объектов. Если я верну только nil, WebView загрузит все нормально (nil - это сообщение для NSURLCache, что ничего не кэшируется, поэтому веб-просмотр должен начать загружать его самостоятельно).

- (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
    if ([[[request URL] absoluteString] rangeOfString:@"/ajax/"].location == NSNotFound) {
        return nil;
    } else {

    ASIHTTPRequest *asirequest = [ASIHTTPRequest requestWithURL:[request URL]];
    [asirequest setValidatesSecureCertificate:NO];
    [asirequest startSynchronous];
    NSError *error = [asirequest error];
    NSData* data = [[asirequest responseString] dataUsingEncoding:NSUTF8StringEncoding];

    // Create the cacheable response
    NSURLResponse *urlresponse = [[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"application/json" expectedContentLength:[data length] textEncodingName:@"UTF-8"];
    NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data];

    NSLog(@"cachedResponse %@", cachedResponse);
    NSLog(@"cachedResponse data %@", [[NSString alloc] initWithData:[cachedResponse data] encoding:NSUTF8StringEncoding]);

    return cachedResponse;
}  

return nil;
}

person nodepond    schedule 06.03.2013    source источник


Ответы (1)


Я нашел одно решение этой проблемы ... Я думаю, это как-то связано с отсутствующими заголовками.

Если я заменю

NSURLResponse *urlresponse = [[NSURLResponse alloc] initWithURL:[request URL] MIMEType:@"application/json" expectedContentLength:[data length] textEncodingName:@"UTF-8"];
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data];

С участием

NSHTTPURLResponse *urlresponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.1" headerFields:nil];
NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] initWithResponse:urlresponse data:data];

Все работает. В этом ответе дополнительно предлагается дополнительный настраиваемый заголовок запроса. https://stackoverflow.com/a/15234850/274518

NSDictionary *headers = @{@"Access-Control-Allow-Origin" : @"*", @"Access-Control-Allow-Headers" : @"Content-Type"};
NSHTTPURLResponse *urlresponse = [[NSHTTPURLResponse alloc] initWithURL:request.URL statusCode:200 HTTPVersion:@"1.1" headerFields:headers];

В моем случае он мне не понадобился.

person nodepond    schedule 06.03.2013
comment
я хочу, чтобы uiwebview работал в автономном режиме. поэтому я использовал stackoverflow.com/a/17149902/935381 и сохранил ответ в каталоге документов. Но в автономном режиме, когда я пытаюсь получить к нему доступ, используя NSData * sData = (NSData *) [NSData dataWithContentsOfFile: filePath]; [webview loadData: sData MIMEType: @ text / html textEncodingName: nil baseURL: nil]; но он не отображает надлежащий контент. он выводит данные кодировки ... - person Hitarth; 11.04.2014