iOS background Местоположение не отправляет http запрос

Моему приложению необходимо отслеживать местоположение пользователей в фоновом режиме, но оно не может отправить & get; get & apos; запрос. Запрос http отправляется сразу же, когда приложение выходит на передний план. Я использую RestKit для всех моих сетевых запросов, и я следовалэтот урок настроить мой фоновый сервис местоположений. В моем приложении DidEnterBackground

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

и я останавливаюMonitoringSignificantLocationChange в моем делегате applicationDidBecomeActive

Это мой делегат locationManager, где я принимаю новое обновленное местоположение и отправляю на мой сервер

-(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;
    }
}

Сетевые запросы работают, как запланировано, но не будут вызываться в фоновом режиме. Есть ли дополнительные шаги, которые мне нужны? В моем info.plist у меня есть ключ Обязательных фоновых режимов и location-services в качестве значения.

РЕДАКТИРОВАТЬ

Я также упоминалэтот прошлый так ответ, Я выполнил несколько тестов с размещением журналов в вызове didUpdateToLocation, и все они были вызваны, кроме «get». Запрос не был отправлен. Вместо этого, когда я наконец запустил приложение на передний план, оно отправило все встроенные сетевые запросы (более 10).

РЕДАКТИРОВАТЬ (2) Я добавил RKRequestBackgroundPolicyContinue к моему запросу, но это не изменило мои результаты. (Как вы видетеВот в фоновом режиме выгрузка / загрузка для restkit). Я вижу, как Restkit инициализирует хост, но не может отправить запрос, пока приложение не станет активным.

ОТВЕТ

RestKit должен делать то, что запрещено в фоновом режиме. Использование NSURLRequest работает отлично.

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

Можно использовать синхронный запрос, поскольку пользовательский интерфейс не мешает выполнять фоновые задачи.

Ответы на вопрос(3)

Ваш ответ на вопрос