CLLocationManager を直接使用する場合、通常は最初のコールバックでキャッシュされた場所を取得します。古いですが、通常は良い場所です。その後、Wi-Fi、セルタワー (利用可能な場合) を使用して、より良い場所を提供する追加のコールバックをすばやく取得します。1000m 未満の精度を要求した場合、(さらに数秒後に) GPS 三角測量が取得されます。
それらのいずれも、海の真ん中にあるほど不正確であってはなりません。このコード行は次のように思われます。
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
userLocation
またはlocation
isの間、座標にアクセスしていnil
ます。userLocation
またはが nil の場合location
、これは 0 座標を返します。lat=0、lon=0 の場所は、アフリカ沖の大西洋にあります。location
座標を取得する前に nil でないことを確認するためのチェックを追加できます。
if (self.mapView.userLocation.location) {
self.mapView.centerCoordinate = self.mapView.userLocation.location.coordinate;
[mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];
}
MKMapViewDelegate へのコールバックを待ってmapView:didUpdateUserLocation:
、有効な場所がいつ利用できるかを知ることもできます。の実装では、無効な位置を示す horizo ntalAccuracydidUpdateUserLocation:
< 0 を持つ位置を破棄する必要があります。
-(void)mapView:(MKMapView*)mapView didUpdateUserLocation:(MKUserLocation*)userLocation
{
if (userLocation.location.horizontalAccuracy > 0) {
[mapView setCenterCoordinate:self.mapView.userLocation.location.coordinate zoomLevel:ZOOM_LEVEL animated:YES];
}
}