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];
Можно использовать синхронный запрос, поскольку пользовательский интерфейс не мешает выполнять фоновые задачи.