[英]CLLocationManager only monitors regions the first time the app is run after install
我有一個iOS應用程序,它是一個標簽式應用程序,有3個視圖控制器,所有這些都需要知道手機什么時候進入特定的地理區域。
我們監視的區域是在運行時通過Web界面提供的,因此我們需要定期清除CLLocationManager正在監視的區域並添加新區域。 CLLocationManager對象是singleton類的成員變量,它也管理與Web服務器的連接。
我遇到的問題是,首次安裝應用程序時,區域監控工作正常。 但是我第一次嘗試在第一次運行它之后 ,區域監控不起作用。
我可以在實際手機和 iOS模擬器上看到這一點。
收到包含區域詳細信息的服務器的mesasge后,我們運行以下代碼:
-(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],特別是在AppDelegate.m文件中的各個地方(applicationWilLResignActive,applicationDidEnterBackground,applicationWillTerminate),但它們似乎都沒有幫助。 無論哪種方式,當我構建我的應用程序並添加GPX文件來模擬位置時,模擬器會正確地選取Web界面發送的區域。 第二次運行程序時,區域沒有被選中。 當我重新加載GPX文件時,它再次起作用,但從第二次開始,它再也無法工作了。
根據API文檔,CLLocationManager甚至在終止時保留區域記錄(這就是我清除我們監視的區域的原因),但我的猜測是我的初始化例程在應用程序第一次運行時是好的,但是調用第二次不應該調用的東西。 此外,清除過程似乎並不總是有效(NSLog語句通常顯示CLLocationManager清除為0個區域,但並非總是如此)。
任何想法為什么這不起作用?
所以讓我們清理一下吧
使用區域監視時,您不需要調用startUpdatingLocation
和stopUpdatingLocation
。 那些激活標准位置跟蹤發送消息到委托回調locationManager:didUpdateLocations:
. 區域跟蹤應用程序實現這些委托回調:
– locationManager:didEnterRegion:
– locationManager:didExitRegion:
此方法也不太可能在此方法中禁用位置服務,您應確保無法從后台線程中刪除“locationManager”。 因此我們不需要檢查它們兩次。
由於您在區域內監控其最佳狀態,以確保您可以使用+ (BOOL)regionMonitoringAvailable
進行區域監控。 最好還是在某個時刻使用+ (CLAuthorizationStatus)authorizationStatus
檢查位置權限並做出適當的反應。
根據這篇博客文章 ,你似乎也需要
UIBackgroundModes :{location}
UIRequiredDeviceCapabilities: {location-services}
在您的應用程序info.plist中,這一切都能正常工作。
如果您有關於失敗模式的更多信息,我可以回來一些更具體的建議:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.