Мое приложение, которое отлично работало на iOS 7, не работает с iOS 8 SDK.
CLLocationManager
не возвращает местоположение, и я не вижу свое приложение в меню « Настройки» -> « Службы определения местоположения» . Я сделал поиск Google по этому вопросу, но ничего не пришло. Что может быть не так?
Ответы:
Я решил свою собственную проблему.
Очевидно в iOS 8 SDK,
requestAlwaysAuthorization
(для фонового местоположения) илиrequestWhenInUseAuthorization
(местоположение только, когда передний план)CLLocationManager
требуется вызов перед запуском обновлений местоположения.Там также должно быть
NSLocationAlwaysUsageDescription
илиNSLocationWhenInUseUsageDescription
ключInfo.plist
с сообщением , которое будет отображаться в строке. Добавление их решило мою проблему.Надеюсь, это поможет кому-то еще.
РЕДАКТИРОВАТЬ: Для получения более подробной информации, посмотрите на: Core-Location-Manager-Changes-in-ios-8
источник
Я тащил свои волосы с той же проблемой. Xcode дает вам ошибку:
Но даже если вы реализуете один из вышеперечисленных методов, он не будет запрашивать пользователя, если в info.plist отсутствует запись для
NSLocationAlwaysUsageDescription
илиNSLocationWhenInUseUsageDescription
.Добавьте следующие строки в ваш info.plist, где строковые значения представляют причину, по которой вам нужно получить доступ к местоположению пользователя.
Я думаю, что эти записи могли отсутствовать с тех пор, как я запустил этот проект в Xcode 5. Я предполагаю, что Xcode 6 может добавить записи по умолчанию для этих ключей, но не подтвердил.
Вы можете найти больше информации об этих двух настройках здесь
источник
Чтобы обеспечить обратную совместимость с iOS 7, необходимо проверить, работает ли пользователь под управлением iOS 8 или iOS 7. Например:
источник
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
requestAlwaysAuthorization
метод. Мое дополнительное решение было использовать эту линию вif
заявлении вместо обычного вызова метода:[self.locationManager performSelector:@selector(requestAlwaysAuthorization)];
. Может быть, это очевидно для других людей, но мне понадобилось время, чтобы понять. Я думаю, что это правильное решение, пока не будет выпущен финальный Xcode 6.__IPHONE_OS_VERSION_MAX_ALLOWED
(#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
)И в ваш файл info.plist
источник
Согласно документации Apple:
Начиная с iOS 8, наличие значения
NSLocationWhenInUseUsageDescription
илиNSLocationAlwaysUsageDescription
ключа в файле Info.plist вашего приложения является обязательным. Затем также необходимо запросить разрешение у пользователя до регистрации обновлений местоположения, позвонив по телефону[self.myLocationManager requestWhenInUseAuthorization]
или в[self.myLocationManager requestAlwaysAuthorization]
зависимости от ваших потребностей. Строка, введенная вами в Info.plist, будет отображаться в следующем диалоговом окне.Если пользователь дает разрешение, это обычное дело. Если они отказывают в разрешении, то делегат не информируется об обновлениях местоположения.
источник
Оба эти ключа принимают строку
источник
Мое решение, которое может быть скомпилировано в Xcode 5:
источник
Старый код для запроса местоположения не будет работать в iOS 8. Вы можете попробовать этот метод для авторизации местоположения:
источник
В iOS 8 вам нужно сделать две дополнительные вещи, чтобы заставить работать локацию: добавить ключ в ваш Info.plist и запросить авторизацию у менеджера локаций, попросив его запустить
info.plist:
Добавьте это в свой код
источник
Одна распространенная ошибка для разработчиков Swift:
Сначала убедитесь, что вы добавили значение в список для
NSLocationWhenInUseUsageDescription
илиNSLocationAlwaysUsageDescription
.Если вы все еще не видите всплывающее окно с запросом авторизации, посмотрите, вставляете ли вы строку
var locationManager = CLLocationManager()
вviewDidLoad
метод вашего View Controller . Если вы это сделаете, то даже если вы позвонитеlocationManager.requestWhenInUseAuthorization()
, ничего не появится. Это связано с тем, что после выполнения viewDidLoad переменная locationManager освобождается (очищается).Решение состоит в том, чтобы найти строку
var locationManager = CLLocationManager()
в верхней части метода класса.источник
Прежде
[locationManager startUpdatingLocation];
, добавьте запрос сервисов определения местоположения iOS8:Отредактируйте приложение
Info.plist
и добавьте ключNSLocationAlwaysUsageDescription
со строковым значением, которое будет отображаться пользователю (например,We do our best to preserve your battery life.
)Если ваше приложение нуждается в услугах определения местоположения только при открытом приложении, замените:
requestAlwaysAuthorization
сrequestWhenInUseAuthorization
иNSLocationAlwaysUsageDescription
сNSLocationWhenInUseUsageDescription
.источник
Я работал над приложением, которое было обновлено до iOS 8, и службы определения местоположения перестали работать. Вы, вероятно, получите ошибку в области отладки примерно так:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
Я сделал наименее навязчивую процедуру. Сначала добавьте
NSLocationAlwaysUsageDescription
запись в ваш info.plist:Обратите внимание, что я не заполнил значение для этого ключа. Это все еще работает, и я не обеспокоен, потому что это приложение в доме. Кроме того, уже есть заголовок с просьбой использовать службы определения местоположения, поэтому я не хотел делать ничего лишнего.
Далее я создал условное для iOS 8:
После этого
locationManager:didChangeAuthorizationStatus:
метод вызывается:И теперь все отлично работает. Как всегда, ознакомьтесь с документацией .
источник
Решение с обратной совместимостью:
Настройте ключ NSLocationWhenInUseUsageDescription в вашем Info.plist
источник
locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error
. Однако он забыл добавить startUpdatingLocation в оператор if, поэтому после того, как они его принимают или отклоняют, он фактически не вызывает startUpdateLocation.Решение с обратной совместимостью, которое не выдает предупреждений Xcode:
NSLocationWhenInUseUsageDescription
Ключ настройки в вашемInfo.plist
.Для iOS версии 11.0+ :
NSLocationAlwaysAndWhenInUseUsageDescription
ключ настройки в вашемInfo.plist
. вместе с другими 2 ключами.источник
Это проблема с ios 8 Добавьте это к своему коду
и в info.plist:
источник
NSLocationUsageDescription
не используется на iOS8 +Чтобы получить доступ к местоположению пользователя в iOS 8, вам нужно будет добавить
При этом у пользователя будет запрашиваться разрешение на получение его текущего местоположения.
источник
Objective-C Процедура Следуйте приведенным ниже инструкциям:
Для iOS-11 Для iOS 11 посмотрите на этот ответ:доступ к местоположению iOS 11
Необходимо добавить два ключа в список и предоставить сообщение, как показано на рисунке ниже:
Для iOS-10 и ниже:
Методы делегирования
Быстрая процедура
Следуйте инструкциям ниже:
Для iOS-11 Для iOS 11 посмотрите на этот ответ: доступ к местоположению iOS 11
Необходимо добавить два ключа в список и предоставить сообщение, как показано на рисунке ниже:
Для iOS-10 и ниже:
Методы делегирования
источник
Для тех, кто использует Xamarin , мне пришлось добавить ключ
NSLocationWhenInUseUsageDescription
в info.plist вручную, так как он не был доступен в раскрывающихся списках ни в Xamarin 5.5.3 Build 6, ни в XCode 6.1 - толькоNSLocationUsageDescription
был в списке, и это привелоCLLocationManager
к продолжению молча провалитьсяисточник
источник
Маленький помощник для всех вас, у которых более одного файла Info.plist ...
Он добавит необходимый тег ко всем файлам Info.plist в текущем каталоге (и подпапках).
Другой это:
Это добавит ваше описание ко всем файлам.
источник
Храните информацию о Cocoa Keys всегда под рукой для этих обновлений, вот ссылка:
https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26
Наслаждаться.
источник
Я получаю похожую ошибку в iOS9 (работа с Xcode 7 и Swift 2): при попытке запуска обновлений местоположения MapKit без запроса авторизации местоположения. Сначала необходимо вызвать [CLLocationManager requestWhenInUseAuthorization] или - [CLLocationManager requestAlwaysAuthorization]. Я следовал учебному пособию, но он использовал iOS8 и Swift 1.2. В Xcode 7 и Swift 2 есть некоторые изменения, я нашел этот код, и он прекрасно работает для меня (если кому-то нужна помощь):
Наконец, я поместил это в info.plist: список свойств информации: NSLocationWhenInUseUsageDescription Значение: приложению нужны серверы местоположения для персонала
источник
Для того, чтобы получить доступ к местоположению пользователей в iOS. Вам нужно добавить два ключа
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
в файл Info.plist.
Смотрите это изображение ниже.
источник
Добавьте ключ
NSLocationWhenInUseUsageDescription
илиNSLocationAlwaysUsageDescription
(фоновое использование GPS) со строкой, предлагающей использовать GPS на каждойinfo.plist
из каждой цели.Запросите разрешение, запустив:
[self initLocationManager: locationManager];
Где
initLocationManager
находитсяПомните, что если ключи не на каждой
info.plist
для каждой цели, приложение не спросит пользователя.if
Обеспечивает совместимость с прошивкой 7 иrespondsToSelector:
метод гарантирует совместимость в будущем , а не только решение вопроса для прошивки 7 и 8.источник
Проблема для меня заключалась в том, что этот класс был
CLLocationManagerDelegate
закрытым, что препятствовало вызову всех методов делегата. Думаю, это не очень распространенная ситуация, но я подумал, что упомяну это, если кто-нибудь поможет.источник
Я добавляю эти клавиши в
InfoPlist.strings
в прошивкой 8.4, IPad мини 2. Это тоже работает. Я не ставлю никаких ключей, какNSLocationWhenInUseUsageDescription
, например , в моемInfo.plist
.InfoPlist.strings :
База на этом потоке , по его словам
as in iOS 7
, может быть локализована в InfoPlist.strings. В моем тесте эти ключи можно настроить прямо в файлеInfoPlist.strings
.ОБНОВИТЬ:
Я думаю, что
@IOS
метод лучше. Добавить ключInfo.plist
с пустым значением и добавить локализованные строки вInfoPlist.strings
.источник