1

バックグラウンドからフォアグラウンドに移動したときに、非常に正確な緯度と経度の座標を表示するアプリが必要です。

私はこれを行うのにかなり苦労しています。アプリをバックグラウンドにすると、位置情報サービスがオフになります。バックグラウンド位置情報モードを有効にすることを検討しましたが、そうするとユーザーのバッテリーが消耗する可能性があることを認識しています。私も使用しようとしましstartMonitoringSignificantLocationChangesたが、それは正確ではないようです。

私のビューには、クリックするとユーザーの座標を表示するボタンがあります。歩き回っているときにボタンをクリックすると、座標が正確になります。しかし、ユーザーがアプリを起動してすぐにボタンをクリックすると、座標がかなりずれます。誰でもこれで私を助けることができますか?バックグラウンド位置情報モードを有効にすることが唯一のオプションですか? 位置が正確になるまでボタンを無効にすることはできますか? どんな助けでも大歓迎です!

私のビューは、以下のようにアプリ デリゲートで設定されている locationManager から座標を取得します。

ビューは次のとおりです。

-(void>buttonClick {

NSString *userLatitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserLatitude];

NSString *userLongitude =[(PDCAppDelegate *)[UIApplication sharedApplication].delegate 
getUserLongitude];
}

アプリのデリゲートは次のとおりです。

- (NSString *)getUserLatitude {
    NSString *userLatitude = [NSString stringWithFormat:@"%f", 
    locationManager.location.coordinate.latitude];
    return userLatitude;
}

- (NSString *)getUserLongitude {
    NSString *userLongitude = [NSString stringWithFormat:@"%f", 
    locationManager.location.coordinate.longitude];
    return userLongitude;
}
4

3 に答える 3

0

あなたは間違ったアプローチを使用していると思います。

おわかりのように、GPSは正確な位置を取得するのに一定の時間を必要とします。これは GPS の仕組みによるものであり、変更することはできません。GPS は正確な位置を取得するのに最大 1 分かかる場合があります。このため、すべての iOS デバイス (および基本的に現在市場に出回っているすべてのスマートフォン) では、セルラ無線と Wi-Fi 三角測量を使用して GPS を支援しています。ほぼ瞬時におおよその位置を提供します。実際、指定する機能はdesiredAccuracy、特定のセンサーをオンまたはオフにするために CLLocationManager によって使用されますkCLLocationAccuracyKilometer。多くのバッテリーを節約します)

startMonitoringSignificantLocationChanges名前が示すように、ユーザーの場所の大幅な (広い/大きな) 変更にのみ使用され、問題は解決しません。ユーザーとして、アプリが自分の位置情報を必要としないことを知っていても監視し続けるのは好きではないことに注意してください。これは、アプリを強制終了またはアンインストールする理由になる可能性があります。

つまり、あなたができる最善のことは、単に待つか、ユーザーに場所を示していることを伝えることですが、正確ではない可能性があると考えています (たとえば、RunKeeper を見てください)。iOS では多くのことが非同期で行われます。これが瞬時に行われるようにアプリの設計を強制するのではなく、この非同期の世界を受け入れてください。

設計上、正確な位置情報が必要な場合は、ボタンを無効にして、CLLocationManger のデリゲートが目的の精度に達したことを ( ) 通知するまで待ってから (をlocationManager:didUpdateLocations:参照してください)、ボタンを有効にします。 .CLLocationhorizontalAccuracy

ちょっとした注意: CLLocationManager は最後の場所をキャッシュするため、ロジックを実行する前に CLLocation のタイムスタンプを確認してください。

于 2013-08-02T08:12:12.587 に答える
0

ドキュメントにstartUpdatingLocationは次のように書かれています:

このメソッドを連続して数回呼び出しても、新しいイベントが自動的に生成されるわけではありません。ただし、途中で stopUpdatingLocation を呼び出すと、次にこのメソッドを呼び出したときに新しい初期イベントが送信されます。

そのため、ロケーションマネージャーを「再初期化」することをお勧めします

[locationManager stopUpdatingLocation];
[locationManager startUpdatingLocation];

数秒後に呼び出されるデリゲート コールバックlocationManager:didUpdateLocations:を使用して、ユーザーに表示する座標を更新します。

PS: 遅延位置更新を使用した場合は、必ず を呼び出す必要がありますdisallowDeferredLocationUpdates

于 2013-08-02T08:10:20.387 に答える