计步器对于 iOS 开发来说应该门槛很低,苹果爸爸给做的很清楚明了了,调用 API 就可以了。 使用计步器可以做哪些事情呢?具体如下: 1.查询历史步数记录,最多七天的 2.实时更新当天的数据 3.查询行走的步数、距离、上下的楼层、实时监测你的速度

##查询计步器数据的两个方法: 1.查询计步器在指定时间范围内的数据。

func queryPedometerData(from start: Date, to end: Date, withHandler handler: @escaping CMPedometerHandler)
复制代码

2.指定一个起始时间,更新截止到现在的数据。

func startUpdates(from start: Date, withHandler handler: @escaping CMPedometerHandler)
复制代码

计步器可以通过调用stopPedometerUpdates来停止更新。

##源码分析 ###CMPedometer 类

@available(iOS 8.0, *)
open class CMPedometer : NSObject {// 返回一个布尔值,指示当前设备上是否有步数计数。open class func isStepCountingAvailable() -> Bool// 返回一个布尔值,指示距离估计是否在当前设备上可用。open class func isDistanceAvailable() -> Bool// 返回一个布尔值,指示当前设备是否可以使用楼层计数。open class func isFloorCountingAvailable() -> Bool// 返回一个布尔值,指示当前设备上是否有速度信息可用。@available(iOS 9.0, *)open class func isPaceAvailable() -> Bool// 返回一个布尔值,指示节奏信息是否在当前设备上可用。@available(iOS 9.0, *)open class func isCadenceAvailable() -> Bool// 返回一个布尔值,指示当前设备是否可以使用计步器事件。@available(iOS 10.0, *)open class func isPedometerEventTrackingAvailable() -> Bool// 查询指定时间内的计步器的历史记录。 数据最多可以使用7天,距离结束日期最近的7天。 结果返回串行队列。open func queryPedometerData(from start: Date, to end: Date, withHandler handler: @escaping CoreMotion.CMPedometerHandler)// 开始一系列持续的计步器更新。 对于每个更新,应用程序自此以后将会收到从指定的开始日期所累积的步数。open func startUpdates(from start: Date, withHandler handler: @escaping CoreMotion.CMPedometerHandler)// 停止更新计步器open func stopUpdates()// 在串行队列上启动计步器事件更新。事件仅在应用程序在前台/后台运行时可用。@available(iOS 10.0, *)open func startEventUpdates(handler: @escaping CoreMotion.CMPedometerEventHandler)// 停止启动计步器事件更新。@available(iOS 10.0, *)open func stopEventUpdates()
}复制代码

###CMPedometerData 类

 // 这是 CMPedometerData 类,就是为我们访问到的硬件设备所记录的数据。类中包括的属性有步数、速度、楼层等信息
@available(iOS 8.0, *)
open class CMPedometerData : NSObject, NSSecureCoding, NSCopying {// 开始日期:计步器数据有效期间的开始时间,这是会话或历史查询请求的开始时间。open var startDate: Date { get }// 结束日期:计步器数据有效期的结束时间。对于更新而言,这是最新更新的截止时间时间。 对于历史查询这是所请求的结束时间。open var endDate: Date { get }// 用户的步数open var numberOfSteps: NSNumber { get }// 距离: 行走时用户行驶的预计距离(米)open var distance: NSNumber? { get }// 上的楼梯数: 上的楼梯大致数量open var floorsAscended: NSNumber? { get }// 下的楼梯数: 下的楼梯大致数量open var floorsDescended: NSNumber? { get }/*当前速度对于更新,将以s / m(每米秒)返回当前速度。如果以下任何一项为真,则值为零:(1)信息尚未公布;(2)历史查询;(3)不支持的平台。*/@available(iOS 9.0, *)open var currentPace: NSNumber? { get }// 当前的步速: 步/秒@available(iOS 9.0, *)open var currentCadence: NSNumber? { get }// 平均速度@available(iOS 10.0, *)open var averageActivePace: NSNumber? { get }
}
复制代码
// 计步器运动类型: 是个枚举类型,枚举值为:暂停 和 继续
@available(iOS 10.0, *)
public enum CMPedometerEventType : Int {case pausecase resume
}复制代码

###CMPedometerEvent 类

// 标志用户活动变化事件的类@available(iOS 10.0, *)
open class CMPedometerEvent : NSObject, NSSecureCoding, NSCopying {//  事件发生的时间。open var date: Date { get }// 描述行人活动过渡的事件类型。上边的枚举open var type: CMPedometerEventType { get }
}// CMPedometerHandler 类型别名,是一个当计步器数据可用时要调用的函数块。参数为CMPedometerData 和 Error, 无返回值
public typealias CMPedometerHandler = (CMPedometerData?, Error?) -> Swift.Void@available(iOS 10.0, *)
public typealias CMPedometerEventHandler = (CMPedometerEvent?, Error?) -> Swift.Void复制代码

到此就看完整个CMPedometer的属性方法了,那么如何使用呢?

##========== 华丽丽分割线,上示例代码 ============

**注意:**支持 iOS10.0 以上设备,并且在我们访问设备数据的时候需要在 info.plist 文件中添加键值:Privacy - Motion Usage Description 如图:

当你运行程序的时候,就会提醒你,和访问相机权限一样。

以下是实现代码:

//  ViewController.swift
//  Pedometer
//  Created by YHY on 2017/3/19.
//  Copyright © 2017年 太阳在线. All rights reserved.import UIKit
import CoreMotionclass ViewController: UIViewController {let pedometer = CMPedometer()@IBOutlet weak var stepNumber: UITextView!@IBOutlet weak var stepNumber1: UITextView!override func viewDidLoad() {super.viewDidLoad()// 更新当日的步数getPedometerData()// 获取历史记录步数getSometimePedometer()}func getPedometerData() {//判断设备支持情况guard CMPedometer.isStepCountingAvailable() else {self.navigationItem.title = "当前设备不支持获取步数"return}//获取今天凌晨时间let calendar = Calendar.currentprint(calendar)var components = calendar.dateComponents([.year, .month, .day], from: Date())print(components)components.hour = 0components.minute = 0components.second = 0let date = calendar.date(from: components)!//初始化并开始实时获取数据self.pedometer.startUpdates(from: date) { (pedometerData, error) in//错误处理guard error == nil else {print(error!)return}//获取各个数据var stepData = "---今日运动数据---\n"if let numberOfSteps = pedometerData?.numberOfSteps {stepData += "今日已走\(numberOfSteps)步\n"print(stepData)}if let distance = pedometerData?.distance {stepData += "今日已走\(distance)米\n"print(stepData)}if let floorsAscended = pedometerData?.floorsAscended {stepData += "今日上楼\(floorsAscended)层\n"print(stepData)}if let floorsDescended = pedometerData?.floorsDescended {stepData += "今日下楼\(floorsDescended)层\n"print(stepData)}//print(pedometerData?.currentPace,pedometerData?.currentCadence)if let currentPace = pedometerData?.currentPace {stepData += "步行速度\(currentPace)m/s\n"print(stepData)}if let currentCadence = pedometerData?.currentCadence {stepData += "步速为 \(currentCadence)步/秒"print(stepData)}//在线程中更新文本框数据DispatchQueue.main.async{self.stepNumber.text = stepData}}}func getSometimePedometer() {let date = Date()print(date)//判断设备支持情况guard CMPedometer.isStepCountingAvailable() else {self.navigationItem.title = "当前设备不支持获取步数"return}let dataoformatter = DateFormatter()dataoformatter.dateFormat = "yyyy-MM-dd HH:mm:ss"let string = dataoformatter.string(from: date)print(string)let fromeDate = dataoformatter.date(from: "2017-03-11 00:00:00")let toDate = dataoformatter.date(from: string)var stepData = "---查询历史运动数据---\n"// 查询从 fromeDate 到 toDate 走的步数pedometer.queryPedometerData(from: fromeDate!, to: toDate!) { (pedometerData, error) in//获取各个数据if let numberOfSteps = pedometerData?.numberOfSteps {stepData += "已走\(numberOfSteps)步\n"print(stepData)}if let distance = pedometerData?.distance {stepData += "已走\(distance)米\n"print(stepData)}if let floorsAscended = pedometerData?.floorsAscended {stepData += "上楼\(floorsAscended)层\n"print(stepData)}if let floorsDescended = pedometerData?.floorsDescended {stepData += "下楼\(floorsDescended)层\n"print(stepData)}//print(pedometerData?.currentPace,pedometerData?.currentCadence)if let currentPace = pedometerData?.currentPace {stepData += "步行速度\(currentPace)m/s\n"print(stepData)}if let currentCadence = pedometerData?.currentCadence {stepData += "步速为 \(currentCadence)步/秒"print(stepData)}DispatchQueue.main.async{self.stepNumber1.text = stepData}}}
}复制代码

Demo 下载

CMPedometer 计步器的使用—— 基于API分析相关推荐

  1. 基于API HOOK的软件行为分析系统

    基于API HOOK的软件行为分析系统 目录 软件安全课程设计 1 基于API HOOK的软件行为分析系统 1 一.课程设计题目 1 基于API HOOK的软件行为分析系统 1 二.课程编码:1306 ...

  2. 实战:基于技术分析的Python算法交易

    译者 | Tianyu 出品 | AI科技大本营(ID:rgznai100) 本文是用 Python 做交易策略回测系列文章的第四篇.上个部分介绍了以下几个方面内容: 介绍了 zipline 回测框架 ...

  3. 基于软件分析的智能化开发新型服务与技术

    摘要:从云服务厂商的角度来给大家介绍一下,当前业界围绕该领域要做哪些事情. 本文分享自华为云社区<基于软件分析的智能化开发新型服务与技术>,作者:敏捷的小智 . 本文以技术文章的方式回顾梁 ...

  4. 基于论文分析Google的张量处理器TPU

    本文转载自微信公众号CPUinNUDT,由<基于论文分析Google的张量处理器TPU>及<基于论文分析Google的张量处理器TPU(补充)>两篇文章合并而成,如有相关问题, ...

  5. 知乎日报 API 分析(解决跨域精简版)

    特别感谢 知乎日报 API 分析 声明 以下所有 API 均由知乎(Zhihu.Inc)提供,本人灵感均来自知乎日报 API 分析,对于原来的分析进行了一些个人的整改,如有不当之处请告知本人,本人立即 ...

  6. 基于原理分析Nmap——活跃主机发现、端口扫描、服务探测、伪装技术、NSE脚本

    参考书籍<诸神之眼--Nmap网络安全审计技术揭秘> 李华峰 著 清华大学出版社 基于原理分析Nmap 1. 活跃主机发现技术 1.1 基于ARP协议 1.2 基于ICMP协议 1.2.1 ...

  7. 基于系统日志分析进行异常检测

    日志解析:https://github.com/logpai/logparser 异常检测:https://github.com/logpai/loglizer 预备知识:需要对逻辑回归.决策树.SV ...

  8. CodeGen API分析

    CodeGen API分析 作为使用命令行界面的替代方法,开发人员可以使用核心CodeGen环境编写自定义工具或实用程序来生成代码,从而将CodeGen更紧密地集成到开发环境中. 为了实现这一点,Co ...

  9. 基于Python分析深圳程序员工资有多高?

    基于Python分析深圳程序员工资有多高? 概述 前言 统计结果 爬虫技术分析 爬虫代码实现 爬虫分析实现 后记 前言 多图预警.多图预警.多图预警.校招季,毕业也多,跳槽也多.我们的职业发展还是要顺 ...

最新文章

  1. 监控组件_分布式监控组件Cat,如何实现万亿级消息的高效存储?
  2. 【 MATLAB 】用 MATLAB 实现离散时间傅里叶变换(DTFT)的两个案例分析
  3. so 问题来了,你现在值多少钱?
  4. 线性选择算法的递归实现和循环实现
  5. cdr 表格自动填充文字_「Excel技巧」Excel也可以实现自动填充26英文字母编号
  6. php 管理员表和用户表,求discuz的管理员数据表和用户数据表结构
  7. 贝叶斯概率推断(一):贝叶斯思维
  8. 高三计算机专业vb试题二答案,高三计算机专业VB试题(二).doc
  9. CentOS 7安装和配置ssh
  10. 使用讯飞tts实现安卓语音中文合成播报
  11. 工作总结—HMC5883L应用的一些说明
  12. 15个免费好用的抓包工具
  13. 服务器维护 灵魂兽,魔兽世界7.0新灵魂兽麋鹿捕捉方法
  14. 存储空间不足,无法完成此操作
  15. Appium+夜神模拟器模拟人为操作
  16. 在线文档协作进行项目管理
  17. SpringBoot--简单处理高并发demo
  18. C++数据类型占据多少个字节
  19. 微信官方小店小程序老徐解析
  20. LAMP系统构建论文

热门文章

  1. Python tailer模块的使用
  2. 【python向日葵】愿我们的生活像向日葵一样灿烂~~~
  3. 容器(docker)
  4. python 动态壁纸
  5. asp.net 的 web form 过时了吗?
  6. 4种CSS文字竖排方法
  7. 给你的钥匙贴个标签,就不用担心找不到了
  8. 计算机中的英语六级作文万能模板,英语六级作文万能模板(4篇)
  9. Mac苹果电脑怎样输入表情符号?
  10. Linux三剑客awk之行和列