まず、毎分 startUpdatingLocation を呼び出さないでください。ユーザーのデバイスのバッテリー寿命を奪います。位置情報サービスは、動作に大量のバッテリー電力を使用します。また、一度呼び出すとstartUpdatingLocation
、呼び出すまで実行されますstopUpdatingLocation
。
必要に応じて構成するために設定できるプロパティがありCLLocationManager
ます。お気に入り...
@property(assign, nonatomic) CLLocationDistance distanceFilter
@property(assign, nonatomic) CLLocationAccuracy desiredAccuracy
distanceFilter
説明: 更新イベントが生成される前にデバイスが水平方向に移動する必要がある最小距離 (メートル単位で測定)。
desiredAccuracy
次のいずれかになります。
kCLLocationAccuracyBestForNavigation
kCLLocationAccuracyBest;
kCLLocationAccuracyNearestTenMeters;
kCLLocationAccuracyHundredMeters;
kCLLocationAccuracyKilometer;
kCLLocationAccuracyThreeKilometers;
オブジェクトの構成に応じてCLLocationManager
、デバイスは特定の地理位置情報ハードウェアを他のハードウェアと比較して使用します。場合によっては、単純にセル タワーの三角測量を使用するだけで十分であり、半正確な位置を取得する最も迅速な方法です。また、GPS を使用する必要がある場合もあります。GPS を使用すると、バッテリーの寿命が非常に短くなり、場所を特定するのに時間がかかりますが、ほとんどの場合、はるかに正確です。
NSTimer を開始することをお勧めしますが、計画とは逆に使用してください。十分な正確な位置を取得できないstopUpdatingLocation
場合は、妥当な時間が経過した後に使用してください。CLLocationManager
位置情報サービスを永久に実行したままにしないでください。このタイマーを 30 秒などに設定すると、タイムアウト後に確実にシャットダウンされます。
また、CLLocationManagerDelegate メソッドを実装する必要があります。
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
timestamp
この方法では、その場所が最近のものであることを確認する必要があります。horizontalAccuracy
また、位置を確認して、目的の精度範囲内にあることを確認する必要があります。これを行う方法の例を次に示します...
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
// Ensure we get a recent and accurate location
NSDate * locationTimestamp = [newLocation timestamp];
NSTimeInterval timeDifference = [locationTimestamp timeIntervalSinceNow];
double thirtyMins = (30 * 60 * -1);
BOOL locationTimestampIsCurrent = (timeDifference > thirtyMins);
BOOL isAccurateLocation = (newLocation.horizontalAccuracy <= 3000.00);
if (locationTimestampIsCurrent && isAccurateLocation) {
NSLog(@"Shutting down location services, we have a good locaton.");
[self stopListeningForLocation];
} else {
// Do nothing, let this method be called again with a new "newLocation" to check its validity.
}
}
iOS 6 以降、上記のメソッドは廃止され、代わりに次のデリゲート メソッドを使用します。
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
最新の場所を取得するには、次のように場所配列の最後のオブジェクトをフェッチするだけです。
CLLocation *location = [locations lastObject];