Измерьте высоту 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,

Другие вопросы по тегам