0

こんにちは、アプリがバックグラウンドで実行されているときに、ユーザーの場所をサーバーに更新する必要があるという要件があります。以下のコードを使用して車内でテストしましたが、 - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation: が起動されたときに報告される緯度と経度の不一致がほとんど見つかりませんでした。その瞬間、私は実際にどこにいますか。

didupdatelocation は携帯電話基地局の読み取り値を使用するため、あまり正確ではないことを知っています. - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:; そして、はるかに正確な測定値を取得します。

助けや指示があれば、よろしくお願いします。

#import "LocationsAppDelegate.h"
#import "RootViewController.h"


@implementation LocationsAppDelegate

@synthesize window;
@synthesize navigationController;

-(void)initLocationManager {
    if (locationManager == nil) {
        locationManager = [[CLLocationManager alloc] init];
        locationManager.delegate = self;
        locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters; // 100 m
       // [locationManager startUpdatingLocation];
        [locationManager startMonitoringSignificantLocationChanges];
    }
}

- (void)saveCurrentData:(NSString *)newData {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSMutableArray *savedData = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@"kLocationData"]];
    [savedData addObject:newData];
    [defaults setObject:savedData forKey:@"kLocationData"];
    [savedData release];
}

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

    NSDate* eventDate = newLocation.timestamp;

    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];

    //check if the data is less than 15 sec ago
    if (abs(howRecent) > 15.0)
    {
        NSLog(@"old data latitude %+.6f, longitude %+.6f\n",
        newLocation.coordinate.latitude,newLocation.coordinate.longitude);

    }else{

        [locationManager startUpdatingLocation];

        NSDateFormatter * formatter = [[[NSDateFormatter alloc] init] autorelease];
        [formatter setTimeStyle:NSDateFormatterMediumStyle];
        NSString *locationData = [NSString stringWithFormat:@"%.6f, %.6f, %@",newLocation.coordinate.latitude, newLocation.coordinate.longitude,[formatter stringFromDate:newLocation.timestamp]];

        [self saveCurrentData:locationData];

        [locationManager stopUpdatingLocation]; 
    }    

}

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error {
    NSString *errorData = [NSString stringWithFormat:@"%@",[error localizedDescription]];
    NSLog(@"%@", errorData);
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    if (![CLLocationManager significantLocationChangeMonitoringAvailable]) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Sorry" message:@"Your device won't support the significant location change." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];
        return YES;
    }
    [self initLocationManager];
    [self.window addSubview:navigationController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

- (void)dealloc {
    [locationManager release];
    [navigationController release];
    [window release];
    [super dealloc];
}

@end
4

1 に答える 1

0

の動作はまたはプロパティstartMonitoringSignificantLocationChangesの影響を受けません。distanceFilterdesiredAccuracy

したがって、より正確な結果を取得したい場合は、 を呼び出しstartUpdatingLocationdistanceFilterおよびdesiredAccuracyプロパティ ( kCLLocationAccuracyBestForNavigationkCLLocationAccuracyBest) をいじってみると、最も正確ですが、より多くの電力を消費するので、それらを試してみてください。

あなたのコードの動作を正確に理解していませんでした。startMonitoringSignificantLocationChangesの代わりにstartUpdatingLocation呼び出すのに、デリゲート メソッド内で呼び出すのはなぜですか?

于 2011-06-29T13:10:56.577 に答える