Местоположение Услуги, не работающие в iOS 11
Я только что перестроил свое приложение с помощью iOS 11 SDK, пытаясь удалить blue banner
, который теперь всегда появляется. Я подумал: "Блестящий, это сработало", только чтобы обнаружить, что службы местоположения теперь вообще не работают.
Приложение, используемое для работы с iOS 10 - Кто-нибудь слышал что-нибудь?
Ответы
Ответ 1
Похоже, что яблоко добавило еще одну функцию конфиденциальности. Теперь пользователь может переопределить наш 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.
*/
Однако, после использования этого нового ключа - служба определения местоположения все еще не работала, при дальнейшем поиске я нашел этот жемчуг, смешанный со всей дополнительной информацией отладки:
Это приложение попыталось получить доступ к конфиденциальным данным без описания использования. Приложение Info.plist должно содержать как NSLocationAlwaysAndWhenInUseUsageDescription, так и NSLocationWhenInUseUsageDescription ключи со строковыми значениями, объясняющими пользователю, как приложение использует эти данные.
Это прямо противоречит комментарию, который я нашел в обновленном файле CLLocationManager.h
. Поэтому я создал радар.
Хорошие новости, если вы будете следовать советам консоли отладки, IE. добавьте новый ключ NSLocationAlwaysAndWhenInUseUsageDescription
и один из старых ключей NSLocationWhenInUseUsageDescription
, службы сервисов снова начнут работать.
Ответ 2
Просто добавьте шаги по исправлению этого:
2 способа сделать это:
A) Простой способ:
Выберите свой файл Info.plist, добавьте свойства, обратите внимание, что они начинаются с PRIVCY вместо LOCATION... поэтому точные имена этих переменных начинаются с "Privacy - Location..." и т.д., Добавляйте каждый здесь и описывайте, как пользователь будет видеть это при предупреждении.
B) Жесткий/интересный/программный способ (мне нравится больше):
Щелкните правой кнопкой мыши на вашем 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];
Это то, что отлично работает для меня, надеюсь, код будет работать и на вас.
Привет
Хайдер
Ответ 3
работающий под iOS11, я обнаружил, что Info.plist нуждается как минимум в NSLocationAlwaysAndWhenInUseUsageDescription в Info.plist:
![введите описание изображения здесь]()
Странно, когда ваше приложение многоязычное, локализованные версии ваших строк нуждаются в всех трех клавишах, упомянутых в этом сообщении else requestAlwaysAuthorization()
и locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
будет терпеть неудачу.
Снимок, показывающий немецкий перевод в качестве примера:
![введите описание изображения здесь]()
Надеюсь, это экономит ваше время, когда наткнулся на.
Ответ 4
Работа в 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>
Ответ 5
Следуй этим шагам:
Я столкнулся с той же проблемой с приложением, которому требовалась "Всегда авторизация", и решил ее, выполнив следующие действия:
1. Добавьте ключ NSLocationWhenInUseUsageDescription
в Info.plist
2. Добавьте NSLocationAlwaysAndWhenInUseUsageDescription
в Info.plist
3. Добавьте NSLocationAlwaysUsageDescription
в Info.plist
(для поддержки <iOS 11)
4. Вызовите requestWhenInUseAuthorization()
ПЕРЕД requestWhenInUseAuthorization()
requestAlwaysAuthorization(
)
Вы не можете выполнить requestAlwaysAuthorization() перед requestWhenInUseAuthorization(). Вы должны перейти на этот уровень разрешений. После внесения этих изменений обновления местоположения снова начали работать правильно.
Более подробную информацию можно найти здесь:
https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorization
Ответ 6
Лучше безопасно, чем жаль..
В iOS 11: добавьте ниже, и вы хорошо.
<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>
Ответ 7
Свифт: 3 Я столкнулся с той же проблемой. я был полностью облажен в поисках решения. вот как я исправил проблему.
Шаг 1: Файл проекта> Возможности> Фоновые режимы> выберите Обновление местоположения
Шаг 2: Добавьте NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription ключи в Info.plist
шаг 3 :
manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true
Ответ 8
Протестировано на iOS 12.2 с Swift 5
Шаг 1. Вы должны добавить следующие разрешения на конфиденциальность в файл plist
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Application requires users location for better user experience.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Application requires users location for better user experience.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Application requires users location for better user experience.</string>
Шаг 2. убедитесь, что у вас есть следующий код swift для получения текущего местоположения
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)
}
}