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 件のコメント:
コメントを投稿