Мое приложение должно отслеживать местоположение пользователей в фоновом режиме, но оно не отправляет запрос "получить". HTTP-запрос отправляется немедленно, когда приложение выходит на передний план. Я использую RestKit для всех своих сетевых запросов, и я выполнил этот учебник, чтобы настроить службу фоновых местоположений. В моей applicationDidEnterBackground
-(void)applicationDidEnterBackground:(UIApplication *)application
{
self.bgLocationManager = [[CLLocationManager alloc] init];
self.bgLocationManager.delegate = self;
[self.bgLocationManager startMonitoringSignificantLocationChanges];
NSLog(@"Entered Background");
}
и я stopMonitoringSignificantLocationChange в моем делете 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 у меня есть ключ режима Required Background и location-services в качестве значения.
ИЗМЕНИТЬ
Я также упомянул в прошлом ответе SO. Я провел несколько тестов с пометкой журналов во время вызова didUpdateToLocation, и все они были вызваны, но запрос "получить" не был отправлен. Вместо этого, когда я, наконец, запустил приложение на передний план, он отправил все встроенные сетевые запросы (более 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];
Хорошо использовать синхронный запрос, так как нет интерфейса для нарушения фоновых задач