0

別の SO の質問に基づいて、didUpdateLocations:次のようにメソッドを実装しました。

- (void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
    // Get the latest location found
    CLLocation *location = [locations lastObject];

    NSTimeInterval locationAge = -[location.timestamp timeIntervalSinceNow];

    if (locationAge > 5.0) return;
    if (location.horizontalAccuracy < 0) return;

    if (_bestEffort == nil || _bestEffort.horizontalAccuracy >= location.horizontalAccuracy) {
        _bestEffort = location;

        // Let the delegate know
        if (self.delegate && [self.delegate respondsToSelector:@selector(location:didUpdateLocationTo:)]) {
            [self.delegate location:self didUpdateLocationTo:location];
        }

        if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) {
            // Great, we've found our final location so stop searching!
            [self stopTrackingLocation];

            // Let our delegate know we've finished our work
            if (self.delegate && [self.delegate respondsToSelector:@selector(location:didFinishTrackingLocationWithFinalLocation:)]) {
                [self.delegate location:self didFinishTrackingLocationWithFinalLocation:location];
            }
        }
    }
}

このコードでは、正しく動作しないように見えることを除けば、すべてが理にかなっています。コードをステップ実行すると、

  • locationAgeは5歳未満で良い
  • 場所 horizo​​ntalAccuracy は 0 未満です。これは良いことです
  • bestEfforts の水平精度は場所の水平精度と同じであるため、その状態になることはありません
  • たとえそうであったstopTrackingLocationとしても、場所の horizo​​ntalAccuracy が < 0 (2 番目の if ステートメント) になることはあり得ないため、メソッドを呼び出すことはありませんが、私の場所の管理者が希望する精度は -2 (ナ​​ビゲーションに最適) であるため、実際にこのメソッドを離れることはありません。

私は何を間違っていますか、またはこれを正しく機能させるにはどうすればよいですか?

4

1 に答える 1

0

問題は、horizo​​ntalAccuracy が desiredAccuracy よりも小さい位置を取得しようとしていることです。

if (location.horizontalAccuracy <= _locationManager.desiredAccuracy) {

ただし、定数kCLLoationAccuracyBestForNavigationkCLLocationAccuracyBestは実数値ではなく、それぞれ -2 と -1 です。

問題は、目的のために本当に必要な精度はどれくらいかということです。それがチェックすべき値です。テスト目的では、100 メートルを使用します。これは、おそらく WiFi やセルラーだけでなく、GPS を使用して位置情報を取得していることを意味します。

if (location.horizontalAccuracy <= 100) {

実際の horizo​​ntalAccuracy は、iPhone 5 で 5 メートル未満になることはありません。表示される衛星の数とそのジオメトリに応じて、10、20、または 50 になる可能性があります。システムが修正をまったく取得できない場合は、-1 になることもあります。それが、これらの無効な場所を無視するためのこの行です。

    if (location.horizontalAccuracy < 0) return;

編集:
定数kCLLoationAccuracyBestForNavigationとは、CLLocationManager オブジェクトでプロパティkCLLocationAccuracyBestを構成する場合にのみ使用する必要があります。desiredAccuracyそのdesiredAccuracy設定により、Core Location ハードウェアが構成され、GPS、GLONASS などを有効にして、目的の精度を満たそうとします (それが満たされることを保証するものではありません)。

これdesiredAccuracyは、デリゲート メソッドで使用する必要がある値ではありません。CLLocationManager を構成するためだけに存在します。

于 2013-07-16T04:40:09.293 に答える