Измерьте высоту iPhone во время работы в фоновом режиме
Я использую Swift для написания приложения для iPhone, которое отслеживает взлет и посадку самолета (на что указывает изменение давления воздуха).
Для этого мне нужно измерить давление воздуха в iPhone, пока он работает в фоновом режиме. Мне нужно измерять давление с интервалами, по крайней мере, один раз в минуту в течение часа или 2. Я прочитал руководство по выполнению Apple Developer Background Execution, но я не думаю, что какой-либо из фоновых режимов уместен; например, задача конечной длины не длится достаточно долго, и задача извлечения кажется слишком редкой.
Мой текущий код для получения давления воздуха выглядит следующим образом:
let opQueue = OperationQueue.current!
opQueue.qualityOfService = .background
altimeter.startRelativeAltitudeUpdates(to: opQueue) { (data, error) in
print ("Pressure returned")
//If pressure returned from iPhone correctly:
if let data = data {
self.localPressure = convertPressure(data.pressure.doubleValue, fromUnit: .kPa, toUnit: .hPa) //In hPa
}
}
Я изменил QoS
этого operationQueue
в .background
, но, насколько я понимаю, это просто делает этот приоритет более низким для обновления и не имеет ничего общего с запуском в фоновом режиме (правильно?).
Есть ли что-нибудь еще, что я могу попытаться периодически получать давление воздуха при фоновом исполнении? Я не могу себе представить, что получение давления воздуха каждую минуту или около того потребует огромного количества энергии, поэтому я надеюсь, что это будет возможно.
Любая доступная помощь будет высоко ценится!
Спасибо,
1 ответ
Вы правы, cos
атрибут OperationQueue
только меняет приоритет, устанавливая его background
не заставит ваше приложение работать в фоновом режиме.
Что касается получения данных о высоте в фоновом режиме, вы должны использовать CoreLocation
библиотека, а не CoreMotion
и использовать фоновые обновления местоположения.
Вы должны заставить свой класс соответствовать CLLocationManagerDelegate
, запустите обновления местоположения и затем реализуйте следующий метод делегата:
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let currentLocation = locations.last else { return }
let altitude = currentLocation.altitude
//use altitude to check whether plane is taking off or landing
}
За кулисами система, скорее всего, использует CMAltimeter
чтобы получить данные о высоте, но нет API, чтобы получить его в фоновом режиме, поэтому вы должны использовать CoreLocation
,