1
{
...
locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
}

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {

        NSLog(@"myLocation1: %@",[locations lastObject]);
        myLocation = [locations lastObject];
        NSLog(@"myLocation2: %@",[locations lastObject]);
        [manager stopUpdatingLocation];

        [self doSomethingWithLocation];    
}

現在、私は40.000,40.000の場所にいます。アプリを閉じて、場所を 10.000,10.000 に変更します

アプリを再度起動し[locationManager startUpdatingLocation];てログを実行すると、次のように表示されます。

myLocation1: <+40.00000000,+40.00000000>
myLocation2: <+40.00000000,+40.00000000>

もう一度トリガー[locationManager startUpdatingLocation];すると、ログに次のように表示されます。

myLocation1: <+10.00000000,+10.00000000>
myLocation2: <+10.00000000,+10.00000000>

didUpdateLocations一度電話をかけただけで現在地を取得するにはどうすればよいですか? 別のデリゲートを使用する必要がありますか?

適切な場所を更新するために、何らかの遅延の後に配置して実行することもできると思いますが、それは意図された方法ではないと確信してstopUpdatingLocationdoSomethingWithLocationます.doSomethingWithLocation

ありがとう

4

3 に答える 3

7

Location Manager をしばらく (30 秒など) 実行したままにし、停止するようにタイマーを設定します。ロケーション マネージャーの更新はパンケーキのようなもので、最初に取得する更新が常に最適であるとは限りません。

于 2013-09-17T19:17:36.647 に答える
1

最初に表示される更新は、位置情報サービスが最後に起動された何分も前に特定された「古い」位置である可能性があります。または、たとえば携帯電話基地局の測位を使用して決定された非常に不正確な場所である可能性があります。デバイスの現在の位置を取得する必要があるだけの場合、これらのケースを処理する必要があるため、Core Location を直接使用するには大量のコードが必要です。(CLLocationManager API は、ターンバイターン方式の GPS ナビゲーション アプリなど、継続的な位置情報の更新が必要なアプリ向けに構築されているようです。)

CLLocationManager を直接使用する代わりに、INTULocationManager などのオープン ソース コンポーネントの使用を検討することをお勧めします。INTULocationManagerは、このすべての作業を処理し、デバイスの現在の場所に対する 1 つまたは複数の個別の要求を簡単に要求できるようにします。

于 2014-03-29T19:04:01.347 に答える
0

この場合、場所のタイムスタンプを確認する必要があります。ユーザーは、そのような距離をそれほど速く移動しません。

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {

        CLLocation *location = [locations lastObject];
        if(fabs([location.timestamp timeIntervalSinceNow]) < 5)//seconds
        {
            myLocation = location;
            manager.delegate = nil;
            [manager stopUpdatingLocation];
            [self doSomethingWithLocation];
        }
}
于 2013-09-17T20:32:50.290 に答える