seguridad restaurar copia app anterior america objective-c ios restkit

objective-c - restaurar - bank of america app iphone



Soporte en línea y fuera de línea para aplicaciones iOS RestKit (2)

Por favor, compruebe la versión de RestKit; en la versión más reciente de RestKit hay un enfoque ligeramente modificado para obtener los datos en caché del almacén de objetos administrados. No tengo el ejemplo en esta máquina; pero si necesita más ayuda (ya que esta es una pregunta bastante antigua), responda.

Deseo utilizar RestKit para una aplicación que necesita funcionar tanto dentro como fuera de línea.

Puede que no entienda bien cómo funciona RestKit, pero pensé que esto era (bastante) fácil de implementar.

En una aplicación iOS de prueba de rasguño configuré las cosas de la siguiente manera:

// setup the client NSString* URL = @"http://10.211.55.5:3000/api"; RKClient* client = [RKClient clientWithBaseURL:URL]; client.username = @"[email protected]"; client.password = @"password"; // setup caching client.cachePolicy = RKRequestCachePolicyLoadIfOffline | RKRequestCachePolicyLoadOnError | RKRequestCachePolicyTimeout; client.requestCache.storagePolicy = RKRequestCacheStoragePolicyPermanently; // setup managed object store RKObjectManager* objectManager = [RKObjectManager objectManagerWithBaseURL:URL]; RKManagedObjectStore* objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"RestKitCoreDataTest.sqlite"]; // connect my cache implementation MyCache* cache = [[MyCache alloc] init]; objectStore.managedObjectCache = cache; objectManager.objectStore = objectStore; // setup mapping RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class]]; [userMapping mapKeyPath:@"id" toAttribute:@"identifier"]; [userMapping mapKeyPath:@"email" toAttribute:@"email"]; [userMapping mapKeyPath:@"firstname" toAttribute:@"firstname"]; [userMapping mapKeyPath:@"surname" toAttribute:@"surname"]; userMapping.primaryKeyAttribute = @"identifier"; [objectManager.mappingProvider setMapping:userMapping forKeyPath:@""]; // setup routes RKObjectRouter* router = [objectManager router]; [router routeClass:[User class] toResourcePath:@"/users/:identifier"];

El objeto Usuario se implementa como se requiere para el soporte CoreData:

@interface User : NSManagedObject @property (nonatomic, retain) NSNumber * identifier; @property (nonatomic, retain) NSString * email; @property (nonatomic, retain) NSString * firstname; @property (nonatomic, retain) NSString * surname; @end @implementation User @dynamic identifier; @dynamic email; @dynamic firstname; @dynamic surname; @end

Aquí está MyCache. Tenga en cuenta que no me estoy molestando en revisar resourcePath ya que esto es solo para probar cosas, y de todos modos tengo un camino.

@implementation MyCache - (NSArray*)fetchRequestsForResourcePath:(NSString*)resourcePath { NSFetchRequest* fetchRequest = [User fetchRequest]; return [NSArray arrayWithObject:fetchRequest]; } -(BOOL)shouldDeleteOrphanedObject:(NSManagedObject *)managedObject { return true; } @end

Luego hago una llamada al servidor para obtener al usuario con el ID 123, en la ruta "/ api / users / 123":

User* user = [User object]; user.identifier = [NSNumber numberWithInt:123]; RKObjectManager* manager = [RKObjectManager sharedManager]; [manager getObject:user delegate:self];

Esto funciona bien. Pero cuando desconecto el wifi en mi Mac, el código anterior no recupera al usuario de la base de datos sqlite.

Recibo el siguiente error en su lugar en el objectLoader:didFailWithError del delegado objectLoader:didFailWithError :

2012-03-01 11:44:09.402 RestKitCoreDataTest[1989:fb03] error: Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo=0x6b89aa0 {NSErrorFailingURLStringKey=http://10.211.55.5:3000/api/users/123, NSErrorFailingURLKey=http://10.211.55.5:3000/api/users/123, NSLocalizedDescription=The request timed out., NSUnderlyingError=0x6b81ac0 "The request timed out."}

Pensé que en virtud de especificar que la memoria caché debería usarse cuando hay un tiempo de espera, con: "RKRequestCachePolicyTimeout", habría esperado que el usuario se recuperara de la memoria caché local.

La memoria caché contiene un registro de usuario con ID 123 - en la tabla ZUSER, con 123 en la columna ZIDENTIFIER.

¿Hay algún paso que me esté faltando para que esto funcione? ¿Tal vez otro método de delegado que deba manejarse, o se llame, cuando se golpea el caché después del tiempo de espera? ¿O estoy tratando de hacer algo que no es necesariamente algo que obtendría "fuera de la caja" con RestKit?

Aclamaciones.


Puede usar la Clase de Alcance para determinar si su cliente está desconectado o no. Utilizo esta gran clase muy a menudo en todos los proyectos que requieren una conexión a Internet.

Simplemente inicie el notificador a un host específico. En todo su viewController, ahora solo tiene que registrar métodos en el NSNotificationCenter para establecer un BOOL isOline en línea, por ejemplo.

Al hacer esta práctica, puede hacer cosas hermosas en su aplicación, como superponer la aplicación con un mensaje suave "Desconectado".

https://gist.github.com/1182373

EDITAR

Aquí hay un ejemplo de la pantalla de inicio de sesión de uno de mis proyectos (perdón por esta cantidad de código, pero esta es mi implementación completa):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //// Some stuff //// [[Reachability reachabilityWithHostname:@"apple.com"] startNotifier]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) name:kReachabilityChangedNotification object:nil]; } - (void)reachabilityChanged:(NSNotification *)note { if ([[note object] isReachable]) { CAKeyframeAnimation *scale = [CAKeyframeAnimation animationWithKeyPath:@"transform.scale"]; [scale setValues:[NSArray arrayWithObjects:[NSNumber numberWithFloat:1.0], [NSNumber numberWithFloat:0.0], nil]]; [scale setDuration:0.3]; [scale setRemovedOnCompletion:NO]; [[offlineView layer] setTransform:CATransform3DMakeScale(0, 0, 1.0)]; [[offlineView layer] addAnimation:scale forKey:@"scale"]; [[offlineView layer] setTransform:CATransform3DIdentity]; [UIView animateWithDuration:0.3 animations:^{ [offlineView setAlpha:0]; } completion:^(BOOL finished){ if (finished) { [offlineView removeFromSuperview]; } }]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleDefault animated:YES]; } else { CGRect screenFrame = CGRectMake(0, 0, 320, 480); offlineView = [[UIView alloc] initWithFrame:screenFrame]; [offlineView setBackgroundColor:[UIColor colorWithWhite:0 alpha:0.7]]; [offlineView setAlpha:0]; offlineLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 30)]; [offlineLabel setFont:[UIFont fontWithName:@"Verdana" size:30.0]]; [offlineLabel setBackgroundColor:[UIColor clearColor]]; [offlineLabel setTextAlignment:UITextAlignmentCenter]; [offlineLabel setTextColor:[UIColor whiteColor]]; [offlineLabel setCenter:[offlineView center]]; [offlineLabel setText:@"OFFLINE"]; [offlineView addSubview:offlineLabel]; [[self window] addSubview:offlineView]; [UIView animateWithDuration:0.3 animations:^{ [offlineView setAlpha:1.0]; }]; [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackTranslucent animated:YES]; } }