Я только что перестроил свое приложение с iOS 11 SDK в попытке удалить то, blue banner
что теперь всегда появляется. Я подумал: «Замечательно, это сработало», но обнаружил, что службы определения местоположения теперь вообще не работают.
Приложение для работы с iOS 10 - Кто-нибудь что-нибудь слышал?
Ответы:
Похоже, что Apple добавила еще одну функцию конфиденциальности. Теперь пользователь может изменить нашу
requestAlwaysAuthorization
версию и понизить ее до.requestWhenInUseAuthorization
Это означает, что мы, как разработчик, должны предоставить оба описания вInfo.plist
Я обнаружил, что они добавили новый ключ
NSLocationAlwaysAndWhenInUseUsageDescription
/* * Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the * NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription * keys must be specified in your Info.plist; otherwise, this method will do * nothing, as your app will be assumed not to support Always authorization. */
Однако после использования этого нового ключа служба определения местоположения все еще не работала, при дальнейшем поиске я обнаружил, что этот драгоценный камень смешан со всей дополнительной отладочной информацией:
Что прямо противоречит тому комментарию, который я нашел в обновленном
CLLocationManager.h
файле. Итак, я создал радар.Хорошие новости, если вы последуете советам консоли отладки IE. добавьте как новый ключ, так
NSLocationAlwaysAndWhenInUseUsageDescription
и один из старых ключейNSLocationWhenInUseUsageDescription
, службы локаций снова начнут работать.источник
NSLocationAlwaysUsageDescription
добавил в свой Info.plist необходимое мне разрешение. Но я получаю сообщение выше в консоли о том, что мне также нужно добавитьNSLocationWhenInUseUsageDescription
.startUpdatingLocation
илиrequestLocation
?startUpdatingLocation
Просто добавьте шаги по исправлению этого:
2 способа сделать это:
A) Простой способ: выберите файл Info.plist, добавьте свойства, обратите внимание, что они начинаются с PRIVCY вместо LOCATION ... поэтому точные имена этих переменных начинаются с "Privacy - Location ..." и т. Д., Добавьте каждый здесь, и опишите, как пользователь увидит это в предупреждении.
Б) Жесткий / интересный / программный способ (мне он нравится больше):
Щелкните правой кнопкой мыши свой Info.plist для своего приложения и выберите "Просмотреть исходный код", вы должны увидеть все это в XML,
Используйте другой формат ... и добавьте эти свойства следующим образом:
<key>NSLocationAlwaysUsageDescription</key> <string>Program requires GPS to track cars and job orders</string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>Program requires GPS to track cars and job orders</string> <key>NSLocationWhenInUseUsageDescription</key> <string>Program requires GPS to track cars and job orders</string> <key>NSMicrophoneUsageDescription</key> <string>This app uses your Microphone to allow Voice over IP communication with the Program Admin system</string>
Сохраните, а затем щелкните правой кнопкой мыши файл info.plist, а затем выберите Список свойств, это должно вернуть файл в представление по умолчанию.
РЕДАКТИРОВАТЬ:
Другой участник попросил код, вот он:
1) В вашем .H файле добавьте:
@property (strong, nonatomic) CLLocationManager *LocationManager;
2) В вашем .M файле добавьте функцию ViewDidAppear ():
_LocationManager = [[CLLocationManager alloc] init]; [_LocationManager setDelegate:self]; _LocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; _LocationManager.pausesLocationUpdatesAutomatically = NO; [_LocationManager requestAlwaysAuthorization]; _LocationManager.headingFilter = 5; _LocationManager.distanceFilter = 0; [_LocationManager startUpdatingLocation]; [_LocationManager startUpdatingHeading];
Это то, что отлично работает для меня, надеюсь, код будет работать и для вас.
С уважением
Хайдер
источник
viewwillAppear
и удаляю делегата вviewwilldisapper
. Если я захожу в настройку и выбираю уже выбранныйAllow Always
. Я получаю обновление только один раз и не более того. Любая идея, как это исправить. Заранее спасибо!!работая под iOS11, я обнаружил, что Info.plist нуждается как минимум в NSLocationAlwaysAndWhenInUseUsageDescription в Info.plist:
Как ни странно, когда ваше приложение многоязычно, локализованные версии ваших строк нуждаются во всех трех ключах, упомянутых в этом сообщении,
requestAlwaysAuthorization()
и неlocationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
будут работать без предупреждения.Снимок, показывающий немецкий перевод в качестве примера:
Надеюсь, это сэкономит вам время, когда вы наткнетесь.
источник
Работа в Swift 4.0.3
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>Description</string> <key>NSLocationAlwaysUsageDescription</key> <string>Will you allow this app to always know your location?</string> <key>NSLocationWhenInUseUsageDescription</key> <string>Do you allow this app to know your current location?</string>
источник
Следуй этим шагам:
Я столкнулся с той же проблемой с приложением, которому требовалась постоянная авторизация, и решил ее, выполнив следующие действия:
1. Добавьте
NSLocationWhenInUseUsageDescription
ключ вInfo.plist
2. Добавить
NSLocationAlwaysAndWhenInUseUsageDescription
вInfo.plist
3. Добавить
NSLocationAlwaysUsageDescription
вInfo.plist
(для поддержки <iOS 11)4. Звоните
requestWhenInUseAuthorization()
ДОrequestAlwaysAuthorization(
)Вы не можете выполнить requestAlwaysAuthorization () перед requestWhenInUseAuthorization (). Вы должны перейти на этот уровень разрешений. Как только я внес эти изменения, обновления местоположения снова начали работать правильно.
Более подробную информацию можно найти здесь:
https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorization
источник
Лучше перестраховаться, чем сожалеть. В iOS 11: добавьте нижеприведенное, и все будет хорошо.
<key>NSLocationWhenInUseUsageDescription</key> <string>Description</string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>Description</string> <key>NSLocationAlwaysUsageDescription</key> <string>Description</string>
источник
Протестировано на iOS 12.2 с Swift 5
Шаг 1. вы должны добавить следующие разрешения конфиденциальности в файл plist
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>Application requires user’s location for better user experience.</string> <key>NSLocationAlwaysUsageDescription</key> <string>Application requires user’s location for better user experience.</string> <key>NSLocationWhenInUseUsageDescription</key> <string>Application requires user’s location for better user experience.</string>
Шаг 2. Убедитесь, что у вас есть следующий быстрый код, чтобы получить текущее местоположение
import UIKit import MapKit import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate { // MARK: Variables declearations @IBOutlet weak var mapView: MKMapView! var locationManager: CLLocationManager! // MARK: View Controller life cycle methods override func viewDidLoad() { super.viewDidLoad() //TODO: Make user you must add following three privacy permissions in plist //NSLocationWhenInUseUsageDescription //NSLocationAlwaysAndWhenInUseUsageDescription //NSLocationAlwaysUsageDescription getCurrentLocation() } func getCurrentLocation() { if (CLLocationManager.locationServicesEnabled()) { locationManager = CLLocationManager() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestAlwaysAuthorization() locationManager.startUpdatingLocation() } } // MARK: Location Manager Delegate methods func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { let locationsObj = locations.last! as CLLocation print("Current location lat-long is = \(locationsObj.coordinate.latitude) \(locationsObj.coordinate.longitude)") showOnMap(location: locationsObj) } func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { print("Get Location failed") } func showOnMap(location: CLLocation ) { let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude) let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)) mapView.setRegion(region, animated: true) } }
источник
Swift: 3 Я столкнулся с той же проблемой. я был полностью облажался, когда нашел решение. вот как я исправил проблему.
шаг 1: Файл проекта> Возможности> фоновые режимы> выберите Обновление местоположения
Шаг 2: Добавьте ключи NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription в Info.plist
шаг 3 :
manager.pausesLocationUpdatesAutomatically = false manager.allowsBackgroundLocationUpdates = true
источник