计步器 -- 做自己的微信运动

作者: redye | 来源:发表于2015-11-30 17:10 被阅读2601次

    微信运动

    最近微信新添加了一个很有趣的东西 -- 微信运动,相信已经有很多人都已经关注了,然后会每天都去看一眼自己今天走的步数,如果抢占了封面那就更好了。
    其实早在 iOS7 苹果就已经有计步器的接口了,但是在微信运动出现之前我还不知道它的存在而已。

    计步器

    要使用计步器的功能,要使用到 CoreMotion 框架,CoreMotion 分装了与一系列与运动相关的 API:


    屏幕快照 2015-11-30 下午4.23.48.png

    从 CoreMotion 头文件中可以很明显的看出,与计步相关的 API 乃是 CMStepCounter.h,很好,我们进入到头文件查看一下,好吧,看到的第一句是什么呢?

    NS_CLASS_DEPRECATED_IOS(7_0,8_0,"Use CMPedometer     instead") __TVOS_PROHIBITED __WATCHOS_PROHIBITED 
    @interface CMStepCounter : NSObject
    

    也就是说,CMStepCounter 在 iOS7 启用,iOS8 已经被废弃了,你可以使用 CMPedometer 代替(Pedometer 计步器、计数器,好吧,请原谅我的英语水平,值认识简单常用的单词,就光看名字直接句直stepCounter 去了╮(╯▽╰)╭)。

    好了,那我们还是去看看 CMPedometer 吧。

    CMPedometer

    在使用 CMPedometer 之前,你需要了解到一件事情 -- 并不是所有的设备都支持记步功能的,所以在使用之前,你需要判断你的设备是否支持。还记得吗,在加入微信运动的时候,会提示你查看你的设备是否支持微信运动,下面列出了一堆支持微信运动,怎么支持微信运动的用户引导。

    • 第一步,判断设备是否支持
      //判断是否支持记步
      if (![CMPedometer isStepCountingAvailable]) {
      UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"温馨提示" message:@"您的设备不支持记步" preferredStyle:UIAlertControllerStyleAlert];
      UIAlertAction *alertAction = [UIAlertAction actionWithTitle:@"我知道了" style:UIAlertActionStyleDefault handler:nil];
      [alertController addAction:alertAction];
      [self presentViewController:alertController animated:YES completion:nil];
      return;
      }

    CMPedometer 的头文件中,你可以看到一系列包括 distancefloorpacecadence是否支持在内的判断(后两者在 iOS9 以后支持),所以判断设备是否支持着希望功能是必要的,当然这些都需要在真机上测试才可以,而且我试过在 mini 上是不支持的(我使用的 mini4)。

    • 第二步,可以查询过去某段时间内走过的步数

        [_pedometer queryPedometerDataFromDate:[NSDate dateWithTimeInterval:-24*60*60 sinceDate:localDate] toDate:localDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
            if (error) {
                NSLog(@"查询错误 %@", error);
                return ;
            }
            NSLog(@"%@", pedometerData);
            dispatch_async(dispatch_get_main_queue(), ^{
                weakSelf.stepLabel.text = [NSString stringWithFormat:@"%@", pedometerData];
            });
        }];
      
    • 第三步,更新从某个时间开始的步数变化
      [_pedometer startPedometerUpdatesFromDate:[NSDate dateWithTimeInterval:-246060 sinceDate:localDate] withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error) {
      if (error) {
      NSLog(@"更新错误 %@", error);
      return ;
      }
      NSLog(@"%@", pedometerData);
      dispatch_async(dispatch_get_main_queue(), ^{
      weakSelf.stepLabel.text = [NSString stringWithFormat:@"%@", pedometerData];
      });
      }];
      试着走几步,你回发现数据是在变化的,可能会有一点延迟。CMPedometerData 类对象 pedometerData 中可以访问到你当前走过的步数、距离、上楼、下楼、步速、节奏等数据,可以根据需要解析。

    • 第四步,停止更新
      [_pedometer stopPedometerUpdates];

    Demo

    Demo 戳这里下载。

    相关文章

      网友评论

      • F麦子:怎么不能下载啊?发我一份demo吧,楼主 1790462158@qq.com,谢谢
        redye:可以在仓库目录下下载。
      • 记忆淡忘中:大神 你好 获取到的步数怎么绑定用户呢?就是上传到服务器,如果用户某一天没登录app,那么看那一天的步数是不是就是0了呢?
        redye:@记忆淡忘中 这个就要结合业务场景,寻找最适合的方案了
        记忆淡忘中:更换设备登录就不准了..
        redye:@记忆淡忘中 可以获取到历史数据的
      • 方振:QQ在后台退出,为什么还能计步呢,iphone6,开着网络,健康数据不允许读取。。。
        redye:@方振 推荐这篇文章http://www.jianshu.com/p/e01c5869d95c,上面有说到时间的问题。你说的 拒绝访问 是什么?
        方振:@redye 现在健康数据与qq是不同的,我拒绝访问了
        redye:@方振 微信和QQ都是通过访问健康数据来获得步数的,你可以使用 HealthKit 框架试试
      • 不要动:4s能用吗
        不要动:@ios新手 870629388@qq.com
        不要动:@redye 能发你的demo给我吗
        redye:@ios新手 iOS 8 以上
      • 走向菜鸟的菜鸟:123792055@qq.com 楼主demo赐我一份吧,谢谢.
        redye:@Root_t 明天吧,现在电脑没在
      • Aaron丶丶:有没有试过 将设备时间 调后几天,查询当天的运动数据 就无效了呢
        redye:@Aaron丶丶 这个倒是没有试过呢。
      • 勇往直前NO1:楼主能把demo给个么,链接里下不到,谢谢! 我的[_pedometer queryPedometerDataFromDate:[NSDate dateWithTimeInterval:-24*60*60 sinceDate:localDate] toDate:localDate withHandler:^(CMPedometerData * _Nullable pedometerData, NSError * _Nullable error)这个方法没有数据返回??


        redye:@7abb39f89472 已经发送了
        勇往直前NO1:1476270552@qq.com
      • 脱下国际篮化身程序猿:能把demo赐我看一下吗 下载链接不好用诶 谢谢 作者好人
        redye:@脱下国际篮化身程序猿 已经发送了,请查收。
        脱下国际篮化身程序猿:@redye 610856912@qq.com 谢谢楼主大人
        redye:@脱下国际篮化身程序猿 邮箱?
      • Yoon__:不及时 有什么解决方法
        redye:@ydb 试试 HealthKit
      • ryugaku:参考了 好像跟淘汰的CMStepCounter差不多
        redye:@ryugaku API都基本差不多😂
      • 睡不醒的小也:我也想要demi,最近也在学计步器。能发个给我吗?496995284@qq.con 谢谢
        redye:@LeoMabi 我的失误,已发送 :blush:
        睡不醒的小也:@redye 提示页面不存在啊
        redye:@LeoMabi 我已经将下载链接放上面了哦😉
      • karen我心永恒:厉害啊!

      本文标题:计步器 -- 做自己的微信运动

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