2014-02-14 5 views
0

Я пишу код, чтобы постоянно отслеживать пользователя, применяющего 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 минут) и прекращает получать обновления местоположения. Поскольку я борюсь с этой проблемой уже более месяца, и я пробовал практически все возможные решения , Я очень признателен, если вы поможете мне решить проблему в любом случае.

Приветствия

+0

Вы когда-нибудь удаляли приложение из App Switcher? – sangony

+0

Нет, он просто отправляется на задний план, когда я блокирую экран. – Behrang

+0

Взгляните на этот предыдущий пост. Это может дать вам идею (посмотрите ВСЕ ответы). http://stackoverflow.com/questions/18946881/background-location-services-not-working-in-ios-7 – sangony

ответ

2
  • задача будет фоновой умереть через 10 минут, если правильный режим многозадачности не установлен (например, в качестве навигационного приложения), в этом случае вам нужно держать GPS на.
  • Вам нужно будет удерживать GPS или воспроизводить звук в фоновом режиме. Вы говорите, что вы не можете постоянно поддерживать GPS, но если это так, то то, что вы видите, вероятно, является ожидаемым поведением (или я что-то неправильно понял).
  • См различных констант CLLocationAccuracy доступных:

Доступно: https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CoreLocationConstantsRef/Reference/reference.html#//apple_ref/c/data/kCLLocationAccuracyKilometer

extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation; 
extern const CLLocationAccuracy kCLLocationAccuracyBest; 
extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters; 
extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters; 
extern const CLLocationAccuracy kCLLocationAccuracyKilometer; 
extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers; 

По крайней мере, это «может» помочь управлять GPS потребление энергии батареи, если вы сохранить это работает все время.

+0

Спасибо за ваши комментарии @jeef. Из-за потребления батареи я не могу включить GPS, и, таким образом, я отключу его, когда пользователь не двигается в течение 30 секунд.Однако я использую 'StartMonitoringSignificantLocationChange' для проверки сигналов GSM/WIFI и обнаружения движений пользователя. На всякий случай, когда пользователь движется, я снова включаю GPS. Кажется, что переключение между GPS ('StartUpdatingLocation') и GSM/WIFI (' StartMonitoringSignificantLocationChanges') не работает в фоновом режиме. – Behrang

+0

@Behrang Значительный часто означает, что длина 1000 м (следующая ячейка GSm), это то, что вы хотите? – AlexWien

+0

Посмотрите здесь различные режимы: Это (возможно) поможет, но не напрямую, возможно, с тем, что вы хотите сделать - https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CoreLocationConstantsRef/Reference/reference .html # // apple_ref/c/data/kCLLocationAccuracyBestForNavigation – Jeef

Смежные вопросы