1

タブ付きアプリケーションであるiOSアプリがあり、3つのビューコントローラーがあり、電話が特定の地理的地域に入ったときに知る必要があります。

監視するリージョンは実行時に 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] をさまざまな場所、特に AppDelegate.m ファイル (applicationWilLResignActive、applicationDidEnterBackground、applicationWillTerminate) のさまざまな場所で呼び出してみましたが、どれも役に立たないようです。どちらの方法でも、アプリケーションをビルドして場所をシミュレートするために GPX ファイルを追加すると、シミュレーターは Web インターフェイスから送信されたリージョンを正しく取得します。プログラムを 2 回目に実行すると、リージョンが選択されません。GPXファイルをリロードすると動作するのですが、2回目以降は動作しません。

API ドキュメントによると、CLLocationManager は終了時でもリージョンの記録を保持します (これが、監視対象のリージョンをクリアする理由です)。 2 回目以降は、呼び出してはいけないものを呼び出します。また、クリア ダウン プロセスが常に機能しているとは限りません (NSLog ステートメントは、多くの場合、CLLocationManager が 0 リージョンにクリアされることを示していますが、常にではありません)。

これが機能しない理由はありますか?

4

1 に答える 1