2017-08-11 8 views
0

Ich benutze Swift, um eine iPhone App zu schreiben, die ein startendes und landendes Flugzeug verfolgt (wie durch eine Änderung des Luftdrucks angezeigt).iPhone-Höhe messen, während im Hintergrund läuft

Dafür muss ich den Luftdruck des iPhone messen, während es im Hintergrund läuft. Ich muss den Druck in Intervallen von mindestens einmal pro Minute für eine Dauer von einer Stunde oder 2 messen. Ich habe die Apple Developer Background Execution guide gelesen, aber ich glaube nicht, dass einer der Hintergrundmodi relevant ist; Beispielsweise dauert eine Aufgabe mit endlicher Länge nicht lange genug und eine Abrufaufgabe scheint zu selten zu sein.

Mein aktueller Code Luftdruck zu erhalten, ist wie folgt:

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 
     } 
} 

ich die operationQueue-.backgroundQoS dies geändert habe, aber wie ich es verstehe, das macht ihn nur eine niedrigere Priorität & aktualisiert erhalten hat nichts mit der Ausführung als Hintergrund zu tun (richtig?).

Gibt es noch etwas, ich kann versuchen, den Luftdruck in einer Hintergrundausführung regelmäßig zu erhalten? Ich kann mir nicht vorstellen, dass der Erhalt des Luftdrucks jede Minute eine enorme Menge an Energie verbrauchen würde, also würde ich hoffen, dass es möglich wäre.

Jede verfügbare Hilfe würde sehr geschätzt werden!

Danke,

Antwort

0

Sie sind richtig, das cos Attribut eines OperationQueue ändert nur seine Priorität, es background Einstellung nicht Ihre App im Hintergrund laufen lassen.

Um Höhendaten im Hintergrund zu erhalten, sollten Sie die CoreLocation-Bibliothek anstelle der CoreMotion verwenden und Hintergrundstandort-Updates verwenden.

Sie müssen Ihre Klasse CLLocationManagerDelegate konform machen, die Standortaktualisierungen starten und dann die folgende delegierte Methode implementieren:

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 
} 

Hinter den Kulissen wird das System höchstwahrscheinlich CMAltimeter mit den Höhendaten zu erhalten, aber es gibt keine API, um es in den Hintergrund zu bekommen, daher müssen Sie CoreLocation verwenden.

+0

CLLocation erhält die Höhe vom GPS, nicht vom Drucksensor. Aber wenn Sie die Daten nur einmal pro Minute für ein startendes/landendes Flugzeug benötigen, dann ist GPS sowieso gut genug und Sie werden die zusätzliche Empfindlichkeit des Drucksensors nicht benötigen. – fishinear

+0

Das ist gut zu wissen, obwohl 'CLLocation' seine Daten auch von' CMAlometer' bezieht. AFAIK hat leider leider keine API, um von dem Hintergrund auf 'CMAlometer' zuzugreifen und Updates von ihm zu erhalten. Daher ist die Verwendung von Standortaktualisierungen die einzige Möglichkeit, selbst wenn Sie eine bessere Genauigkeit benötigen. –

Verwandte Themen