Ошибка IOS 9 Домен =kCLErrorDomain Код =0 "(ноль)"

Код ниже должен получить текущее местоположение. Но выше ошибка генерируется. Функция didUpdateLocations никогда не вызывается.

Запуск этого на устройстве (iPhone 5s)iOS 9.1. В Info.plist есть Обязательные возможности устройства и Конфиденциальность - описание использования местоположения, настроенное так, как показано на прикрепленном изображении. Пожалуйста помоги!

let locationManager = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()
    locationManager.delegate = self
    locationManager.requestAlwaysAuthorization()
    locationManager.requestLocation()
}


func locationManager(manager: CLLocationManager,
    didFailWithError error: NSError) 
    print(error.description)
}

func locationManager(manager: CLLocationManager, didUpdateLocations
      locations: [CLLocation]) {        
 print(“got location”)
}

Info.plist

9 ответов

Пожалуйста, попробуйте это:

Идти к:

  • Продукт -> Схема -> Редактировать схему -> Параметры -> Разрешить симуляцию местоположения необходимо проверить и попытаться указать местоположение по умолчанию, не оставляя для него значение "нет"

РЕДАКТИРОВАТЬ: Как упоминалось в комментариях, также перезапустите Xcode, и все готово!

Надеюсь это поможет.

В XCode 11.5

Откройте свой симулятор:

Особенности => Местоположение => CustomLocation

Поиск в Google true ответы, кажется, это проблема, начиная с IOS4.0.

в XCODE 7.1 в Project => схема => редактировать схему.

под Run => Options => Core location / отключить Allow Location Simulation.

в вашем симуляторе IOS под Debug => Location выберите местоположение. Это решило проблему для меня.

Попробуйте это из Симулятора -> Отладка -> Местоположение

Если предупреждение авторизации местоположения не появляется для вас, попробуйте добавить NSLocationAlwaysUsageDescription в ваш список как строку типа. Также сделайте то же самое для NSLocationWhenInUseUsageDescription.

Я использую XCode 14. Вот что я сделал для решения проблемы.

  1. В XCode перейдите в меню "Продукт -> Схема -> Изменить схему" ИЛИ нажмите "Shift + Command +<"
  2. Нажмите "Выполнить" на левой панели, а затем "Параметры".
  3. Вы найдете поле "Базовое местоположение", убедитесь, что установлен флажок "Разрешить моделирование местоположения".
  4. Кроме того, не оставляйте раскрывающееся меню "Местоположение по умолчанию" на "Нет". Выберите любой город
  5. Закрыть. Нет необходимости перезапускать XCode

У меня возникла та же проблема с приложением, с которого я перешел с 8.0 -> 9.0/9.1. Я попробовал пару вещей, таких как написать часть CLLocationManager только в Swift и новый проект Obj-C. Я также проверил это на разных устройствах. Чтобы решить проблему на устройстве, я удалил функцию didFailWithError. Который останавливает ошибку в целом. Это может показаться не самой лучшей идеей, но в IOS9 вы можете ограничить свое приложение устройствами, которые имеют GPS или Location-Services. Android занимается этим очень давно. Я также заметил, что в вашем.plist у вас не включены разрешения для NSLocationALwaysUsageDescription или NSLocationWhenInUseUsageDescrtiption.

Просто для справки я прикрепил то, как выглядит мой текущий.plist, который не вызывает эту ошибку, а также фрагмент кода в obj-c файле контроллера. Код начинается в самом конце предыдущей функции, а затем имеет закомментированный делегат didFailWithError и didUpdateLocations. В настоящее время это успешно работает в IOS 9.1

       //Get map authorization
    [CLLocationManager locationServicesEnabled];
    locationManager = [[CLLocationManager alloc]init];
    locationManager.delegate = self;
    locationManager.allowsBackgroundLocationUpdates = YES;
    if(nil == locationManager) locationManager = [[CLLocationManager alloc]init];
    if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [locationManager requestAlwaysAuthorization];
    }
    //locationManager.distanceFilter=10;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    [locationManager startUpdatingLocation];



//- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
//{
//    NSLog(@"didFailWithError: %@", error);
//    UIAlertView *errorAlert = [[UIAlertView alloc]
//                               initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
//    [errorAlert show];
//}

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


    NSLog(@"LocationUpdated: %@",[locations lastObject]);
    [self updateMapMarkers];

//    NSDate* eventDate = location.timestamp;
//    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
//    if(fabs(howRecent) < 15.0){
//        [self updateMapMarkers];
//    }

}

plist image

У меня есть эти предложения для людей, использующих карты Apple в своем приложении

  1. Не транслируйте результаты симулятора, потому что он всегда не даст точных результатов.
  2. Для всех карт, связанных с отладкой и тестированием выполнения на реальных устройствах.
  3. Как и в xcode 8(насколько мне известно), вы можете просто подключить ваше устройство iOS к системе и запустить приложение напрямую.
  4. Даже для вышеуказанной проблемы решение одно и то же, просто попробуйте с реальными устройствами, ваша проблема будет решена.

В моем случае я назначал возврат CLLocationManager() переменной внутри переопределения ViewControllers viewDidLoad.

Как только этот метод жизненного цикла завершится, ссылка на объект будет выпущена; закрытие диалогового окна до того, как у пользователя появится возможность ответить, что также вызывает проблемы с логикой в ​​другом месте, где это может зависеть от этой ссылки.

Мне просто нужно было переместить назначение из переопределения метода жизненного цикла в корень класса, в котором я его использовал.

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