Mi aplicación necesita rastrear la ubicación de los usuarios en segundo plano, pero no envía una solicitud 'get'. La solicitud http se envía inmediatamente cuando la aplicación aparece en primer plano. Estoy usando RestKit para todas mis solicitudes de red y seguí this tutorial para configurar el servicio de ubicaciones en segundo plano. En mi applicationDidEnterBackgroundAntecedentes iOS La ubicación no envía la solicitud HTTP
-(void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgLocationManager = [[CLLocationManager alloc] init];
self.bgLocationManager.delegate = self;
[self.bgLocationManager startMonitoringSignificantLocationChanges];
NSLog(@"Entered Background");
}
y yo stopMonitoringSignificantLocationChange en mi delegado applicationDidBecomeActive
Ésta es mi locationManager delegado donde Acepto la nueva ubicación actualizada y enviar a mi servidor
-(void) locationManager:(CLLocationManager *)manager
didUpdateToLocation:(CLLocation *)newLocation
fromLocation:(CLLocation *)oldLocation
{
NSLog(@"I am in the background");
bgTask = [[UIApplication sharedApplication]
beginBackgroundTaskWithExpirationHandler:
^{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
}];
// ANY CODE WE PUT HERE IS OUR BACKGROUND TASK
NSString *currentLatitude = [[NSString alloc]
initWithFormat:@"%g",
newLocation.coordinate.latitude];
NSString *currentLongitude = [[NSString alloc]
initWithFormat:@"%g",
newLocation.coordinate.longitude];
NSString *webToken = [[NSUserDefaults standardUserDefaults] stringForKey:@"userWebToken"];
NSLog(@"I am in the bgTask, my lat %@", currentLatitude);
NSDictionary *queryParams;
queryParams = [NSDictionary dictionaryWithObjectsAndKeys:webToken, @"auth_token", currentLongitude, @"lng", currentLatitude, @"lat", nil];
RKRequest* request = [[RKClient sharedClient] post:@"/api/locations/background_update" params:queryParams delegate:self];
//default is RKRequestBackgroundPolicyNone
request.backgroundPolicy = RKRequestBackgroundPolicyContinue;
// AFTER ALL THE UPDATES, close the task
if (bgTask != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
}
La red solicita obras como estaba previsto, pero no se llamará en segundo plano. ¿Hay algún paso adicional que necesito? En mi info.plist tengo la clave de modos de fondo requeridos y los servicios de ubicación como el valor.
EDITAR
También se hace referencia a this past SO answer. Realicé algunas pruebas con la colocación de registros a lo largo de la llamada didUpdateToLocation y se llamaron todos, pero no se envió la solicitud 'get'. En cambio, cuando finalmente lancé la aplicación al primer plano, envió todas las solicitudes de red integradas (más de 10).
EDIT (2) He añadido RKRequestBackgroundPolicyContinue a mi pedido, pero no ha cambiado mis resultados. (Como puede ver here en la carga/descarga de fondo para restkit). Veo que Restkit inicializa el host pero no envía la solicitud hasta que la aplicación se active.
RESPUESTA
RestKit debe estar haciendo algo que está prohibido en el fondo. Usar un NSURLRequest funciona perfectamente.
NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.example.com/api/locations/background_update"]];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[urlRequest setHTTPMethod:@"POST"];
[urlRequest setHTTPBody:jsonData];
NSHTTPURLResponse *response = nil;
[NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];
Está bien usar una petición síncrona ya que no hay interfaz de usuario para interrumpir con las tareas de fondo
¿Tiene el intento de reemplazar sus llamadas restKit con un NSURLConnection stock sincrónico? – dklt
estoy de acuerdo con la pregunta de dklt, porque parece probable que la llamada a la publicación '[[RKClient sharedClient]: params: delegate:]' esté causando que algo suceda en una cola de GCD que no está cubierta por su bracketing de AntecedentesTask ... y que las llamadas sincrónicas para obtener sus datos pueden ayudar de tal manera que las solicitudes se envíen mientras está en la tarea de fondo. sí, el RKRequestBackgroundPolicyContinue puede estar destinado a encargarse de esto, pero en realidad no lo está configurando hasta después de la llamada a la publicación: params: delegate: y en ese punto, puede ser demasiado tarde. –
@dklt Pude hacerlo funcionar con una solicitud de NSURLConnection, gracias por la sugerencia. Si pones una respuesta, la aceptaré. –