iOS8でMKMapViewで現在地に移動しない

iOS8でMKMapViewで現在地に移動しない

MKMapViewを使用していて、初期表示をユーザの初期位置にしたかったので、いろいろ調べてやっとこさ対応完了。iOS8から色々と変わっていました。AutoLayoutといい、iOS4を中心に開発していた身としては、たくさん変更があってシンドいです。

iOS8からロケーションマネージャの権限取得が必要

iOS8からはロケーションマネージャの権限取得が必要です。

// viewDidLoadなどに。

self.locationManager = [[CLLocationManager alloc] init];<br>self.locationManager.delegate = self;

if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        // iOS バージョンが 8 以上
        // 位置情報取得の許可を求めるメッセージを表示する
        [self.locationManager requestWhenInUseAuthorization];
    } else {
        // iOS バージョンが 8 未満        
        [self.locationManager startUpdatingLocation];
    }
}

// マップにユーザの現在地を表示<br>self.mapView.showsUserLocation = YES;
// LocationManagerのデリゲート

- (void)locationManager:(CLLocationManager *)manager
didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
    
    if (status == kCLAuthorizationStatusAuthorizedAlways ||
        status == kCLAuthorizationStatusAuthorizedWhenInUse) {
        [self.locationManager startUpdatingLocation];
    } else if (status == kCLAuthorizationStatusNotDetermined) {
        // アプリ使用中だけ位置情報取得の許可を求める。
        [manager requestWhenInUseAuthorization];
    }
}

- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations {
    
    CLLocation *location = [locations lastObject];
    
    // 現在地のリージョンを設定
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude), 1000, 1000);
    [self.mapView setRegion:region animated:YES];

    // 初回だけなので、止める    
    [self.locationManager stopUpdatingLocation];
}

さらに、Info.plistに記述が必要です。「NSLocationWhenInUseUsageDescription」に許可を求める際に表示するメッセージを入力する必要があります。ここでは「位置情報を取得します。」という意味不明なメッセージに仮置き。

実行してみると、

IMG_0398
「許可」をタップで、現在地に移動ーーーー、、、、、、、、あれ?しない。。。。

いろいろ考えた末の結論としては、シミュレーターでは動かない?
実機では問題なく移動しました。