タブ付きアプリケーションである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 リージョンにクリアされることを示していますが、常にではありません)。
これが機能しない理由はありますか?