2

Xcode 4.5 では、Apple は Apple の新しいマップを導入しました。私のアプリケーションには、マップ サービスが必要です。そして、アプリを削除して再度開くまで、アプリケーションで間違った現在の場所が表示されることに気付きました(そうでない場合もあります)。4G に接続していたのに、間違った現在地が表示されました。私のアプリケーションには適切な場所が必要なため、このバグを修正する方法はありますか? 前もって感謝します。コードを提供できれば、非常に役立ちます...編集: Apple Mapアプリで同じ問題

私のコード:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation {
    {

    }

    if (!oldLocation)
        totalDistance = 0.0;
    else
        totalDistance += [newLocation distanceFromLocation:oldLocation];

}
4

3 に答える 3

3

Apple ドキュメントの古いアプローチは、iOS6 でもまだ機能しているようです (アクティブなアプリではこれに気づきませんでした (GPS 経由でユーザーのルートを追跡します))。

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow];
    if (locationAge > 5.0) return;
    if (newLocation.horizontalAccuracy < 0) return; 

    // proceed with coords here
}

ディスカッションからの更新:合​​計距離と現在の距離の計算は、次のように行うことができます (いくつかのマイナーなものを除く):

// somewhere at the top
CLLocation* lastUsedLocation = nil; // last location used in calculation
CLLocation* pointA = nil;  // start of the track
double totalDistance = 0;  // total distance of track
double currentDistance = 0; // distance between startTrack point and current location
...

// when you start updating location:
- (void) startTracking {
    lastUsedLocation = nil;
    pointA = nil;
    totalDistance = 0;
    currentDistance = 0;
    [locationManager startUpdatingLocation];
}
...


// location update callback
 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 
    if (locationAge > 5.0) return;  // filter cached
    if (newLocation.horizontalAccuracy < 0) return; // filter invalid

    if(!pointA) pointA = [newLocation retain]; 

    if(lastUsedLocation) 
    { 
        totalDistance += [newLocation distanceFromLocation:lastUsedLocation]; 
    } 
    currentDistance = [pointA distanceFromLocation:newLocation]; 
    [lastUsedLocation release]; 
    lastUsedLocation = [newLocation retain]; 
}

意図的にバックグラウンドの位置情報をオフにするオプションが必要な場合は、次のように手動で無効にします。

- (void)applicationDidEnterBackground:(UIApplication *)application {
    if(backgroundLocationDisabled)
    {
        [locationManager stopUpdatingLocation];
        // additional stuff
    }
}
于 2012-11-28T06:26:18.267 に答える
1

Xcode 4.4 以降でも同じ問題が発生していることに気付きました。この問題は Xcode 内でのみ (ランダムに、またはそのように思われます) 発生します。アプリを App Store にアップロードすると、これはもう問題ではありません。それまでの間、バグを報告してください。

于 2012-11-28T06:29:35.457 に答える