CLLocationManager.authorizationStatus() всегда CLAuthorizationStatus.NotDetermined с приложением swift&objC

Я просто могу получить авторизацию моего CLLocationManager. (быстро под ios8) я даже добавляю явный вызов requestAlwaysAuthorization (который мне не нужен с objC под ios7)

func finishLaunch() {
    //ask for authorization
    let status = CLLocationManager.authorizationStatus()
    if(status == CLAuthorizationStatus.NotDetermined) {
        self.locationManager.requestAlwaysAuthorization();
    }
    else {
        self.startMonitoring()
    }
    ...
}

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

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    if(status == CLAuthorizationStatus.NotDetermined) {
        println("Auth status unkown still!");
    }
    self.startMonitoring()
}

Я делаю это неправильно? -- Мне кажется, что это ошибка, но я хотел бы получить обратную связь.


person Daij-Djan    schedule 03.06.2014    source источник
comment
привет как у тебя получилось? Я получил такую ​​​​ошибку: Использование необъявленного типа «CLLocationManager»   -  person Shial    schedule 04.06.2014
comment
импортировать CoreLocation для использования материалов CL   -  person Daij-Djan    schedule 04.06.2014
comment
так какой импорт иметь UIAlertView? он должен быть в основе?   -  person Shial    schedule 04.06.2014
comment
это пользовательский интерфейс, так что это в UIKit   -  person Daij-Djan    schedule 04.06.2014
comment
тот же вопрос для OS X, все ответы здесь не помогли.   -  person Dima Deplov    schedule 06.11.2015


Ответы (4)


Имейте в виду, что ключи NSLocationAlwaysUsageDescription или NSLocationWhenInUseUsageDescription теперь являются обязательными, поэтому вы должны включить их в свой plist.

person amb    schedule 04.06.2014
comment
Спасибо за вашу поддержку. Ошибка все еще действительна, потому что я даже не мог авторизовать ее через приложение настроек, но это было решением для меня. - person Daij-Djan; 04.06.2014
comment
Для тех, кто все еще не понимает, правильно ли они ввели эти ключи: stackoverflow.com/questions/24082188/ показывает это точно - person simon_smiley; 01.10.2014
comment
и поместите их в правильное plist! (Сначала я редактировал test-plist вместо application-plist) - person longi; 03.11.2014

Единственное, что вам нужно сделать, это добавить ключ «NSLocationWhenInUseUsageDescription» в ваше приложение info.plist, затем создать метод CLLocationManager requestWhenInUseAuthorization и вызвать его в viewDidLoad.

person Tiago Sousa    schedule 06.06.2014
comment
На самом деле я запускаю его в делегате didFinishLoading, поскольку у меня нет CLLocationManager в контроллере карты, но он игнорируется даже после ввода записи в info.plist, всегда возвращая: Попытка запустить обновления местоположения MapKit без запроса авторизации местоположения. Сначала необходимо вызвать -[CLLocationManager requestWhenInUseAuthorization] или -[CLLocationManager requestAlwaysAuthorization]. - person Fabrizio Bartolomucci; 06.06.2014
comment
@FabrizioBartolomucci, когда вы вызываете requestWhenInUseAuthorization/requestAlwaysAuthorization, объект CLLocationManager был выделен локально? Если это так, он будет выпущен, когда вы выйдете из didFinishLoading, и когда пользователь нажмет «Разрешить», не будет диспетчера местоположений для сохранения результатов. Вам нужен глобальный/сильный ссылочный менеджер местоположения (я сделал его свойством моего делегата приложения). - person Timo Bruck; 07.06.2014
comment
@Tiago спасибо, но кто-то уже помог мне - мне не хватало кода - person Daij-Djan; 08.06.2014
comment
Забавно: этот код отлично работал в течение многих лет до iOS 8. На самом деле я помню, что запуск менеджера работал так же, как создание NSUrlConnection, что автоматически происходит при его сохранении. Возможно, это изменилось в iOS 8. Приятно знать, спасибо, скоро проверю. - person Fabrizio Bartolomucci; 09.06.2014
comment
Я проверил это. Моя переменная CLLocationManager безопасна вне метода. - person Fabrizio Bartolomucci; 10.06.2014
comment
И продолжает не работать. Команда Apple сообщила, что может не отвечать на вопросы о предварительном выпуске программного обеспечения, но подтвердила наличие проблемы с локализацией в iOS 8. Знаете ли вы, что здесь можно сообщать об ошибках в предварительном выпуске? - person Fabrizio Bartolomucci; 10.06.2014
comment
Некоторым может помочь редактор plist, щелкнув правой кнопкой мыши и выбрав показать Raw... Это позволит вам лучше видеть фактические имена ключей. - person dfowler7437; 25.06.2015

Как это происходит и с моим приложением objC — то, которое я ЗНАЮ, отлично работает под ios7 — я решил, что это должна быть ошибка ОС, и сообщил об этом: # 17128352

person Daij-Djan    schedule 03.06.2014
comment
Получаете ли вы какие-либо обновления по didUpdateToLocations в iOS 8?? Я не получаю никаких местоположений в делегате. - person amb; 04.06.2014
comment
если я зайду в настройки›конфиденциальность›службы определения местоположения и авторизую приложение, ПОКА оно запущено – то да! пока я не перезапущу приложение - person Daij-Djan; 04.06.2014
comment
исправление: он отключает авторизацию случайным образом - даже если я не перезагружаюсь :D - person Daij-Djan; 04.06.2014
comment
Ну, это помогло: if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { [self.locationManager requestAlwaysAuthorization]; } - person amb; 04.06.2014
comment
Имейте в виду, что ключ NSLocationAlwaysUsageDescription теперь является обязательным, поэтому вы должны включить его в свой plist. РЕДАКТИРОВАТЬ: является обязательным в зависимости от вашего метода авторизации местоположения. Для аутентификации в процессе использования используйте NSLocationWhenInUsageDescription - person amb; 04.06.2014
comment
@amb: ха, вот оно! пожалуйста, опубликуйте это как ответ - person Daij-Djan; 04.06.2014
comment
@Daij-Djan Я авторизовал приложение в настройках>конфиденциальность>службы определения местоположения. Но я все еще могу получить что-нибудь в func locationManager(manager: CLLocationManager!, didUpdateLocations locations: AnyObject[]!). У вас есть идеи, почему? Спасибо - person Jake Lin; 04.06.2014
comment
NSLocationWhenInUsageDescription у меня не сработало. он показал предупреждение, но независимо от того, нажал ли я «разрешить» или «запретить», ничего не изменилось, и делегат didChangeAuthorizationStatus не был вызван. (requestAlwaysAuthorization сработал). может это действительно баг. - person tomeron11; 20.07.2014

У меня был интересный случай с надстройкой клавиатуры, для которой требовалось местоположение.

Разрешение на использование местоположения клавиатуры всегда сбрасывалось. Вы можете запросить разрешение на определение местоположения в обоих из них по отдельности. Но в приложении Настройки iOS они обе представлены как одна запись с общим разрешением для двоих.

Оба (приложение и встроенная клавиатура) содержат Info.plist файлов. Важно, чтобы NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescription были указаны в обоих файлах Info.plist. Если пропустить NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescription в приложении Info.plist, то при открытии Приложения iOS сбросит полученное разрешение на клавиатуру!!!

person AndrewAnders    schedule 10.04.2020