iOS利用HealthKit框架从健康app中获取步数信息

微信和QQ的每日步数最近十分火爆,我就想为自己写的项目中添加一个显示每日步数的功能,上网一搜好像并有相关的详细资料,自己动手丰衣足食。

统计步数信息并不需要我们自己去实现,iOS自带的健康app已经为我们统计好了步数数据

我们只要使用HealthKit框架从健康app中获取这个数据信息就可以了

这篇文章对HealthKit框架进行了简单的介绍:http://www.cocoachina.com/ios/20140915/9624.html

对HealthKit框架有了简单的了解后我们就可以开始了

1.如下图所示 在Xcode中打开HealthKit功能

2.在需要的地方#import <HealthKit/HealthKit.h>(这里我为了方便直接在viewController写了所有代码,我也在学习这个框架,个人感觉把获取数据权限的代码放在AppDelegate中更好)

获取步数分为两步1.获得权限  2.读取步数

3.代码部分

@interface ViewController ()

@property (nonatomic, strong) HKHealthStore *healthStore;

@end

在- (void)viewDidLoad中获取权限

- (void)viewDidLoad {
    [super viewDidLoad];

    //查看healthKit在设备上是否可用,ipad不支持HealthKit
    if(![HKHealthStore isHealthDataAvailable])
    {
        NSLog(@"设备不支持healthKit");
    }

    //创建healthStore实例对象
    self.healthStore = [[HKHealthStore alloc] init];

    //设置需要获取的权限这里仅设置了步数
    HKObjectType *stepCount = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];

    NSSet *healthSet = [NSSet setWithObjects:stepCount, nil];

    //从健康应用中获取权限
    [self.healthStore requestAuthorizationToShareTypes:nil readTypes:healthSet completion:^(BOOL success, NSError * _Nullable error) {
        if (success)
        {
            NSLog(@"获取步数权限成功");
            //获取步数后我们调用获取步数的方法
            [self readStepCount];
        }
        else
        {
            NSLog(@"获取步数权限失败");
        }
    }];

}

读取步数

//查询数据
- (void)readStepCount
{
    //查询采样信息
    HKSampleType *sampleType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];

    //NSSortDescriptors用来告诉healthStore怎么样将结果排序。
    NSSortDescriptor *start = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierStartDate ascending:NO];
    NSSortDescriptor *end = [NSSortDescriptor sortDescriptorWithKey:HKSampleSortIdentifierEndDate ascending:NO];

    /*查询的基类是HKQuery,这是一个抽象类,能够实现每一种查询目标,这里我们需要查询的步数是一个
    HKSample类所以对应的查询类就是HKSampleQuery。
    下面的limit参数传1表示查询最近一条数据,查询多条数据只要设置limit的参数值就可以了
     */
    HKSampleQuery *sampleQuery = [[HKSampleQuery alloc] initWithSampleType:sampleType predicate:nil limit:1 sortDescriptors:@[start,end] resultsHandler:^(HKSampleQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable results, NSError * _Nullable error) {
        //打印查询结果
        NSLog(@"resultCount = %ld result = %@",results.count,results);
        //把结果装换成字符串类型
        HKQuantitySample *result = results[0];
        HKQuantity *quantity = result.quantity;
        NSString *stepStr = (NSString *)quantity;
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{

            //查询是在多线程中进行的,如果要对UI进行刷新,要回到主线程中
            NSLog(@"最新步数:%@",stepStr);
        }];

    }];
    //执行查询
    [self.healthStore executeQuery:sampleQuery];
}

4.现在,我们就已经能够从健康app中读取步数信息了

5.附上一个简单的小demo:  https://github.com/wl356485255/ReadStepCount (注意更改Bundle ID,并且使用真机进行调试)

6.我现在也在学习HealthKit框架对这个框架还是比较陌生的,上面只实现了简单的获取步数信息(其他信息也可以通过相同方式获取),代码中有不足的地方希望能够指出。

时间: 2024-09-30 21:00:18

iOS利用HealthKit框架从健康app中获取步数信息的相关文章

[iOS微博项目 - 2.2] - 在app中获取授权

github: https://github.com/hellovoidworld/HVWWeibo   A.发送授权请求 1.使用UIWebView加载请求页面 自定义一个继承UIViewController的HVWOAuthViewController 1 // 2 // HVWOAuthViewController.m 3 // HVWWeibo 4 // 5 // Created by hellovoidworld on 15/2/4. 6 // Copyright (c) 2015年

PowerShell_零基础自学课程_6_PS中获取帮助信息详解、管道、格式化输

前些文章陆续的说了一些关于这些主题,但是讨论的都不够深入,今天我们深入的了解一下获取帮助信息.管道以及格式化输出的内容. 一.获取帮助信息 在PS中获取帮助信息,最常用的有: -? .get-command和get-help.这三者获取的信息不是完全一致的,并且由于get-command和get-help是cmdlet:因此具有很多实用 的参数来帮助我们获取我们想要的信息. 1.1  -? 参数 如果我们知道某个cmdlet的拼写,但是不知道他的用户,那么最快速的方法就是用:-? 参数. 例如:

objective-c中如何从UIImage中获取像素信息

翻译自Obtaining pixel data from a UIImage UIImage是我们在ios中非常熟悉的数据结构了,用它来存储图片非常方便.在OpenCV类库中,使用是另外的数据结构来存储图片,这时,我们就面临一个问题:如何才能把UIImage装换为其他类库也能识别的数据结构呢? 尽管不同的图片处理类库有不同的数据结构来处理图片,但是有一种结构是被所有的图片处理类库所识别的,那就是raw格式,也称之为原生格式.在raw格式中,每个像素通过一个unsigned byte的数组来表示,

从BIRT报表文件中获取页面设置信息(页边距、纸张大小、输出方向)的方法

报表打印时,尤其是套打的报表,页面设置信息非常重要,比如页边距,纸张大小,输出方向等,而且每个报表的相关参数有可能不同,因此相关参数从具体报表中获取是一个非常正常而且合理的想法. 如果采用BIRT作为报表的开发工具,报表设计器负责报表的制作,BIRT运行时负责处理报表文件,对于浏览器来说,BIRT后端输出的是网页,并不包含页面设置相关信息,浏览器有自己的打印设置选项,也不会从网页中读取,但是报表设计器在报表设计时提供页面设置信息的设置界面,因此我们需要通过运行时API手工写代码从具体报表中获取页

python进阶四(类的继承)【4-5 python中获取对象信息】

python中获取对象信息 拿到一个变量,除了用 isinstance() 判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢? 例如,已有定义: 1 class Person(object): 2 def __init__(self, name, gender): 3 self.name = name 4 self.gender = gender 5 6 class Student(Person): 7 def __init__(self, name, gender, score

Flutter 中获取设备信息 以及 获取地 理位置

一.Flutter 中获取设备信息 https://pub.dev/packages/device_info 设备信息代码 import 'package:flutter/material.dart';import 'package:device_info/device_info.dart'; class DevicPage extends StatefulWidget{ DevicPage({Key key}); _DevicPage createState() => _DevicPage()

利用 pyspider 框架抓取猫途鹰酒店信息

利用框架 pyspider 能实现快速抓取网页信息,而且代码简洁,抓取速度也不错. 环境:macOS:Python 版本:Python3. 1.首先,安装 pyspider 框架,使用pip3一键安装: pip3 pyspider 2.终端输入 pyspider all 启动 pyspider: 打开 Chrome,地址栏输入 localhost:5000 进入 pyspider 框架的webui界面. 点击 create ,创建 一个新的project. 3.创建完 project 后,我们便

Lua 与C/C++ 交互系列:动态注册枚举enum到Lua Code中,在运行时在Lua Code中获取内省信息

在Lua 5.1 Reference Manual  对于Lua 值和类型的介绍.Lua是一个动态语言,在Lua中变量仅仅有值而没有类型.所以在Lua中的变量不需要声明.所以的值本身包含类型. 其实Lua 包含一种运行时类型识别,通过type()函数,可以在运行时获取值的类型. 信息来自: Lua 5.1 Reference Manual  Values and Types Lua is a dynamically typed language. This means that variable

JAVA代码中获取JVM信息

一.JAVA中获取JVM的信息 原理,利用JavaSDK自带的ManagementFactory类来获取. 二.获取信息 1.获取进程ID @Test public void test1() { RuntimeMXBean mxb = ManagementFactory.getRuntimeMXBean(); System.out.println(mxb.getName()); //[email protected] } 2.获取ManagementFactory.getRuntimeMXBea