Я пишу код, чтобы постоянно отслеживать пользователя, применяющего CoreLocation
. Поскольку я не могу постоянно поддерживать GPS, я использую StartMonitoringSignificantLocationChange
в своем AppDelegate
, чтобы обнаружить значительные изменения. Я зарегистрировался на location
в UIBackgroundMode
. в методе didUpdateLocations
, я проверяю текущее расстояние от ранее записанного местоположения. Если это важно, я применяю StopMonitoringSignificantLocationChange
и StartUpdatingLocation
для получения точных мест. Между тем, я запускаю таймер (30 секунд), чтобы узнать, неподвижен или движется пользователь. Если пользователь больше не перемещается, я снова применяю StopUpdatingLocation
и StartMonitoringSignificantLocationChange
. Я также определил фоновую задачу в моем AppDelegate: -(void)applicationWillResignActive:(UIApplication *)application
следующим образом:Проблемы с эффективным отслеживанием пользователя в фоновом режиме iOS 7
- (void)applicationWillResignActive:(UIApplication *)application
{
if (![[GeoSampleManager sharedManager] isLiveTracking])
{
GeoSampleManager *manager = [HTSGeoSampleManager sharedManager];
[manager.locationManager stopMonitoringSignificantLocationChanges];
self.bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}];
[manager.locationManager startMonitoringSignificantLocationChanges];
}
}
Я закрываю фоновую задачу, когда приложение eneters переднего плана:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
if(self.bgTask != UIBackgroundTaskInvalid)
{
[[UIApplication sharedApplication] endBackgroundTask:self.bgTask];
self.bgTask = UIBackgroundTaskInvalid;
}
}
А вот мой didUpdateLocations
метод:
- (void)locationManager:(CLLocationManager *)manager
didUpdateLocations:(NSArray *)locations
{
CLLocation* newLocation = [locations lastObject];
if(self.isLiveTracking)
{
//Test that the horizontal accuracy does not indicate an invalid measurement
if (newLocation.horizontalAccuracy < 0 || newLocation.horizontalAccuracy > 200)
{
return;
}
if([self.lastLocation distanceFromLocation:newLocation] > 0)
{
//Create and save a GeoSample
[GeoSampleManager createSampleForLocation:newLocation onTrip:self.activeTrip];
self.lastLocation = newLocation;
}
}
else
{
if([self.lastLocation distanceFromLocation:newLocation] > 0)
{
[self.locationManager stopMonitoringSignificantLocationChanges];
self.idleChecker = [NSTimer scheduledTimerWithTimeInterval:30 target:self selector:@selector(checkIdle:) userInfo:nil repeats:YES];
[self.locationManager startUpdatingLocation];
self.isLiveTracking = YES;
}
}
}
И, наконец, метод таймера:
- (void)checkIdle:(NSTimer*)timer
{
if(abs([self.lastLocation.timestamp timeIntervalSinceNow]) >= 30.0)
{
//Stopping the idle-time checking timer
[self.idleChecker invalidate];
self.idleChecker = nil;
[self.locationManager stopUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
self.isLiveTracking = NO;
}
}
Однако приложение приостановлено (иногда через 5-10 секунд, иногда через 10 минут) и прекращает получать обновления местоположения. Поскольку я борюсь с этой проблемой уже более месяца, и я пробовал практически все возможные решения , Я очень признателен, если вы поможете мне решить проблему в любом случае.
Приветствия
Вы когда-нибудь удаляли приложение из App Switcher? – sangony
Нет, он просто отправляется на задний план, когда я блокирую экран. – Behrang
Взгляните на этот предыдущий пост. Это может дать вам идею (посмотрите ВСЕ ответы). http://stackoverflow.com/questions/18946881/background-location-services-not-working-in-ios-7 – sangony