AFNetworking 2.0: caching forzado

¿Es posible forzar el almacenamiento en caching de respuesta si no contiene ni Expires ni Cache-Control: max-age ?

Me he encontrado con este artículo, pero desafortunadamente URLSession:dataTask:willCacheResponse:completionHandler: nunca se llama en mi subclass AFHTTPSessionManager .

Cualquier ayuda apreciada.

Puede forzar el almacenamiento en caching mediante la implementación de su propio NSURLProtocol que no sigue las reglas estándar de almacenamiento en caching HTTP. Aquí está un tutorial completo , que persiste con los datos de Core Data, pero los pasos básicos son:

  • Subclass NSURLProtocol
  • Registre su subclass con +registerClass:
  • Devuelva YES en su método +canInitWithRequest: si esta es la primera vez que ve la request , o NO si no es

Ahora tienes dos opciones:

  1. Implementa tu propio almacenamiento de caching (en cuyo caso, sigue el tutorial enlazado arriba)
  2. Inyecte los encabezados de control de caching que desea que siga el sistema de carga de URL.

Suponiendo que desee # 2, anule la connection:didReceiveResponse: en su subclass de protocolo para crear una respuesta que tenga los encabezados de control de caching que desea emular:

 - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSHTTPURLResponse *)response { // Create a dictionary with the headers you want NSMutableDictionary *newHeaders = [response.allHeaderFields mutableCopy]; newHeaders[@"Cache-Control"] = @"no-transform,public,max-age=300,s-maxage=900"; // Create a new response NSHTTPURLResponse *newResponse = [[NSHTTPURLResponse alloc] initWithURL:response.URL statusCode:response.statusCode HTTPVersion:@"HTTP/1.1" headerFields:newHeaders]; [self.client URLProtocol:self didReceiveResponse:newResponse cacheStoragePolicy:NSURLCacheStorageAllowed]; } 

Esto hará que la respuesta se almacene en caching como si el server hubiera proporcionado estos encabezados.


Solo para las sesiones de URL , debe configurar el protocolClasses de configuration de session. Dado que está utilizando AFNetworking, se ve así:

 [AFHTTPSessionManager shanetworkingManager].session.configuration.protocolClasses = @[[MyURLProtocol class]] 

Hay algunas advertencias, así que asegúrese de leer la documentation de protocolClasses .


Algunas notas:

  • Si hay alguna forma de solucionar esto haciendo que su server envíe los encabezados adecuados, por favor, hágalo en su lugar.
  • En aras de la brevedad, codifiqué "HTTP / 1.1", pero técnicamente deberías sacar esto de la respuesta.
  • AFNetworking utiliza el Sistema de carga de URL estándar, y en su mayoría no está relacionado con este problema.