0

バックグラウンドでから までGeo-locationの範囲内で、アプリに保存されているものに近づいているかどうかを知る必要があります。使用しましたが、正確な結果が得られません。代わりに を使用すると、 と同じくらい正確な結果が得られます。call everyに を追加する予定です。10 Meters500 MetersstartMonitoringForSignificantLocationChangestartupdatinglocation7 metersNSTimerstartupdatinglocation1 minute

他の解決策はありますか?

4

2 に答える 2

2

まず、毎分 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];
于 2013-05-21T02:12:41.483 に答える
0

あなたはこれらの質問で本当にゼロから始めています。Rob と Abhijit のリンクをたどることをお勧めします。Github で私のコードを試してみることも有益です。

TTLocationHandler Github

于 2013-05-21T01:24:32.750 に答える