2013-03-06 11 views
8

Wysyłam żądanie do interfejsu UIWebView. Na załadowanej stronie są wywołania AJAX. Muszę przeanalizować ruch AJAX, aby określić, czy użytkownik jest zalogowany, czy nie. Dla tej Zainstalowałem NSURLCache w AppDelegate:NSCachedURLResponse zwraca obiekt, ale interfejs UIWebView nie interpretuje treści

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

Ten MYURLCache klasy poprawnie odbiera ruch, który biegnie przez WebView. Mogę zakończyć tylko połączenia AJAX. Następnie spawnuję własne żądanie wywołań AJAX. Ten zwraca doskonale doskonałą odpowiedź z serwera WWW. Tak więc ostatnim krokiem do zrobienia jest skonstruowanie obiektu zwracającego NSCachedURLResponse. Udało mi się to również, ale widok internetowy po prostu nie robi nic podczas zwracania obiektów. Jeśli zwrócę tylko zero, WebView ładuje wszystko dobrze (zero jest komunikatem dla NSURLCache, że nic nie jest buforowane, więc przeglądarka powinna zacząć ładować je samodzielnie).

- (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; 
} 

Odpowiedz

8

Znalazłem jedno rozwiązanie tego problemu ... Myślę, że ma to coś wspólnego z nagłówkami, których brakowało.

Gdybym zastąpić

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

Z

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

Całość pracuje. Ta odpowiedź dodatkowo zasugerowała dodatkowy niestandardowy nagłówek żądania. 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]; 

W moim przypadku nie potrzebowałem tego.

+0

Chcę, aby uiwebview działał w trybie offline.so użyłem http://stackoverflow.com/a/17149902/935381 i zapisałem odpowiedź w katalogu dokumentów. Ale w trybie offline, gdy próbuję uzyskać dostęp do tego przy użyciu NSData * sData = (NSData *) [NSData dataWithContentsOfFile: filePath]; [webview loadData: sData MIMEType: @ "text/html" textEncodingName: nil baseURL: nil]; ale nie wyświetla właściwej treści. to odbiera dane kodowania ... – Hitarth

+0

dzięki, że bardzo mi pomogło – kevinl

Powiązane problemy