2013-08-27 84 views
1

我有一個iOS應用程序,它是一個帶有3個視圖控制器的選項卡式應用程序,所有這些應用程序都需要知道手機何時進入特定地理區域。CLLocationManager只在安裝後第一次運行應用程序時監控區域

我們監視的區域在運行時通過Web界面提供,所以我們需要定期清除CLLocationManager監視的區域並添加新的區域。 CLLocationManager對象也是管理與Web服務器連接的單例類的成員變量。

我的問題是,當應用程序第一次安裝時,區域監視工作正常。但是我第一次嘗試在之後運行它,這是第一次,區域監控不起作用。

我可以在實際手機的iOS模擬器上看到這一點。在各個地方

-(void) initialiseLocationManager:(NSArray*)geofences 
{ 
    if(![CLLocationManager locationServicesEnabled]) 
    { 
     NSLog(@"Error - Location services not enabled"); 
     return; 
    } 
    if(self.locationManager == nil) 
    { 
     self.locationManager = [[CLLocationManager alloc] init]; 
     self.locationManager.delegate = self; 
    } 
    else 
    { 
     [self.locationManager stopUpdatingLocation]; 
    } 
    for(CLRegion *geofence in self.locationManager.monitoredRegions) 
    { 
     //Remove old geogate data 
     [self.locationManager stopMonitoringForRegion:geofence]; 
    } 
    NSLog(@"Number of regions after cleanup of old regions: %d", self.locationManager.monitoredRegions.count); 
    if(self.locationManager == nil) 
    { 
     [NSException raise:@"Location manager not initialised" format:@"You must intitialise the location manager first."]; 
    } 
    if(![CLLocationManager regionMonitoringAvailable]) 
    { 
     NSLog(@"This application requires region monitoring features which are unavailable on this device"); 
     return; 
    } 
    for(CLRegion *geofence in geofences) 
    { 
     //Add new geogate data 

     [self.locationManager startMonitoringForRegion:geofence]; 
     NSLog(@"Number of regions during addition of new regions: %d", self.locationManager.monitoredRegions.count); 
    } 
    NSLog(@"Number of regions at end of initialiseRegionMonitoring function: %d", self.locationManager.monitoredRegions.count); 
    [locationManager startUpdatingLocation]; 
} 

我已經打過電話在不同的地方[的LocationManager stopUpdatingLocation],具體爲:

收到來自包含該區域的詳細信息服務器mesasge,我們運行下面的代碼AppDelegate.m文件(applicationWilLResignActive,applicationDidEnterBackground,applicationWillTerminate),但它們都沒有幫助。無論哪種方式,當我構建我的應用程序並添加一個GPX文件來模擬位置時,模擬器可以正確地獲取Web界面發送的區域。我第二次運行這個程序時,這些區域沒有被拾起。當我重新載入GPX文件時,它會再次運行,但從第二次開始,它就不再工作了。

根據API文檔,CLLocationManager甚至在終止時也保留區域的記錄(這就是爲什麼我清除了我們監視的區域的原因),但我的猜測是我的初始化例程第一次應用程序運行,但調用不應該從第二次開始調用的內容。另外,清除過程似乎並不總能奏效(NSLog語句通常顯示CLLocationManager清除爲0個區域,但並不總是)。

任何想法爲什麼這不起作用?

回答

3

所以,讓我們清理這個一點點

你不需要使用區域監測時要調用startUpdatingLocationstopUpdatingLocation。那些激活標準位置跟蹤發送消息給代理回調locationManager:didUpdateLocations:。地區跟蹤應用程序實現這些委託回調:

– locationManager:didEnterRegion: 
– locationManager:didExitRegion: 

而且它不太可能,位置服務將在此方法的過程中被禁用,你應該確保它不可能得到從後臺擺脫「的LocationManager」的線。因此我們不需要檢查兩次。

由於您正在監測區域,所以最好確保您的區域監測可用於+ (BOOL)regionMonitoringAvailable。最好在某個時候用+ (CLAuthorizationStatus)authorizationStatus檢查位置權限,並做出適當的反應。

按照this blog post看來你還需要有

UIBackgroundModes :{location} 
UIRequiredDeviceCapabilities: {location-services} 
在您的應用程序信息

。plist爲這一切正常工作。

如果您有關於失敗模式的更多信息,我可以回來一些更具體的建議:)

相關問題