美文网首页专业帮助需求驱动
IOS 计步器功能 Healthkit和CMPedometer

IOS 计步器功能 Healthkit和CMPedometer

作者: 贪吃鱼 | 来源:发表于2016-03-08 13:36 被阅读2092次

这几天在弄计步功能, 找了好久看了几篇零散的文章, 我自己做了总结, 我忘了我看文章的地址了, 没法附上转载连接了

CMPedometer 可以访问用户活动(可以访问计步数据) 适用ios8以上的系统 ios可看最下面说明

Healthkit 是ios系统中的健康应用 需要应用授权来访问健康数据(比如计步)

这两个有什么区别呢?
其实 Healthkit 也是 使用 CMPedometer 读取用户的步数和走的里程,当然计算的方法是在手机内部计算的, 它是利用 iphone5s 以上的m处理器来获取数据计算了,所以5s以下的设备是不支持 CMPedometer 手机计步的,当然有大牛可以利用重力传感器和加速度传感器一样可以写出自己的计步器软件,我是个菜鸟只能利用系统的拉

Healthkit计步有个缺点, 计步不准,有人会问了:这个 Healthkit 和我下面的 demo 不都是用 CMPedometer 来获取计步数的,为什么 Healthkit 不准呢?
答: 那是因为Healthkit记录的时区问题, ios获取时间的时区按中国的时区少了8个小时, 举个例子, 如果我要记录 5月5日的数据应该是 xxxx-05-05 00:00:00 至xxxx-05-05 23:59:59 这个区间的步数情况, 而 Healthkit 记录的时区却是 xxxx-05-04 16:00:00 至 xxxx-05-05 15:59:59 ,所以Healthkit记录的信息是不准的, 如果要是自己开发计步软件呢,我们就要自己写把, 不要获取 Healthkit 的信息啦

以下demo是用 swift语言写的

定义个全局变量  如果不是全局变量会报错
let pedonmeter:CMPedometer = CMPedometer()

在方法里面写, 两种方法用哪个都可以,不明白的地方可以看文档
//判断该设备是否支持计步功能
if CMPedometer.isStepCountingAvailable(){

//开始时间
let startTime = getStartTime()
//结束时间
let endTime = getEndTime()
//第一种
//获取一个时间范围内的数据最大7天   参数 开始时间,结束时间, 一个闭包
pedonmeter.queryPedometerDataFromDate(startTime, toDate:endTime, withHandler: { (pedometerData:CMPedometerData?, error:NSError?) -> Void in
                if error != nil{
                    print("error:\(error)")
                }
                else{
                    print("开始时间:\(startTime)")
                    print("结束时间:\(endTime)")
                    print("步数===\(pedometerData!.numberOfSteps)")
                    print("距离===\(pedometerData!.distance)")
                }
            })
        }

//第二种
//获取指定开始时间到当前时间的数据  参数 开始时间, 一个闭包
pedonmeter.startPedometerUpdatesFromDate(startTime, withHandler: { (pedometerData:CMPedometerData?, error:NSError?) -> Void in
                if error != nil{
                    print("error:\(error)")
                }
                else{
                    print("开始时间:\(startTime)")
                    print("结束时间:\(endTime)")
                    print("步数===\(pedometerData!.numberOfSteps)")
                    print("距离===\(pedometerData!.distance)")
                }
            })

下面是获取时间的方法,我是获取当天的,你们也可以自己改


/**
     获取当前时区的时间
     */
    func getEndTime() -> NSDate
    {
        //转换成本地时区
        let date = NSDate()
        let zone = NSTimeZone.systemTimeZone()
        let interval = zone.secondsFromGMTForDate(date)
        let nowDate = date.dateByAddingTimeInterval(Double(interval))
        return nowDate
    }
/**
     获取开始时间 当天0时0分0秒
     */
    func getStartTime() -> NSDate
    {
        let datef = NSDateFormatter()
        datef.dateFormat = "yyyy-MM-dd"
        let stringdate = datef.stringFromDate(getEndTime())
        print("当天日期:\(stringdate)")
        let tdate = datef.dateFromString(stringdate)
        //获取本地时区的当天0时0分0秒
        let zone = NSTimeZone.systemTimeZone()
        let interval = zone.secondsFromGMTForDate(tdate!)
        let nowday = tdate!.dateByAddingTimeInterval(Double(interval))
        return nowday
    }

执行结果:

Paste_Image.png

我当天走了 3107步 距离 2公里多

如果你像支持ios7的话那不就能使用CMPedometer

CMPedometer 的前身是 CMStepCounter

大家可以参考http://www.aichengxu.com/view/27076

相关文章

  • iOS Healthkit和CMPedometer区别

    转IOS 计步器功能 Healthkit和CMPedometer文/贪吃鱼(简书作者)原文链接:http://ww...

  • IOS 计步器功能 Healthkit和CMPedometer

    这几天在弄计步功能, 找了好久看了几篇零散的文章, 我自己做了总结, 我忘了我看文章的地址了, 没法附上转载连接了...

  • iOS通过CMPedometer实现计步器

    CMPedometer是iOS8以后推出的CoreMotion框架中用于获取用户运动信息的类,我们可以获取到用户活...

  • swift5计步器的使用

    swift5计步器的使用 5之前有个过期的计步器对象,今天我们使用最新的对象CMPedometer

  • iOS计步器,HealthKit应用杂谈

    需求:1.最近需要在APP当中增加记步功能,提升用户的活跃率。并且希望能够保留用户的健康数据。2.根据苹果健康的数...

  • iOS HealthKit 健康应用

    iOS HealthKit笔记 iOS HealthKit框架使用 如何使项目能够使用HealthKit 获取读取...

  • iOS HealthKit功能

    1.如下图所示 在Xcode中打开HealthKit功能 2.在需要的地方#import (这里我为了方便直接在v...

  • iOS计步器CMPedometer不走回调的bug

    startPedometerUpdatesFromDate这个方法在手机今日没有步数的情况下CMPedometer...

  • 探索iOS计步器功能

    我的一个朋友是从事外出销售工作,老板不但要看他每天的业绩,也会去关注他每天在某个APP的行走步数。你应该知道的,业...

  • iOS 实现计步器功能

    现在越来越多的人关注运动和健康,iOS系统也在很早的时候就自带了健康APP,下面详细描述一下在我们开发中,怎么实现...

网友评论

  • 记忆淡忘中:你好 你获取到的步数有没有绑定用户的?就是不仅是单纯的获取健康数据里的步数 还要上传到服务器的那种...
    贪吃鱼:@记忆淡忘中 这个不需要你APP一直运行啊,运行的时候去调用一下就可以,就可以获取手机为你记录好的步数
    记忆淡忘中:@贪吃鱼 就是因为步数一直在变 而app不可能一直都在运行 所以就不好弄了 大神 求支招:sob:
    贪吃鱼:@记忆淡忘中 这个功能是你APP开发做的啊,你的应用去绑定啊
  • 261dd7577af0:可以有个oc的demo吗? 菜鸟一枚
  • Damonwong:你的时间是错误的。
    Clemo:对用00:00-59:59获取一天的少了十几步,请问是什么原因??
  • Aaron丶丶:如果用 CMPedometer 还需要授权应用么 不授权会不会有被拒的风险
  • JohnQ:还有用真机调试的时候error:Optional(Error Domain=CMErrorDomain Code=103 "(null)")
  • JohnQ:楼主 为什么我把你的swift翻译成object-c后获取的数据还是从八点后开始获取
    贪吃鱼:@JohnQ 我现在就是默认时间,跟微信和QQ是一样的
    JohnQ:不是这样的,微信和QQ都经过了再次的处理,它们也都是取从零点开始到当前时间段的数据
    贪吃鱼:@JohnQ 不清楚啊,不过微信,QQ和其它的一些计步软件都是按错误的时间的,重众吧,就按默认的时间就可以
  • 脑子勺掉了吧你:菜鸟都会swift了

    贪吃鱼:@脑子勺掉了吧你 大神也不是一步成的
  • 孤独感爆棚:不错,赞一个。目前正在纠结用那个好,一语惊醒梦中人!
  • 62135e5f4323:真牛逼啊,厉害

本文标题:IOS 计步器功能 Healthkit和CMPedometer

本文链接:https://www.haomeiwen.com/subject/gmdzkttx.html