対象:
Objective-C

GPSから位置情報を取得する

iOSでGPSから位置情報を取得するために必要な事は概ね以下になる。

  1. CoreLocation.framework追加
  2. CoreLocation/CoreLocation.hをインクルード
  3. CLLocationManagerDelegateプロトコル使用を宣言
  4. didUpdateLocationsデリゲートメソッドを作成
  5. CLLocationManagerのインスタンスを生成
  6. 生成したインスタンスにデリゲート割り当て
  7. 生成したインスタンスのstartUpdatingLocationメソッド呼び出し

まずxcodeprojの"Linked Frameworks and Libraries"からCoreLocation.frameworkを追加する。次に追加したCoreLocation.frameworkを利用するためにCoreLocation/CoreLocation.hをインクルードする。そしてViewControllerでCLLocationManagerDelegateプロトコルの使用を宣言する。


#import  <UIKit/UIKit.h>
#import  <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController <CLLocationManagerDelegate>
@property (nonatomic, retain) CLLocationManager *locationManager;
@property (weak, nonatomic) IBOutlet UILabel *labelLatitude;
@property (weak, nonatomic) IBOutlet UILabel *labelLongitude;
@property (weak, nonatomic) IBOutlet UILabel *labelTime;

@end

下記のコードはシミュレータで動作が確認できるように頻繁に情報が更新されるようにしている。実機で使う場合は適宜CLLocationManagerのパラメータ調整が必要かもしれない。

didUpdateLocationsデリゲートメソッドはGPSで位置情報の更新があったときに呼ばれる。このメソッドに位置情報が渡されるので緯度・経度を直接表示したり、地図を表示したりできる。更新間隔はdistanceFilterプロパティである程度制御できる。

didUpdateLocationsデリゲートメソッドで位置情報を受け取るために、CLLocationManagerのインスタンスを生成し、それにデリゲートとしてViewController自身を割り当てる。最後にstartUpdatingLocationメソッド呼び出して情報の更新を開始すれば、位置情報を取得することができる。

#import "ViewController.h"

@interface ViewController ()

@end
@implementation ViewController
@synthesize locationManager;
@synthesize labelLatitude;
@synthesize labelLongitude;
@synthesize labelTime;

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    //locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;
    //locationManager.distanceFilter = 500;
    [locationManager startUpdatingLocation];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    CLLocation* location = [locations lastObject];
    NSDate* timestamp = location.timestamp;
    //NSTimeInterval howRecent = [timestamp timeIntervalSinceNow];
    //if (abs(howRecent) < 15.0) {
        NSLog(@"緯度 %+.6f, 経度 %+.6f\n", location.coordinate.latitude, location.coordinate.longitude);
        labelLatitude.text = [NSString stringWithFormat:@"%+.6f", location.coordinate.latitude];
        labelLongitude.text = [NSString stringWithFormat:@"%+.6f", location.coordinate.longitude];
        NSDateFormatter *df = [[NSDateFormatter alloc] init];
        [df setDateFormat:@"yyyy/MM/dd HH:mm:ss"];
        labelTime.text = [df stringFromDate:timestamp];
    //}
}
@end

尚、iOS 8以降は仕様が変更となり、位置情報を得るためにはアプリのほうで対応が必要となる。生成したロケーションマネージャでrequestWhenInUseAuthorizationメソッド、またはrequestAlwaysAuthorizationメソッドを呼び出し、ユーザから位置情報の利用について承認を得なければならない。

    if (nil == locationManager) {
        locationManager = [[CLLocationManager alloc] init];
        // iOS 8以上
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) {
            // NSLocationWhenInUseUsageDescriptionに設定したメッセージでユーザに確認
            [locationManager requestWhenInUseAuthorization];
            // NSLocationAlwaysUsageDescriptionに設定したメッセージでユーザに確認
            //[locationManager requestAlwaysAuthorization];
        }
    }

これに先立って、2つのメソッドがそれぞれユーザに承認を得るときに利用するメッセージを予めInfo.plistで定義しておく必要がある。

	NSLocationAlwaysUsageDescription
	I always need location
	NSLocationWhenInUseUsageDescription
	I need location when app in use
(2013/09/26)
() iOS 8対応情報を追加。

新着情報
【iOS Objective-C, Swift Tips】アプリアイコンにバッジを表示(Swift)
【iOS Objective-C, Swift Tips】画像の向きを指定して保存する(Swift)
【iOS Objective-C, Swift Tips】UIImagePickerControllerの表示を日本語にする(Swift)

Copyright(C) 2004-2017 モバイル開発系(K) All rights reserved.
[Home]