Расстояние между CLLocations не будет возвращаться правильно

В моем приложении я пытаюсь определить расстояние между двумя точками. Я нажал кнопку своего приложения, прошел через (большую) комнату, и CLLocationDistance вернулась как 0,000000.

.h файл:

@property (strong, nonatomic) IBOutlet UIImageView *stopButton;
@property (strong, nonatomic) CLLocationManager *locationManager;
@property (strong, nonatomic) CLLocation *firstLocation;
@property (strong, nonatomic) CLLocation *secondLocation;
@property (strong, nonatomic) IBOutlet UILabel *locationLabel;

.m файл:

- (void)viewDidLoad {
    [super viewDidLoad];
     self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.distanceFilter = kCLDistanceFilterNone;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
    self.firstLocation = [self deviceLocation];
}

- myButtonFunction {
    self.secondLocation = [self deviceLocation];
    self.locationLabel.text = [[NSString alloc] initWithFormat:@"%f", [self.firstLocation distanceFromLocation:self.secondLocation]];
}

- (CLLocation *)deviceLocation {
    return [[CLLocation alloc] initWithLatitude:self.locationManager.location.coordinate.latitude longitude:self.locationManager.location.coordinate.longitude];
}

2 ответа

Используя местоположение устройства, вы теряете много контроля над тем, что на самом деле записывается. Например, местоположение устройства может иметь условия, при которых оно не обновляется, если ваше местоположение не изменяется более чем на 20 метров... Или, возможно, оно обновляется один раз в час. У тебя нет возможности узнать.

Как говорил Джош, вы должны найти CLLocationManagerDelegate Обратный вызов (ы). Сохраните их в своем классе, и когда ваши кнопки будут нажаты, запишите последнее местоположение, которое вы сохранили. Только тогда вы получите данные, связанные с указанными вами настройками местоположения.

Вам нужно подождать, пока менеджер местоположения скажет вам, что у него есть новая информация. Пока это не произойдет, вы будете постоянно находиться в одном и том же месте.

Менеджер проинформирует вас через метод делегата locationManager:didUpdateLocations: (locationManager:didUpdateToLocation:fromLocation: для iOS < 6.0). Вам нужен класс, который реализует этот метод, который будет назначен делегатом менеджера местоположений, и вы не можете проверить новое местоположение, пока этот метод не будет вызван.

Также имейте в виду, что при первом вызове этого метода на самом деле могут не быть свежие данные. Смотрите мой ответ на "Основные отрицательные значения местоположения".

Другие вопросы по тегам