IOS开发入门之 HeathKit框架学习 步数统计
白羽 2018-11-23 来源 :网络 阅读 857 评论 0

摘要:本文将带你了解IOS开发入门iOS中 HeathKit框架学习 步数统计,希望本文对大家学IOS有所帮助。

本文将带你了解IOS开发入门iOS中 HeathKit框架学习 步数统计,希望本文对大家学IOS有所帮助。

        

HeathKit框架学习

本文结构

简介用户数据安全及隐私HeathKit框架HeathKit使用总结

简介

HeathKit是Apple公司在推出iOS 8 系统时一块推出的关于健康信息的框架。如果iPhone手机系统升级到iOS8之后就会发现多了一个健康-app,这就是Apple提供的一个记录用户健康信息的app,可以用它来分享健康和健身数据。还可以指定数据的来源,比如我们自己创建一个app,在我们的app中使用了HeathKit框架之后只要经过用户的认证,就可以在我们的app之中给健康分享数据或者从健康中获取数据。

HeathKit可以与健身设备一起工作,iPhone手机自身可以监控步数信息,会自动导入步数信息。但是其他信息或者设备需要配套的应该才能获取到数据并导入到HeathKit中并在健康中显示。

HeathKit不能再iPad中使用,而且它也不支持扩展。

用户数据安全及隐私

由于用户的健康信息可能是敏感的,所以这些用户信息不能让开发者很随便的获取到。每条信息的读写都需要用户去选择是否同意,比如用户可以同意你获取到用户的身高体重,但是不同意读写生殖健康等其他用户不愿意公开的信息。为了防止信息泄露,我们是不知道用户是否禁止了某条信息是否被用户禁止读取的。简单的说,如果获取不到某条信息,就代表没有这条信息。

关于更多的关于隐私的信息,可以参考隐私

HeathKit框架

HeathKit在各个应用之间提供了一种有意义的方式共享数据。因此,我们必须使用HeathKit框架提供的数据类型和单位。这保证了数据存在的真正意义,我们不能自定义数据类型及单位。框架使用了子类化,例如HKObject和HKObjectType抽象类拥有很多有平行关系的子类,当使用Object或者ObjectType的时候,必须确保使用正确的子类。

在HeathKit中能够存储的类都是HKObject的子类,大部分HKObject的子类都是不可变的。每个对象都有下面的属性:

UUID:每个对象的标识符Source:数据的来源,来源可以是HeathKit的健康app,也可以是我们自己创建的app。当一个对象存储到HeathKit中时会设置其来源。只有从HeathKit中获取到的数据的来源才有效。Metadata:一个包含该对象额外信息的字典,元数据包含预定义的key和自定义的key,预定义的key用来帮助我们在应用间共享数据,而自定义的key用来扩展HeathKit,为对象添加针对应用的数据。

HeathKit的对象主要分为特征和样本。特征对象代表用户的基本不变的数据,包括用户的生日、血型和性别等。我们创建的app不能修改这些信息,只能让用户在健康中去修改或者添加个人特征信息。
样本对象代表某个特定时间的数据,所有的样本类型的对象都是HKSample的子类。它们都有下面的特性:

Type :样本类型,例如:睡眠分享、步行距离、心率样本等StartDate:样本开始时间EndDate:样本结束时间。如果是某一个时间的样本,则开始于结束时间相同,如果是某个时间段的样本,则结束时间在开始时间的后面。

样本类型又可以分为四个类型:

类别样本(HKCategorySample):在iOS 8 中,只有睡眠分析这一个类别样本。代表有限种类的样本.数量样本(HKQuantitySample):这种样本代表存储数据的样本,比如步数、距离、用户的体温等。它是HeathKit中最常见的数据类型。关系样本(HKCorrelation):代表复合数据,包括一个或者多个样本。在iOS 8 中,用correlation代表食物和血压。在创建食物或血压时,需要用correlation。训练活动(HKWorkout):代表某种活动,比如走、跑步等。包含有开始时间、结束时间、运动类型、消耗能量、运动距离等属性。还可以为workout关联许多详细的样本。不像correlation,这些样本不包含在workout中,但是可以通过workout获取到。

再介绍一个HeathKit中经常用到的一些类。

HKSamle

每个HkSample的子类都有对应的便利方法创建对应的对象。比如:

对于数量样本,需要创建HKQuantity类的实例。而且数量的单位和类型标识符文档中描述的可用单位要相同。例如:HKQuantityTypeIdentifierHeight 文档中说明它使用长度单位,因此,你的数量必须使用厘米、米、英尺、英寸或者其他长度单位。

 

对应类别样本,需要创建HKCategorySample的实例。它的值必须和类型标识符文档中描述的枚举值相关。例如, HKCategoryTypeIdentifierSleepAnalysis 文档中说明它使用的枚举值。因此你在创建样本时必须从这个枚举中传递一个值。

同样,你必须先创建correlation包含的所有样本。correlation的类型标识符描述了它可以包含的类型和对象的数量。不要把被包含的对象存进HealthKit。它们是以correlation的一部分存储的。

 

每日更新关注://weibo.com/hanjunqiang 新浪微博!iOS开发者交流QQ群: 446310206

 <喎?"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPrbU09rRtcG3u+62r9H5sb6jrMrXz8ijrLS0vaggSEtXb3Jrb3V0VHlwZSDKtcD9sqKyu9Do0qrWuLaowODQzbHqyra3+6Gjy/nT0LXEd29ya291dLa8ysfTw82s0fm1xMDg0M2x6sq2t/uho7Xatv6jrLbU09rDv7j2d29ya291dMTjtrzQ6NKqzOG5qdK7uPYgSEtXb3Jrb3V0QWN0aXZpdHlUeXBlINa1oaPV4rj21rW2qNLlwct3b3Jrb3V01tDWtNDQtcS77ravtcTA4NDNoaPX7rrzo6y1sXdvcmtvdXSxo7Tmtb1IZWFsdGhLaXS686OsxOO/ydLUuPh3b3Jrb3V0udjBqrbuzeK1xNH5sb6ho9Xi0KnR+bG+zOG5qcHLd29ya291dLXEz+rPuNDFz6KhozwvcD4NCjxwPjxpbWcgYWx0PQ=="这里写图片描述" src="/uploadfile/Collfiles/20160921/20160921092807350.png" title="\" />

HKQuery

HeathKit提供了许多查询读取数据的方法:

直接方法查询。对于特征样本,可以直接查询获取到,这些方法只能查询特征样本。更多信息: HKHealthStore Class Reference

样本查询。这是使用最多的查询。使用样本查询可以查询在HeathKit中任意的数据。而且可以对结果进行排序等。更多信息:HKSampleQuery Class Reference

观察者查询。这是一个长时间运行的查询,它会检测HealthKit存储,并在匹配到的样本发生变化时通知你。如果当存储发生变化时你想得到通知,就使用观察者查询。更多信息:HKObserverQuery Class Reference

锚定对象查询。用这种查询来搜索添加进存储的项。当锚定查询第一次执行时,会返回存储中所有匹配的样本。在接下来的执行中,只会返回上一次执行之后添加的项目。通常,锚定对象查询会和观察者查询一起使用。观察者查询告诉你某些项目发生了变化,而锚定对象查询来决定有哪些(如果有的话)项目被添加进了存储。更多信息:HKAnchoredObjectQuery Class Reference

统计查询。使用这种查询来在一系列匹配的样本中执行统计运算。你可以使用统计查询来计算样本的总和、最小值、最大值或平均值。更多信息: HKStatisticsQuery Class Reference

统计集合查询。使用这种查询来在一系列长度固定的时间间隔中执行多次统计查询。通常使用这种查询来生成图表。查询提供了一些简单的方法来计算某些值,例如,每天消耗的总热量或者每5分钟行走的步数。统计集合查询是长时间运行的。查询可以返回当前的统计集合,也可以监测HealthKit存储,并对更新做出响应。更多信息,参见 HKStatisticsCollectionQuery Class Reference。

Correlation查询。使用这种查询来在correlation查找数据。这种查询可以为correlation中每个样本类型包含独立的谓词。如果你只是想匹配correlation类型,那么请使用样本查询。更多信息,参见 HKCorrelation Class Reference。

来源查询。使用这种查询来查找HealthKit存储中的匹配数据的来源(应用和设备)。来源查询会列出储存的特定样本类型的所有来源。更多信息,参见HKSourceQuery Class Reference。

每日更新关注://weibo.com/hanjunqiang 新浪微博!iOS开发者交流QQ群: 446310206


HKUnit

这个类代表要查询的数据的单位的类,比如体重的单位,可以为kg、lbs等。这个类为不同的数据类型提供了不同的单位方法。一般在创建前面介绍的样本类型的时候,都需要这个类为样本添加对应的单位。而且提供了一些数学运算,比如千米、米、厘米等之间的转换。

在某些场合,你可以使用格式化器来本地化数量。iOS8提供了提供了新的格式化器来处理长度(NSLengthFormatter)、质量(NSMassFormatter)和能量(NSEnergyFormatter)。对于其他的数量,你需要自己来换算单位和本地化数据。

HKHeathStore

HeathKit的核心就是它,它代表HeathKit的数据库,使用它就可以从数据库中读取数据。比较重要的方法:

isHealthDataAvailable:判断当前设置是否支持HeathKitrequestAuthorizationToShareTypes(typesToShare: Set?, readTypes typesToRead: Set?, completion: (Bool, NSError?) -> Void): 向用户请求同意读写某些数据saveObject(object: HKObject, withCompletion completion: (Bool, NSError?) -> Void) :向数据库中添加数据executeQuery(query: HKQuery) :执行查询,即上面介绍的几种查询方法。

HeathKit使用

在使用HealthKit之前,必须要执行下列步骤:

打开HeathKit,在Target栏中,打开Capabilities菜单,将HealthKit这一项的开关设为ON的状态。

创建HeathManager.Swift 文件,并导入



   

`import HeathKit`

   

HeathKit的核心是HeathStore,创建



   

func authorizeHealthKit(completion:((success:Bool,error:NSError!)->Void)!){}

   

然后调用在这个方法中调用isHealthDataAvailable判断当前设备是否支持HeathKit



   

//判断当前设备是否支持

if !HKHealthStore.isHealthDataAvailable(){

    let error = NSError(domain: "", code: 2, userInfo: [NSLocalizedDescriptionKey:"HealthKit is not available in this Device"])

    if completion != nil {

        completion(success: false, error: error)

    }

}

   



,最后在上面的方法中,设置要读写的数据类型。

为你的应用实例化一个 HKHealthStore 对象。每个应用只需要一个HealthKit存储实例。这个存储实例就是你和HealthKit数据库交互的主要接口。



   

let hkHealthStore = HKHealthStore()

   

使用 requestAuthorizationToShareTypes:readTypes:completion:来认证请求从HeathKit获取数据的权限。



   

//请求连接 hkHealthStore.requestAuthorizationToShareTypes(healthKitTypesToWrite as? Set<hksampletype>, readTypes: healthKitTypesToRead as? Set<hkobjecttype>) { (success, error) -> Void in if completion != nil{ completion(success:success,error:error) } return }</hkobjecttype></hksampletype>

   


如果当前设备支持HeathKit的时候,这样就会弹出一个请求界面,让用户选择是否同意你能够获取到你要请求的数据。

获取特征信息

我们首先创建了ProfileViewController.swift,并用IB创建一个请求个人信息的界面

然后在HeathManager.Swift 文件中添加请求个人信息的方法。
对于请求特征信息,前提上用户通过健康添加了出生日期、性别、血型等特征信息

 





   

func readProfile()->(age:Int?,biologicalsex:HKBiologicalSexObject?,bloodType:HKBloodTypeObject?){

 

    //请求年龄

    var age:Int?

    let birthDay:NSDate;

    do {

        birthDay = try hkHealthStore.dateOfBirth()

        let today = NSDate()

        let diff = NSCalendar.currentCalendar().components(.Year, fromDate: birthDay, toDate: today, options: NSCalendarOptions(rawValue: 0))

        age = diff.year

    }catch {

 

    }

    //请求性别

    var biologicalSex

    :HKBiologicalSexObject?

    do {

        biologicalSex  = try hkHealthStore.biologicalSex()

 

    }catch {

 

    }    

    //请求血型

    var hkbloodType:HKBloodTypeObject?

 

    do {

        hkbloodType = try hkHealthStore.bloodType()

    }catch{

 

    }

 

    return (age,biologicalSex,hkbloodType)

}

   



 

请求体重、身高、BMI的时候,创建另外的方法。

 





   

func fetchMostRecentSample(sample:HKSampleType,competion:((HKSample!,NSError!)->Void)!){

    //1.创建谓词

    let past = NSDate.distantPast()

    let now = NSDate()

    let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(past, endDate: now, options: .None)

 

    //2.创建返回结果排序的描述,是降序还是升序的,因为只需要一个结果,就设定限制为1个

    let sortDescrptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate , ascending: false)

    let limit = 1

 

    //3.创建HKSampleQuery对象,

    let sampleQuery = HKSampleQuery(sampleType: sample, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescrptor]) { (sampleQuery, results, error) -> Void in

 

        if let queryError = error {

            competion(nil,queryError)

            return

        }

 

        let mostRecentSample = results?.first

 

        if competion != nil{

            competion(mostRecentSample,nil)

        }

 

    }

 

    //4.执行查询

    self.hkHealthStore.executeQuery(sampleQuery)

}

   



 

获取之后在之前创建的ProfileViewController.swift文件中获取这些信息,并更新UI。

对应特征信息,可以直接调用查询方法,并更新

 





   

let  profile = healthManager?.readProfile()

self.healthStore = HKHealthStore()

 

ageLabel.text = profile?.age == nil ? kUnKnowString:String(profile!.age!)

sexLabel.text = biologicSexLiteral(profile?.biologicalsex?.biologicalSex)

bloodTypeLabel.text = bloodTypeLiteral(profile?.bloodType?.bloodType)

   



 

这里面创建了两个工具方法biologicSexLiteral和bloodTypeLiteral来修改查询的结果为我们想要的样子并显示在界面上。

对于体重和身高,需要创建样本查询

 


   

/**

 获取并更新体重

 */

func updateWeight(){ 

    let weightSampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)

    self.healthManager?.fetchMostRecentSample(weightSampleType!, competion: { (mostRecentSample, error) -> Void in

 

        if error != nil {

            return

        }

 

        var weightString = self.kUnKnowString

        self.weight =     

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程