Swift - 计步器CMPedometer的使用(获取用户步数、距离、速度等)
作者:hangge | 2017-02-15 08:10
1,CMPedometer介绍
- CMPedometer(计步器)是 CoreMotion 框架中的一个功能类,主要是保存有关步行(或跑步、爬楼)的一些信息。
- CMPedometer 同时能保存近7天的步数记录,并提供了查询近7天内任意时间段的步数信息。
- 想要使用 CMPedometer,系统最低版本需要是 iOS8(部分功能需要 iOS9)
2,使用样例
(1)程序启动后先判断设备是否支持计步器。
(2)如果支持的话则实时获取当天的用户运动数据,比如:跑步+走路的步数、距离、爬的楼层数、下的楼层数、当前移动速度。并将这些数据不断更新到界面上。

3,样例实现
(1)由于安全限制,首先我们要在 info.plist 文件中加入访问用户健康和运动信息的相关描述。

(2)样例代码
import UIKit
import CoreMotion
class ViewController: UIViewController {
//用于显示实时信息
@IBOutlet weak var textView: UITextView!
//计步器对象
let pedometer = CMPedometer()
override func viewDidLoad() {
super.viewDidLoad()
//开始计步器更新
startPedometerUpdates()
}
// 开始获取步数计数据
func startPedometerUpdates() {
//判断设备支持情况
guard CMPedometer.isStepCountingAvailable() else {
self.textView.text = "\n当前设备不支持获取步数\n"
return
}
//获取今天凌晨时间
let cal = Calendar.current
var comps = cal.dateComponents([.year, .month, .day], from: Date())
comps.hour = 0
comps.minute = 0
comps.second = 0
let midnightOfToday = cal.date(from: comps)!
//初始化并开始实时获取数据
self.pedometer.startUpdates (from: midnightOfToday, withHandler: { pedometerData, error in
//错误处理
guard error == nil else {
print(error!)
return
}
//获取各个数据
var text = "---今日运动数据---\n"
if let numberOfSteps = pedometerData?.numberOfSteps {
text += "步数: \(numberOfSteps)\n"
}
if let distance = pedometerData?.distance {
text += "距离: \(distance)\n"
}
if let floorsAscended = pedometerData?.floorsAscended {
text += "上楼: \(floorsAscended)\n"
}
if let floorsDescended = pedometerData?.floorsDescended {
text += "下楼: \(floorsDescended)\n"
}
if let currentPace = pedometerData?.currentPace {
text += "速度: \(currentPace)m/s\n"
}
if let currentCadence = pedometerData?.currentCadence {
text += "速度: \(currentCadence)步/秒\n"
}
//在线程中更新文本框数据
DispatchQueue.main.async{
self.textView.text = text
}
})
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
全部评论(4)
航哥要多久才能显示数据呀?
站长回复:很快,基本打开(授权后)就可以显示出来。
求问博主,我完全按照您的方法来做,可是程序一运行就crush了?报错是libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
站长回复:奇怪了,我重新有测试了下是没问题的啊,你再仔细检查下是不是哪里不对。
航哥求问一下获取健康里面的步数的原理和这个是一样的吗
站长回复:是的,健康里的步数和这个一样,都是从设备计步器里获取的。
奇怪 为什么我上楼下楼获取不到呢
站长回复:只要是5s以及之后的手机应该都是可以获取到,你看看系统“健康”里有爬楼数据吗?