2012-03-21 4 views
8

私は、ユーザーの場所を監視するアプリケーションを作成しています。 startMonitoringSignificantLocationChangesを使用するCLLocationManagerオブジェクトがあるので、アプリケーションが実行されていないときにバックグラウンドから位置の更新を取得できます。私は私のアプリケーションdidFinishLaunchingWithOptionsを設定しました。私はロケーションキーを取得すると、私はあなたのマネージャーを呼び出してユーザーの場所を取得します。すべてうまく動作しますが、問題は、バックグラウンドからロケーションを取得するたびに、このロケーションの水平精度が非常に悪いことです。ほとんどの場合、それは1414mです。Location.Horizo​​ntalバックグラウンドから位置を取得するときの確度が悪い

地面が背景から来たときに水平精度が悪い理由を知っている人はいますか? バックグラウンドで正確な位置情報を得るためにできることはありますか?

私が取得するすべての場所が非常に正確です。アプリが実行されているときは、場所が背景から来た場合にのみ発生します。それは私の街にあるセルタワーの数と関係がありますか?私は、デバイスがバックグラウンドで場所を取得するためにwifiノードのgpsを使用しないかもしれないと考えていた。

とにかく、ここのお役に立てれば助かります。 あなたの考えをお伝えください。

ありがとうございます!

+0

他の人の研究はこちらhttp://longweekendmobile.com/2010/07/22/iphone-background-gps-accurate-to-500-meters-not-enough-for-foot-traffic/題名「CLLocationManagerにはバックグラウンド(10秒以下)であっても、非常に短い時間内に複数のイベントを報告する傾向...第2イベントは、最初の " –

+0

リンクよりもずっと正確です。非常に有益な情報がありました。彼らはそこから、場所がバックグラウンドから得られたときに500mまで正確であると言いましたが、それはあなたがいる都市によって異なります。ブラジルのブラジリアで私のアプリをテストしてきました。今までに得た最高の精度は1200mでした。 –

答えて

11

CLLocationManagerによって返される位置の精度は、desiredAccuracy(デフォルトではkCLLocationAccuracyBest)とデバイスの利用可能な精度によって決定されます。たとえば、バッテリーの残量が少ない場合は場所の精度が低下する可能性があります。また、別のアプリからキャッシュされている場合は、より正確な場所を取得する可能性があります。

しかし、信じられないほど正確な座標を取得すると、バッテリからかなりの電力が消費され、デバイスが消耗します。バックグラウンドでのアプリケーションは、おそらくバッテリ性能を向上させるためにはるかに低い精度精度に制限されています。

正確な位置にはGPS無線機を使用するには多くの電力が必要ですが、正確な位置は近くの無線LANホットスポットや携帯電話の範囲内のセルタワーに依存する可能性があります。

アプリケーションがバックグラウンドから再開すると、システムは結果の精度を向上させようとします。それは難しいコンセプトですが、お使いの携帯電話でマップアプリケーションを見てください。最初は、自分の位置を表す円が非常に大きくなります。システムがより正確な位置情報を取得すると、サークルは小さくなります。この視覚化は、より正確な位置を得るためにより多くの電力を使用する電話を表しています。

CLLocationManagerと同様の現象が表示されます。アプリがバックグラウンドから再開されると、正確な位置情報が取得され、その後の正確な更新情報が表示されます。

これは、AppleがAPIを設計する際に必要としていた利便性とバッテリ寿命の間の妥協点です。ユーザーの場所への最初の更新は、マップアプリケーションだけを使用していて場所がキャッシュされていない限り、おそらく正確ではありません。

私があなたに与えることができる最良のアドバイスは、ロケーションマネージャからの後続の更新を聞き、それに応じてUIを更新することです。がんばろう!

9

名前のとおり:startMonitoringSignificantLocationChanges通知は、ユーザーの場所が最後に確認された場所と大きく異なることを通知するためだけにあります。あなたが希望する正確さに従ってあなたの場所を更新するためにその通知を受け取ったときはあなたの仕事です。通知はあなたのためにそれをしません。場所が変更されたことを通知するだけで、状況に応じて対応できるようになります。より正確な精度を得る方法がわからない場合は、LocateMeのAppleサンプルコードをチェックしたいかもしれません。精度(bestEffortAtLocation)を格納するスニペットを作成し、デリゲートが呼び出されるたびに精度をテストしてより良い結果が得られるまでテストしますこれはまっすぐ自分のサンプルコードLocateMeからの抜粋ですので、またはタイムアウトが発生した。:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    // store all of the measurements, just so we can see what kind of data we might receive 
    [locationMeasurements addObject:newLocation]; 
    // test the age of the location measurement to determine if the measurement is cached 
    // in most cases you will not want to rely on cached measurements 
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 
    if (locationAge > 5.0) return; 
    // test that the horizontal accuracy does not indicate an invalid measurement 
    if (newLocation.horizontalAccuracy < 0) return; 
    // test the measurement to see if it is more accurate than the previous measurement 
    if (bestEffortAtLocation == nil || bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy) { 
     // store the location as the "best effort" 
     self.bestEffortAtLocation = newLocation; 
     // test the measurement to see if it meets the desired accuracy 
     // 
     // IMPORTANT!!! kCLLocationAccuracyBest should not be used for comparison with location coordinate or altitidue 
     // accuracy because it is a negative value. Instead, compare against some predetermined "real" measure of 
     // acceptable accuracy, or depend on the timeout to stop updating. This sample depends on the timeout. 
     // 
     if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) { 
      // we have a measurement that meets our requirements, so we can stop updating the location 
      // 
      // IMPORTANT!!! Minimize power usage by stopping the location manager as soon as possible. 
      // 
      [self stopUpdatingLocation:NSLocalizedString(@"Acquired Location", @"Acquired Location")]; 
      // we can also cancel our previous performSelector:withObject:afterDelay: - it's no longer necessary 
      [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(stopUpdatingLocation:) object:nil]; 
     } 
    } 
    // update the display with the new location data 
} 

クレジットは、Appleに行く:

http://developer.apple.com/library/ios/#samplecode/LocateMe/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007801-Intro-DontLinkElementID_2

ですから、通知や必要性を得るときより良い結果を得るには、精度を更新し、それがより良い結果をもたらすかどうかを確認する必要がありますt。

+0

ヒューバート、返信いただきありがとうございます。これは実際に私のアプリで使用している正確なコードであり、アプリケーションが動作している状態で正常に動作します。しかし、それはバックグラウンドにあるので、デリゲートが呼び出されるたびに精度をテストしますが、その精度は常に悪いです。私はアッシュがここで言ったことは正しいと思います。アプリがバックグラウンドにあるとき、携帯電話はバッテリーを節約するためにGPSを使用して場所を取得しません。少なくとも私の街ではセルタワーから取得された場所の正確さは悪いです。おそらく、より多くのセルタワーを利用できる都市では、この精度はやや良いかもしれません。 –

+0

私の助言が役に立つと嬉しく思っています。 –

関連する問題