検証環境
- XCode8.3.3
- Swift3.1
- iOS10.3.1
- iPhone6s+
歩数の取得
端末内の歩数はCMPedometer
で取得できる。
https://developer.apple.com/documentation/coremotion/cmpedometer
Info.plistにNSMotionUsageDescription
(Privacy - Motion Usage Description
に自動で置き換えられた)を追加して利用目的を書く必要がある。これがないとクラッシュする。
コード
以下のようなコードで簡単に歩数を取得することができた。handlerが実行されるのはメインスレッドではないので、UIを更新する場合は、メインスレッドでの実行が必要なので注意が必要。
startUpdates(from:withHandler:)
などでライブでデータを取得する場合はstopも呼ぶようにする。
@IBOutlet weak var label: UILabel!
var pedometer: CMPedometer!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
pedometer = CMPedometer()
let calendar = Calendar(identifier: .gregorian)
let date = calendar.date(from: DateComponents(year: 2017, month: 9, day: 4))!
// onetime
pedometer.queryPedometerData(from: date, to: Date()) { (data, error) in
guard let data = data else { return }
DispatchQueue.main.async {
self.label.text = "\(data.numberOfSteps)"
}
}
// always
pedometer.startUpdates(from: date) { data, error in
guard let data = data else { return }
DispatchQueue.main.async {
self.label.text = "\(data.numberOfSteps)"
}
}
}
deinit {
pedometer.stopUpdates()
}