投稿の経緯
業務でiPhone標準搭載の気圧計を使った機能の開発をするかもしれなくなったので、事前に技術検証としてCoreMotionを触ったので記事にします。
環境
Mac Monterey 12.3.1
Swift 5.6
Xcode 13.3.1
サンプルアプリ
コードはGitHubにPushしています。気になる方はご覧ください。
https://github.com/ken-sasaki2/CleanArchitectureTraining
実装
import SwiftUI
struct ContentView: View {
private let altimator = Altimator()
var body: some View {
Button {
altimator.startUpdate()
} label: {
Text("気圧計起動")
.frame(width: 300, height: 44)
.background(.blue)
.foregroundColor(.white)
.font(.system(size: 20, weight: .semibold, design: .default))
.cornerRadius(25)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
viewはボタンタップで気圧計を起動させるシンプルなUIです。
import CoreMotion
final class Altimator {
var altimeter: CMAltimeter?
init() {
altimeter = CMAltimeter()
}
func startUpdate() {
guard let altimeter = altimeter else {
return
}
if CMAltimeter.isRelativeAltitudeAvailable() {
altimeter.startRelativeAltitudeUpdates(to: OperationQueue.main) { data, error in
if error == nil {
let altitude = data?.relativeAltitude.doubleValue
guard let pressure = data?.pressure.doubleValue else {
return
}
print("気圧", pressure * 10)
print("高度", altitude as Any)
self.stopUpdate()
} else {
// エラー対応
}
}
}
}
func stopUpdate() {
altimeter?.stopRelativeAltitudeUpdates()
}
}
気圧計を使うにはCoreMotionのCMAltimeterを使い、startRelativeAltitudeUpdates
で連続したデータ取得をおこないます。stopRelativeAltitudeUpdates
でデータの取得を終了させます。
CMAltimeterで取得できるpressureの単位はkPaなので10倍しておきます。
なお、シミュレーターでは取得できない模様。動作確認は実機でおこなってください。
おわりに
今回はCoreMotionを使った気圧計機能に関して記事を書きました。これまでiPhoneに気圧計が標準搭載されてるなんて知りませんでした。
ご覧いただきありがとうございました。
こうしたほうがいいや、ここはちょっと違うなど気になる箇所があった場合、ご教示いただけると幸いです。