Fundo do iOS Localização não enviando solicitação http

Meu aplicativo precisa rastrear a localização dos usuários em segundo plano, mas não está enviando uma solicitação "get". A solicitação http é enviada imediatamente quando o aplicativo chega ao primeiro plano. Estou usando o RestKit para todos os meus pedidos de rede e seguieste tutorial para configurar o meu serviço de localização em segundo plano. Na minha aplicaçãoDidEnterBackground

-(void)applicationDidEnterBackground:(UIApplication *)application
{
    self.bgLocationManager = [[CLLocationManager alloc] init];
    self.bgLocationManager.delegate = self;
    [self.bgLocationManager startMonitoringSignificantLocationChanges];
    NSLog(@"Entered Background");
}

e eu stopMonitoringSignificantLocationChange no meu applicationDidBecomeActive delegate

Este é o meu delegado locationManager onde eu aceito o novo local atualizado e envio para o meu 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;
    }
}

As solicitações de rede funcionam conforme planejado, mas não serão chamadas em segundo plano. Existe algum passo adicional que eu preciso? No meu info.plist eu tenho a chave de modos de fundo necessária e serviços de localização como o valor.

EDITAR

Eu também me referi aesta resposta SO passado. Eu executei alguns testes com a colocação de logs em toda a chamada didUpdateToLocation e eles foram chamados, mas a solicitação 'get' não foi enviada. Em vez disso, quando eu finalmente lancei o aplicativo para o primeiro plano, ele enviou todas as solicitações de rede (mais de 10).

EDIT (2) Adicionei RKRequestBackgroundPolicyContinue à minha solicitação, mas isso não alterou meus resultados. (Como você pode verAqui no fundo upload / download para o restkit). Eu vejo Restkit inicializar o host, mas não consegue enviar a solicitação até que o aplicativo se torne ativo.

RESPONDA

RestKit deve estar fazendo algo que é proibido em segundo plano. Usando um NSURLRequest funciona perfeitamente.

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];

É bom usar uma solicitação síncrona, pois não há interface do usuário para interromper tarefas em segundo plano

questionAnswers(3)

yourAnswerToTheQuestion