1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【swift】CMPedometerで歩数を取得する

Posted at

#swiftで歩数を取得するぞ!
appleが提供しているコアモーションというフレームワークの,
歩数まわりを取り扱うCMPedometerを使います.
公式ドキュメント

意外とつまづいたので備忘録のようなものです.
swift初学者なので間違ってたら教えてください:flushed:

##stepCountとCMPedometer
前はCMStepCounterというのがあったらしい.
今は非推奨のようなのでCMPedometerを使います.

##準備

  • CoreMotionをインポートする
    ...その前にプロジェクト名をクリックして出てくる画面でCoreMotionのフレームワークを追加しておきます.
    framework.png

  • Info.plistに書き込む
    適当なところに行を追加して
    KeyにPrivacy - Motion Usage Description
    TypeをString,Valueに使用用途を入力する.
    初めて使う時に使っていいか聞くやつです.
    これがないとクラッシュなんとかってエラーが出てきます.

##コードを書きます!

ViewController.swift
let pedometer = CMPedometer()

//CMPedometerが利用可能かどうか
if CMPedometer.isStepCountingAvailable() {

    //計測
    pedometer.startUpdates(from: Date(), withHandler: {(pedometerData, error) in
        if let e = error {
            print(e.localizedDescription)
            return
        }
        guard let data = pedometerData else {
            return
        }
        let step = data.numberOfSteps
        DispatchQueue.main.async {
            label.text = "\(step) 歩"
        }
    })
}

//終わらせたいタイミングで
pedometer.stopUpdates()

CMPedometer()はメンバ変数になるようにしないと不具合が起きるっぽいです
###isStepCountingAvailable
まずデバイスでCMPedometerが利用可能か調べます
Bool値で返ってきます

###startUpdatesとstartPedometerUpdatesFromDate
調べてるとstartPedometerUpdatesFromDateというのも出てくるが,
Xcodeでは無いと言われる:disappointed_relieved:

startUpdatesのドキュメント
startPedometerUpdatesFromDateのドキュメント

多分引数にNSDateを使うかDateを使うかという違いなのかなと思う.
NSDateは非推奨らしいので,Dateを使うstartUpdatesを使います.

####queryPedometerDataは?
過去の指定期間の歩数を取得するメソッド
queryPedometerDataのドキュメント

startUpdatesは過去の指定日時から現在までのデータを取得出来ます.

###startUpdatesの引数について
Date()メソッドを宣言した時にその時点の時刻を取得できるので
これを計測しはじめの時刻として第一引数に渡してます

第二引数にはCMPedometerHandlerを渡します.
{(pedometerData, error) in 処理}と書いているところです.
CMPedometerHandlerのドキュメント

###DispatchQueue.main.async
ラベルに歩数を表示する時にメインスレッドに非同期処理しないと遅延するらしいのでこうしています.
(...それでも表示遅いと感じます:thinking:)

##CMPedometerData
CMPedometerでは歩数以外にも推定移動距離や移動ペース,階段を登った段数など色々取得できます
CMPedometerで取得できるデータ


なんだか似たようなものが使えたり使えなかったり混乱したのでまとめてみました.
他にもHealthCareを使ったものもあるみたいです:zipper_mouth:

###参考にしました
https://faboplatform.github.io/SwiftDocs/4.coremotion/003_coremotion/
https://teratail.com/questions/90251

1
1
0

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
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?