LoginSignup
3

posted at

Organization

CoreMotionを使ってiPhoneから気圧を取得してみた

投稿の経緯

業務でiPhone標準搭載の気圧計を使った機能の開発をするかもしれなくなったので、事前に技術検証としてCoreMotionを触ったので記事にします。

環境

Mac Monterey 12.3.1
Swift 5.6
Xcode 13.3.1

サンプルアプリ

QR_017541.png
コードはGitHubにPushしています。気になる方はご覧ください。
https://github.com/ken-sasaki2/CleanArchitectureTraining

実装

ContentView.swift
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です。

Altimator.swift
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に気圧計が標準搭載されてるなんて知りませんでした。

ご覧いただきありがとうございました。
こうしたほうがいいや、ここはちょっと違うなど気になる箇所があった場合、ご教示いただけると幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3