当前位置: > > > Swift - 计步器CMPedometer的使用(获取用户步数、距离、速度等)

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()
    }
}
评论4
  • 4楼
    2018-09-12 00:23
    HCN

    航哥要多久才能显示数据呀?

    站长回复

    很快,基本打开(授权后)就可以显示出来。

  • 3楼
    2018-09-11 18:47
    HCN

    求问博主,我完全按照您的方法来做,可是程序一运行就crush了?报错是libc++abi.dylib: terminating with uncaught exception of type NSException (lldb)

    站长回复

    奇怪了,我重新有测试了下是没问题的啊,你再仔细检查下是不是哪里不对。

  • 2楼
    2017-04-22 20:39
    机器宝宝

    航哥求问一下获取健康里面的步数的原理和这个是一样的吗

    站长回复

    是的,健康里的步数和这个一样,都是从设备计步器里获取的。

  • 1楼
    2017-04-13 11:43
    白色729

    奇怪 为什么我上楼下楼获取不到呢

    站长回复

    只要是5s以及之后的手机应该都是可以获取到,你看看系统“健康”里有爬楼数据吗?