Как получить locationManager startMonitoringSignificantLocationИзменяет точные показания

Привет, у меня есть требование, когда мне нужно обновить местоположение пользователя на сервере, пока приложение работает в фоновом режиме. Я использовал приведенный ниже код, чтобы протестировать его в машине, и обнаружил несколько несоответствий в широте и долготе, о которых сообщается, когда запускается менеджер - (void) locationManager: (CLLocationManager *) didUpdateToLocation: Координаты далеки от где я на самом деле нахожусь в тот момент.

Я знаю, что didupdatelocation использует показания вышки сотовой связи, следовательно, не очень точные. Мне было интересно, могу ли я запустить [locationManager startUpdatingLocation], когда - (void) locationManager: (CLLocationManager *) менеджер 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

person snowflakes74    schedule 29.06.2011    source источник


Ответы (1)


На поведение startMonitoringSignificantLocationChanges не влияют свойства distanceFilter или desiredAccuracy.

Поэтому, если вы хотите получить более точные результаты, вызовите startUpdatingLocation, и, играя со свойствами distanceFilter и desiredAccuracy (kCLLocationAccuracyBestForNavigation, kCLLocationAccuracyBest), они наиболее точны, но потребляют больше энергии, так что поиграйте с ними.

Я не совсем понял поведение вашего кода. Почему вы вызываете startMonitoringSignificantLocationChanges вместо startUpdatingLocation, но вызываете его внутри метода делегата?

person Yorxxx    schedule 29.06.2011
comment
Спасибо, Yorxxx, за ваш ответ. Я хочу, чтобы приложение работало в фоновом режиме и публиковало данные только после значительного изменения расстояния. Как я могу запустить приложение в фоновом режиме и разбудить приложение, когда пользователь прошел значительное расстояние. В очередной раз благодарим за помощь. - person snowflakes74; 30.06.2011