2017-08-11 22 views
0

私はSwiftを使って離陸と着陸を追跡するiPhoneアプリケーションを作成しています(空気圧の変化によって示されます)。バックグラウンドでiPhoneの高度を測定する

このためには、バックグラウンドでiPhoneの気圧を測定する必要があります。私は1時間または2分間少なくとも毎分1回の間隔で圧力を測定する必要があります。私はApple Developer Background Execution guideを読んでいますが、背景モードのどれも関連しているとは思わない。たとえば、有限長のタスクが長く続くことはなく、フェッチタスクがあまりにも少ないようです。次のように空気圧を取得するために

私の現在のコードは次のとおりです。

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

が、私はこののQoSoperationQueue.backgroundに変更されましたが、私はそれを理解するように、これは単に&を更新取得するには、この優先順位が低くなりますバックグラウンドでの実行(正しい?)とは何の関係もありません。

バックグラウンド実行時に気圧を定期的に取得できる他の方法はありますか?私は気圧を毎分あるいはそれ以上にすることは大量の電力を使うことを想像できませんので、可能であることを願っています。

ご迷惑をおかけして申し訳ございません。

おかげで、

答えて

0

あなたは正しいですが、OperationQueuecos属性のみがその優先順位を変更し、backgroundに設定すると、あなたのアプリがバックグラウンドで実行することはありません。

高度データをバックグラウンドで取得するには、CoreMotionではなくCoreLocationライブラリを使用し、バックグラウンドの場所の更新を使用する必要があります。

あなたは、あなたのクラスはCLLocationManagerDelegateに適合させる位置情報の更新を開始し、次のデリゲートメソッドを実装する必要があります。システムは、おそらく標高データを取得するためにCMAltimeterを使用して、舞台裏

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 
} 

を、バックグラウンドで取得するAPIはないので、CoreLocationを使用する必要があります。

+0

CLLocationは、圧力センサからではなく、GPSから高度を取得します。しかし、着陸している飛行機に1分間に1回だけデータが必要な場合、GPSはとにかく十分です。圧力センサーの感度を上げる必要はありません。 – fishinear

+0

これは良いことですが、私は 'CLLocation'も' CMAltimeter'からデータを取得します。しかしAFAIKには悲しいことに、バックグラウンドから 'CMAltimeter'にアクセスしてアップデートを受け取るAPIがないので、より正確な精度が必要な場合でもロケーションアップデートを使用する唯一の方法です。 –

関連する問題