2014-02-14 39 views
0

我正在編寫一個代碼來不斷跟蹤應用CoreLocation的用戶。由於我無法始終保持GPS,因此我在AppDelegate中使用StartMonitoringSignificantLocationChange來檢測到重大變化。我在UIBackgroundMode中註冊了location。 in didUpdateLocations方法,我檢查從以前記錄的位置的當前距離。如果它很重要,我申請StopMonitoringSignificantLocationChangeStartUpdatingLocation以獲得準確的位置。同時我啓動計時器(30秒)以查看用戶是靜止還是移動。如果用戶不再移動,我再次應用StopUpdatingLocationStartMonitoringSignificantLocationChange。 我也以我的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

你曾經從應用程序切換器中刪除應用程序嗎? – sangony

+0

不,它只是在鎖定屏幕時發送到背景。 – Behrang

+0

看看以前的帖子。它可能會給你一個想法(看所有的答案)。 http://stackoverflow.com/questions/18946881/background-location-services-not-working-in-ios-7 – sangony

回答

2
  • Backgrounding任務將在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