2011年9月19日月曜日

iOS ユーザ位置の取得

iOSでユーザ位置の取得をするには、Core Location フレームワークを使用します。

Core Location フレームワークでは、電話基地局、Wifiポイント、GPSを利用してすべてのデバイスで位置を取得することができます(「標準位置情報サービス」)。

その他に、省電力で位置の取得と変更の通知を受けることのできる「大幅変更位置情報サービス」、境界線の横断を検知できる「領域観測」があり、これらはiOS4以降でサポートされます。
(定期更新が必要な場合、できるだけ「大幅変更位置情報サービス」を使用する。)

実装にあたっては、CoreLocation.frameworkをTargetのBuild PhasesのLink Binary With Librariesから追加します。また、ヘッダファイルに、#import <CoreLocation/CoreLocation.h>を追加します。

<必要に応じ、Info.plistにUIRequiredDeviceCapabilitiesを追加し、location-servicesを指定もしくはGPSのみの場合、gpsを追加するが、位置情報サービスがなくても動作する場合は指定をしない>


以下により実装する。
1.位置情報サービスの利用可否の確認
CLLocationManagerのlocationSercicesEnabledメソッドを呼び出す(iOS4)
    YESの場合、開始可能。NOの場合、位置情報サービスを開始しようとすると位置情報サービスを有効にするかどうかユーザに確認を求めてくる。

 if ([CLLocationManager locationServicesEnabled]) {

}
else {

}

2.大幅変更位置情報サービスの開始
if(locationManager == nil){
          locationManager = [[CLLocationManager alloc] init];
     }
    locationManager.delegate = self;
    [locationManager startMonitoringSignificantLocationChanges];

3.サービスからの位置データの受信
  デリゲートによる場合:
     -(void)locationManager:(CLLocationManger *)manager
       didUpdateToLocaton:(CLLocaton *)newLocation
       fromLocation:(CLLocation *) oldLocation{

        NSDate* eventDate = newLocation.timestamp;
        NSTimeInterval howRecent = [eventDate timeIntervalSiceNow];
        if (abs(howRecent) < 15.0) {
            // 新しいイベントでは更新をOFFにする?           
       }
      newLocation.coordinate.latitude ....
      newLocation.coordinate.longitude .....
    }

デリゲートによらない場合
locationManager.location  (CLLocation *)  //位置
    locationManger.heading (CLHeading *)  //方位

   location.coordinate (CLLocationCoordinate2D)  // 座標
       coordinate.latitude // 緯度 (double)
      coordinate.longitude  // 軽度 (double)

    その他、高度、精度、タイムスタンプ、スピード、コース等が得られる。

4. 位置情報の反映
   [mapView setCenterCoordinate:locationManager.location.coordinate animated:YES];


5. サービスの停止
   [locationManager stopMonitoringSignificantLocationChanges];

うぉ、動いたな。

0 件のコメント:

コメントを投稿