Подтвердить что ты не робот

DidUpdateLocations не вызывается

Я пытаюсь получить свое текущее местоположение, но точка останова в didUpdateLocations никогда не вызывается.

LocationManager:

locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager setDesiredAccuracy:kCLDistanceFilterNone];
[locationManager startUpdatingLocation];

Метод делегирования:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;

Я подтвердил, что службы определения местоположения включены и разрешены.

Почему метод делегирования locationManager не вызывается как он должен?

Спасибо, Mike

4b9b3361

Ответ 1

Кроме того, в iOS8 у вас должно быть две дополнительные вещи:

  • Добавьте ключ к своему Info.plist и запросите авторизацию от менеджера местоположений с просьбой начать его.

    • NSLocationWhenInUseUsageDescription

    • NSLocationAlwaysUsageDescription

  • Вам необходимо запросить авторизацию для соответствующего метода определения местоположения.

    • [self.locationManager requestWhenInUseAuthorization]

    • [self.locationManager requestAlwaysAuthorization]

Пример кода:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// Check for iOS 8. Without this guard the code will crash with "unknown selector" on iOS 7.
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
    [self.locationManager requestWhenInUseAuthorization];
}
[self.locationManager startUpdatingLocation];

Источник: http://nevan.net/2014/09/core-location-manager-changes-in-ios-8/

Ответ 2

Когда у меня возникла эта проблема, это произошло из-за проблемы с потоками.

Убедитесь, что все эти методы вызываются в основном потоке. Очень важно, чтобы в основном потоке вызывался не только метод startUpdatingLocation, но и другие.

Вы можете заставить код запускаться в основном потоке, обернув его внутри

dispatch_sync(dispatch_get_main_queue(), ^{

});

Также проверьте этот ответ.

Ответ 3

Убедитесь, что вы добавили CLLocationManager в качестве свойства.

@property (nonatomic , strong) CLLocationManager *locationManager;

Ответ 4

Да, свойство было для меня решением, и рекомендуется проверить, что служба местоположения включена:

if ([CLLocationManager locationServicesEnabled]) {
    self.locationManager = [[CLLocationManager alloc] init];
    self.locationManager.delegate = self;
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    [self.locationManager startUpdatingLocation];
}

Ответ 5

Вам нужно сказать симулятору, какое местоположение имитировать. Если вы не укажете местоположение, ваши методы-делегаты CLLocationManager никогда не будут вызваны. Вы можете использовать меню симулятора Debug → Location. Также в Xcode на области отладки есть небольшая стрелка места, которая появляется при запуске приложения из Xcode. Вы можете использовать это, чтобы указать файл GPX для имитации движения (хотя он все еще не совпадает с реальным устройством).

https://devforums.apple.com/message/1073267#1073267

Ответ 6

Если установлен CLLocationManagerDelegate, MapView Delegate также установлен

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