Swift - 计步器CMPedometer的使用(获取用户步数、距离、速度等)
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() } }
航哥要多久才能显示数据呀?
求问博主,我完全按照您的方法来做,可是程序一运行就crush了?报错是libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)
航哥求问一下获取健康里面的步数的原理和这个是一样的吗
奇怪 为什么我上楼下楼获取不到呢