2013-03-06 1 views
8

J'envoie une requête à un UIWebView. Il y a des appels AJAX sur la page Web chargée. J'ai besoin d'analyser le trafic AJAX afin de déterminer, si l'utilisateur est connecté ou non. Pour ce faire, j'ai installé un NSURLCache dans le AppDelegate:NSCachedURLResponse renvoie l'objet, mais UIWebView n'interprète pas le contenu

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

Cette MYURLCache classe reçoit correctement le trafic qui traverse la WebView. Je peux terminer les appels AJAX seulement. Je génère ensuite une propre requête des appels AJAX. Celui-ci renvoie la réponse parfaitement fine du serveur web. Donc, la dernière étape à faire est de construire l'objet de retour NSCachedURLResponse. J'ai aussi réussi cela, mais la webview ne fait rien quand on retourne les objets. Si je retourne juste zéro, le WebView charge tout bien (nil est le message pour le NSURLCache, que rien n'est mis en cache, donc le webview devrait commencer à le charger tout seul).

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

Répondre

8

J'ai trouvé une solution à ce problème ... Je pense que cela a quelque chose à voir avec les en-têtes manquants.

Si je remplace

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

Avec

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

L'ensemble fonctionne. Cette réponse a en outre suggéré l'en-tête personnalisé supplémentaire de la demande. 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]; 

Dans mon cas, je n'en avais pas besoin.

+0

Je souhaite que uiwebview fonctionne en mode hors connexion. J'ai donc utilisé http://stackoverflow.com/a/17149902/935381 et enregistré la réponse dans le répertoire du document. Mais en mode hors ligne quand je dois y accéder en utilisant NSData * sData = (NSData *) [NSData dataWithContentsOfFile: filePath]; [webview loadData: sData MIMEType: @ "text/html" textEncodingName: nil baseURL: nil]; mais il n'affiche pas le contenu approprié. il déplaçait les données de codage ... – Hitarth

+0

merci qui m'a vraiment aidé – kevinl

Questions connexes