swift -- 计步器CMPedometer的使用

最近公司接了个项目,是一款运动类型的APP,可以检测运动量(例如:步数,上下楼等)、睡眠信息、速度等信息,因为以前粗略的了解过传感器方面的相关信息,知道主要是苹果设备内置的传感器在起作用,传感器的种类也很多,有兴趣的可以去查看苹果官方文档或者查阅大神们的博客都可以找到!但是一直也没有自己写一下,做个测试:

话不多说,代码如下:

1、准备

//    计步器
    var myTextView = UITextView()
    var pedometer = CMPedometer()
var myBtn = UIButton()

2、在plist文件中添加相关权限描述:

Privacy - Motion Usage Description  :String    计步器需要获取您的运动信息

3、具体代码如下:

    myBtn.frame = CGRect(x:10,y:360,width:kScreenWidth-20,height:50)
    myBtn.setTitle("按钮", for: .normal)
    myBtn.setTitle("倒计时中", for: .disabled)
    myBtn.backgroundColor = UIColor.orange
    myBtn.setTitleColor(UIColor.white, for: .normal)
    myBtn.setTitleColor(UIColor.blue, for: .disabled)
    myBtn.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
    self.view.addSubview(myBtn)

func btnClick(){
   self.startPedometerUpdates()
        
    }

//    ---------------------------------计步器--------------------------------------------
func creatPedometer(){
    myTextView.frame = CGRect(x:20,y:100,width:kScreenWidth-20,height:200)
    self.view.addSubview(myTextView)
    
//        创建触发按钮
    myBtn.frame = CGRect(x:10,y:360,width:kScreenWidth-20,height:50)
    myBtn.setTitle("按钮", for: .normal)
//        myBtn.setTitle("倒计时中", for: .disabled)
    myBtn.backgroundColor = UIColor.orange
//        myBtn.setTitleColor(UIColor.white, for: .normal)
//        myBtn.setTitleColor(UIColor.blue, for: .disabled)
    myBtn.addTarget(self, action: #selector(btnClick), for: .touchUpInside)
    self.view.addSubview(myBtn)
}

//    开始获取步数统计数据
func startPedometerUpdates(){
    
//     判断设备支持情况
    guard CMPedometer.isStepCountingAvailable() else {
        self.myTextView.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 #available(iOS 9.0, *) {
                if let currentPace = pedometerData?.currentPace {
                    text += "速度: \(currentPace)m/s\n"
                }
            } else {
                // Fallback on earlier versions
            }
            if #available(iOS 9.0, *) {
                if let currentCadence = pedometerData?.currentCadence {
                    text += "速度: \(currentCadence)步/秒\n"
                }
            } else {
                // Fallback on earlier versions
            }
            
//                在线程中更新文本框数据
            DispatchQueue.main.async {
                
                self.myTextView.text = text
            }
            
    })
    

然后,测试了下,亲自去爬了3层楼梯,如下图:

基本的实现就完成了!

posted @ 2017-08-15 11:07  稻草人11223  阅读(683)  评论(0编辑  收藏  举报
返回顶部