#swift #gps #cllocationmanager #ios12 #horizontal-accuracy
#swift #gps #cllocationmanager #ios12 #горизонтальная точность
Вопрос:
Год назад я выпустил приложение для гольфа, основанное на GPS. Для наилучшего использования требуется высокая горизонтальная точность. С момента выпуска приложения все работало нормально (iOS 10 на тот момент была последней версией операционной системы). Теперь клиенты сообщают о плохой точности с iOS12, в основном, в сочетании с производными iPhone X.
Я смог восстановить проблему на своих устройствах разработки. На iPhone X точность по горизонтали <5 м больше недостижима. Раньше проблем не было. На iPhone 6s такой уровень точности достигается в редких случаях. На обоих устройствах была установлена iOS 12.2.
Вот соответствующий код в моем приложении:
Определение переменной в классе:
var locationManager: CLLocationManager = CLLocationManager()
При просмотре загружался, который я поставил:
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.requestAlwaysAuthorization()
locationManager.startUpdatingLocation()
Тогда der — это следующая функция для определения местоположения ( latestLocation
), которая обрабатывается в коде (здесь не показана):
func locationManager(_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation])
{
let latestLocation: CLLocation = locations[locations.count - 1]
horizontalAccuracy.text = String(format: "%.1f",latestLocation.horizontalAccuracy)
if latestLocation.horizontalAccuracy <= 5.1 {
horizontalDistance.backgroundColor = UIColor.green
} else if latestLocation.horizontalAccuracy <= 10.1 {
horizontalDistance.backgroundColor = UIColor.yellow
} else {
horizontalDistance.backgroundColor = UIColor.red
}
// remark: this sets the background color of a label according to
achieved horizontal accuracy. Since iOS12 the maximum achieved level of accuracy with an iPhone X is medium (yellow background color).
/*
Some code processing location data
*/
}
В общем, код выполняется, как ожидалось, но на основе данных низкой точности. Что-то упущено в iOS 12 или есть способ обеспечить более высокую точность? Спасибо за вашу помощь!
Комментарии:
1. Я только что запустил тестовое приложение на iPhone 8 (12.2), iPhone 8 Plus (12.2), iPad Air 2 (12.2) и iPhone X (12.1.4) — все получили точность 5 м. На iPhone XR (12.2) точность была между 3.5 и 4.1, так что я не думаю, что есть общая проблема. Точность GPS сильно зависит от местоположения и окружающей среды
2. Спасибо, Пол. Использует ли ваше тестовое приложение тот же или аналогичный код, что описан выше. Я изменил приведенный выше код kCLLocationAccuracyBest на kCLLocationAccuracyBestForNavigation. Однако точность никогда не была выше 6,0 м (iPhone X, iOS12.2).
3. По сути, то же самое, за исключением того, что я использовал Swift. Я также установил тип активности в
.fitness
— gist.github.com/paulw11/ea199a76b8e624ebb2ff3d809f022b13 . В какой среде вы находитесь? Я тестировал на открытом воздухе, в полевых условиях. Здесь нет зданий, высоких гор или деревьев — по сути, те же условия, что и на поле для гольфа. Телефон был у меня в руке, а не в кармане.4. Еще раз спасибо за ваш быстрый отзыв. С тем же кодом — установив тип fitness и сохранив kCLLocationAccuracyBest — я достигаю после некоторого времени ожидания точности по горизонтали 6 м. Очевидно, что существуют разные уровни точности .. переход к 12 м, затем к 8 м и, наконец, к 6 м по горизонтали, как к наилучшему достигнутому значению. Раньше я испытывал 10 м и, наконец, 5 м в лучшем случае. У меня такое ощущение, что в моем приложении kCLLocationAccuracyBest в сочетании с . фитнес работает лучше всего (быстрее всего достигает наилучшего достижимого уровня точности).