Ошибка 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”)
}
9 ответов
Пожалуйста, попробуйте это:
Идти к:
- Продукт -> Схема -> Редактировать схему -> Параметры -> Разрешить симуляцию местоположения необходимо проверить и попытаться указать местоположение по умолчанию, не оставляя для него значение "нет"
РЕДАКТИРОВАТЬ: Как упоминалось в комментариях, также перезапустите Xcode, и все готово!
Надеюсь это поможет.
Поиск в Google true ответы, кажется, это проблема, начиная с IOS4.0.
в XCODE 7.1 в Project => схема => редактировать схему.
под Run => Options => Core location / отключить Allow Location Simulation.
в вашем симуляторе IOS под Debug => Location выберите местоположение. Это решило проблему для меня.
Если предупреждение авторизации местоположения не появляется для вас, попробуйте добавить NSLocationAlwaysUsageDescription в ваш список как строку типа. Также сделайте то же самое для NSLocationWhenInUseUsageDescription.
Я использую XCode 14. Вот что я сделал для решения проблемы.
- В XCode перейдите в меню "Продукт -> Схема -> Изменить схему" ИЛИ нажмите "Shift + Command +<"
- Нажмите "Выполнить" на левой панели, а затем "Параметры".
- Вы найдете поле "Базовое местоположение", убедитесь, что установлен флажок "Разрешить моделирование местоположения".
- Кроме того, не оставляйте раскрывающееся меню "Местоположение по умолчанию" на "Нет". Выберите любой город
- Закрыть. Нет необходимости перезапускать 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];
// }
}
У меня есть эти предложения для людей, использующих карты Apple в своем приложении
- Не транслируйте результаты симулятора, потому что он всегда не даст точных результатов.
- Для всех карт, связанных с отладкой и тестированием выполнения на реальных устройствах.
- Как и в xcode 8(насколько мне известно), вы можете просто подключить ваше устройство iOS к системе и запустить приложение напрямую.
- Даже для вышеуказанной проблемы решение одно и то же, просто попробуйте с реальными устройствами, ваша проблема будет решена.
В моем случае я назначал возврат CLLocationManager() переменной внутри переопределения ViewControllers viewDidLoad.
Как только этот метод жизненного цикла завершится, ссылка на объект будет выпущена; закрытие диалогового окна до того, как у пользователя появится возможность ответить, что также вызывает проблемы с логикой в другом месте, где это может зависеть от этой ссылки.
Мне просто нужно было переместить назначение из переопределения метода жизненного цикла в корень класса, в котором я его использовал.