Fondo de iOS Ubicación que no envía solicitud http
Mi aplicación necesita rastrear la ubicación de los usuarios en segundo plano, pero no puede enviar una solicitud de "obtención". La solicitud http se envía inmediatamente cuando la aplicación llega al primer plano. Estoy usando RestKit para todas mis solicitudes de red y seguíeste tutorial para configurar mi servicio de ubicaciones de fondo. En mi aplicaciónDidEnterBackground
-(void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgLocationManager = [[CLLocationManager alloc] init];
self.bgLocationManager.delegate = self;
[self.bgLocationManager startMonitoringSignificantLocationChanges];
NSLog(@"Entered Background");
}
y detengo MonitoreoSignificantLocationChange en mi aplicaciónDidBecomeActive delegate
Este es mi delegado de locationManager donde acepto la nueva ubicación actualizada y la envío 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;
}
}
Las solicitudes de red funcionan según lo planeado, pero no se llamarán en segundo plano. ¿Hay pasos adicionales que necesito? En mi info.plist tengo la tecla Modos de fondo requeridos y los servicios de ubicación como el valor.
EDITAR
También me referí aesta respuesta SO pasada. Realicé algunas pruebas colocando registros a lo largo de la llamada didUpdateToLocation y todos fueron llamados, pero no se envió la solicitud 'get'. En cambio, cuando finalmente lanzo la aplicación al primer plano, envió todas las solicitudes de red (más de 10).
EDITAR (2) Agregué RKRequestBackgroundPolicyContinuar a mi solicitud pero no cambió mis resultados. (Como puedes veraquí en el fondo de carga / descarga para restkit). Veo que Restkit inicializa el host pero no puedo enviar la solicitud hasta que la aplicación se active.
RESPONDER
RestKit debe estar haciendo algo que está prohibido en el fondo. El uso de 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 solicitud síncrona ya que no hay una interfaz de usuario que interrumpa las tareas en segundo plano