簡體   English   中英

CLLocationManager僅在安裝后第一次運行應用程序時監視區域

[英]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個區域,但並非總是如此)。

任何想法為什么這不起作用?

所以讓我們清理一下吧

使用區域監視時,您不需要調用startUpdatingLocationstopUpdatingLocation 那些激活標准位置跟蹤發送消息到委托回調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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM