CLLocationManagerで位置情報を取得する(5にも6にも対応)
お次は位置情報。GPSに関しては、古くは15年位前の船舶用のものから、新しくは準天頂での滞在の長い方用のものまでいろいろとやってきましたが、携帯やスマホに搭載されるようになって、手軽にいろいろと遊べるようになりましたよね。
さて、以前の記事でもちょっと触れましたが、CoreLocationも5.1.1までと6.0以降で少しメソッドが変わっています。
5.0より前のものはもう考えなくてもよさそうですが、5に関してはもうしばらくサポートが必要っぽいので、両方に対応した処理をいれることにします。
加速度を取得する記事と同じように、まずはインスタンス変数。
CLLocationManager* _locationMgr; // LocationManager
dispatch_semaphore_t _locSemaphore; // バッファ排他アクセス用セマフォ
NSMutableData* _locBuff; // 位置データ格納用
測位開始
if(!_locationMgr) {
_locationMgr = [[CLLocationManager alloc] init];
_locationMgr.delegate = self;
if ([CLLocationManager locationServicesEnabled]) {
[_locationMgr startUpdatingLocation];
}
}
測位停止
if (_locationMgr) {
[_locationMgr stopUpdatingLocation];
_locationMgr = nil;
}
測位関連のイベントを受け取る為に、CLLocationManagerDelegateを実装します。5と6以降の両方に対応するために、両方のメソッドを入れて、それらから処理用のメソッドを呼んでいます。
- (void)didUpdateLocatoin:(CLLocation*)location
{
if(_locSemaphore && !dispatch_semaphore_wait(_locSemaphore, SENSOR_SEMAPHORE_TIMEOUT)){
CLLocationCoordinate2D coord = location.coordinate;
[_locBuff appendBytes:&coord length:sizeof(CLLocationCoordinate2D)]; // 経緯度をバッファに格納
if(_locSemaphore) dispatch_semaphore_signal(_locSemaphore);
}
}
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
[self didUpdateLocatoin:[locations lastObject]];
}
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
[self didUpdateLocatoin:newLocation];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
NSLog(@"ServiceObj.locationManager:didFailWithError: %d %@",error.code,error.localizedDescription);
}
というわけで、位置情報も簡単に使えるようになりました。