[iOS 8] iPhone 6 / iPhone 6 Plus で使える新機能! CMAltimeter で高度を取得する

iPhone 6 / iPhone 6 Plus で使える高度計機能!

iOS 8 の Core Motion フレームワークに CMAltimeter という高度に関連するデータを取得することができる API が追加されました。このクラスを使うと現在位置の高度を取得することができます。なお M8 モーションコプロセッサ搭載デバイス (iPhone 6 / iPhone 6 Plus) から利用できます。

CMAltimeter を使ってみよう

ということで早速使ってみましょう。まずプロジェクトを作成し Core Motion フレームワークを追加します。

pedometer01

それでは実装です。

let altimeter = CMAltimeter()
func showAltimeter() {
    if CMAltimeter.isRelativeAltitudeAvailable() {
        println("CMAltimeter 利用可能")
        altimeter.startRelativeAltitudeUpdatesToQueue(NSOperationQueue.mainQueue(), withHandler: {
            [unowned self] data, error in
            if error != nil {
                // エラー
                self.label.text = "エラー : \(error)"
                println("エラー : \(error)")
            } else {
                self.label.text = "Relative Altitude: \(data.relativeAltitude)"
            }
        })
    } else {
        println("CMAltimeter 利用不可")
        self.label.text = "CMAltimeter 利用不可"
    }
}

まず初めに行っているのが実行デバイスで高度を計測可能かどうか CMAltimeter#isRelativeAltitudeAvailable を呼び出します。実行可能な場合のみ CMAltimeter#startRelativeAltitudeUpdatesToQueue:withHandler: で高度データの取得を開始しています。第一引数には取得結果のハンドラを実行するキューを渡します。UI の更新など、メインスレッドで処理したい場合は NSOperationQueue#mainQueue でメインキューの NSOperationQueue オブジェクトを取得して渡します。

第二引数には高度データを取得したときに呼び出す (CMAltitudeData!, NSError!) -> Void のハンドラを渡します。高度データは CMAltitudeData オブジェクトとして渡されます。このオブジェクトの relativeAltitude プロパティが高度です。初めに呼び出したときが基準値 = 0 になり、2回目以降は基準値からの相対距離が渡されます。呼び出したときに地上からの高度が取れるわけではないので注意してください。また、計測を終了したいときは CMAltimeter#stopRelativeAltitudeUpdates を呼びます。

実行すると次のようになります。

altimeter

本日(2014/09/19)、弊社大橋が iPhone 6 を早速購入したので、速攻で試させてもらいました!w

まとめ

高度は今までにない新しい情報ですよね。例えば登山中に現在の標高を表示したりするような、スポーツ用のアプリにも使えそうです。

参考