Я написал приложение, используя службы определения местоположения, приложение должно отправлять местоположение каждые 10 секунд.
И это сработало очень хорошо.
Просто используйте метод " allowDeferredLocationUpdatesUntilTraveled: timeout ", следуя документу Apple.
То, что я сделал:
Обязательно: Зарегистрировать фоновый режим для обновления Местоположение.
1. Создайте LocationManger
и startUpdatingLocation
, с accuracy
и filteredDistance
как хотите:
-(void) initLocationManager
{
// Create the manager object
self.locationManager = [[[CLLocationManager alloc] init] autorelease];
_locationManager.delegate = self;
// This is the most important property to set for the manager. It ultimately determines how the manager will
// attempt to acquire location and thus, the amount of power that will be consumed.
_locationManager.desiredAccuracy = 45;
_locationManager.distanceFilter = 100;
// Once configured, the location manager must be "started".
[_locationManager startUpdatingLocation];
}
2. Чтобы приложение продолжало работать вечно, используя allowDeferredLocationUpdatesUntilTraveled:timeout
метод в фоновом режиме, необходимо перезапустить updatingLocation
с новым параметром, когда приложение переходит в фоновый режим, например:
- (void)applicationWillResignActive:(UIApplication *)application {
_isBackgroundMode = YES;
[_locationManager stopUpdatingLocation];
[_locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[_locationManager setDistanceFilter:kCLDistanceFilterNone];
_locationManager.pausesLocationUpdatesAutomatically = NO;
_locationManager.activityType = CLActivityTypeAutomotiveNavigation;
[_locationManager startUpdatingLocation];
}
3. Приложение получает обновленные местоположения в обычном режиме с locationManager:didUpdateLocations:
обратным вызовом:
-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
// store data
CLLocation *newLocation = [locations lastObject];
self.userLocation = newLocation;
//tell the centralManager that you want to deferred this updatedLocation
if (_isBackgroundMode && !_deferringUpdates)
{
_deferringUpdates = YES;
[self.locationManager allowDeferredLocationUpdatesUntilTraveled:CLLocationDistanceMax timeout:10];
}
}
4. Но вы должны обработать данные, затем locationManager:didFinishDeferredUpdatesWithError:
обратный вызов для вашей цели
- (void) locationManager:(CLLocationManager *)manager didFinishDeferredUpdatesWithError:(NSError *)error {
_deferringUpdates = NO;
//do something
}
5. ПРИМЕЧАНИЕ: Я думаю, что мы должны сбрасывать параметры LocationManager
каждый раз, когда приложение переключается между режимом фона / форпоста.