iOS HealthKit 介绍

文章目录

  • 一、简介
  • 二、权限配置
    • 1. 在开发者账号中勾选HealthKit
    • 2. 在targets的capabilities中添加HealthKit。
    • 3. infoPlist需要配置权限
  • 三、创建健康数据管理类
    • 1. 引入头文件
    • 2. 健康数据读写权限
    • 3. 检查权限
    • 4. 读取步数数据
    • 5. 写入健康数据
  • 四、运行获取权限页面

一、简介

HealthKit是一款用于搜集和办理医疗和健康相关数据的开发工具包,它为开发者供给了拜访用户健康数据的API和框架,并使得这些数据能够与iOS设备上的其他应用程序相互共享。

HealthKit允许应用程序搜集和办理各种类型的健康数据,包含身体丈量数据(如体重、身高和心率)、健身数据(如步数和距离)、饮食数据、睡觉数据和心理健康数据等。这些数据能够从多个来历搜集,如从硬件设备(如智能手表、智能手机和健身跟踪器)中获取,或由用户手动输入。

二、权限配置

1. 在开发者账号中勾选HealthKit

在这里插入图片描述

2. 在targets的capabilities中添加HealthKit。

在这里插入图片描述

3. infoPlist需要配置权限

Privacy - Health Share Usage Description
需要您的同意,才能访问健康更新,给您带来更好的服务
Privacy - Health Update Usage Description
需要您的同意,才能分享健康数据,给您带来更好的服务
在这里插入图片描述

注意:iOS13 这里描述太粗糙,会导致程序崩溃。

三、创建健康数据管理类

1. 引入头文件

import HealthKit

2. 健康数据读写权限

// 写权限private func dataTypesToWrite() -> Set<HKSampleType> {// 步数let stepCountType = HKObjectType.quantityType(forIdentifier: .stepCount)// 身高let heightType = HKObjectType.quantityType(forIdentifier: .height)// 体重let weightType = HKObjectType.quantityType(forIdentifier: .bodyMass)// 活动能量let activeEnergyType = HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)// 体温let temperatureType = HKObjectType.quantityType(forIdentifier: .bodyTemperature)// 睡眠分析let sleepAnalysisType = HKObjectType.categoryType(forIdentifier: .sleepAnalysis)let setTypes = Set([stepCountType, heightType, weightType, activeEnergyType, temperatureType, sleepAnalysisType].compactMap { $0 })return setTypes}// 读权限private func dataTypesToRead() -> Set<HKObjectType> {// 步数let stepCountType = HKObjectType.quantityType(forIdentifier: .stepCount)// 身高let heightType = HKObjectType.quantityType(forIdentifier: .height)// 体重let weightType = HKObjectType.quantityType(forIdentifier: .bodyMass)// 体温let temperatureType = HKObjectType.quantityType(forIdentifier: .bodyTemperature)// 出生日期let birthdayType = HKObjectType.characteristicType(forIdentifier: .dateOfBirth)// 性别let sexType = HKObjectType.characteristicType(forIdentifier: .biologicalSex)// 步数+跑步距离let distance = HKObjectType.quantityType(forIdentifier: .distanceWalkingRunning)// 活动能量let activeEnergyType = HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)// 睡眠分析let sleepAnalysisType = HKObjectType.categoryType(forIdentifier: .sleepAnalysis)let setTypes = Set([stepCountType, heightType, weightType, activeEnergyType, birthdayType, sexType, distance, temperatureType, sleepAnalysisType].compactMap { $0 })return setTypes}

3. 检查权限

/// 检查是否支持获取健康数据public func authorizeHealthKit(_ compltion: ((_ success: Bool, _ error: Error?) -> Void)?) {guard HKHealthStore.isHealthDataAvailable() == true else {let error = NSError(domain: "不支持健康数据", code: 2, userInfo: [NSLocalizedDescriptionKey: "HealthKit is not available in th is Device"])if let compltion = compltion {compltion(false, error)}return}let writeDataTypes = dataTypesToWrite()let readDataTypes = dataTypesToRead()healthStore.requestAuthorization(toShare: writeDataTypes, read: readDataTypes) { success, error inif let compltion = compltion {compltion(success, error)}}}

4. 读取步数数据

/// 获取步数public func getStepCount(_ completion: @escaping ((_ stepValue: String?, _ error: Error?) -> Void)) {// 要检索的数据类型。guard let stepType = HKObjectType.quantityType(forIdentifier: .stepCount) else {let error = NSError(domain: "不支持健康数据", code: 2, userInfo: [NSLocalizedDescriptionKey: "HealthKit is not available in th is Device"])completion(nil, error)return}// NSSortDescriptors用来告诉healthStore怎么样将结果排序。let start = NSSortDescriptor.init(key: HKSampleSortIdentifierStartDate, ascending: false)let end = NSSortDescriptor.init(key: HKSampleSortIdentifierEndDate, ascending: false)/*@param         sampleType      要检索的数据类型。@param         predicate       数据应该匹配的基准。@param         limit           返回的最大数据条数@param         sortDescriptors 数据的排序描述@param         resultsHandler  结束后返回结果*/let query = HKSampleQuery.init(sampleType: stepType, predicate: HealthKitManager.getStepPredicateForSample(), limit: HKObjectQueryNoLimit, sortDescriptors: [start, end]) { _, results, error inguard let results = results else {completion(nil, error)return}print("resultCount = \(results.count) result = \(results)")// 把结果装换成字符串类型var totleSteps = 0results.forEach({ quantitySample inguard let quantitySample = quantitySample as? HKQuantitySample else {return}let quantity = quantitySample.quantitylet heightUnit = HKUnit.count()let usersHeight = quantity.doubleValue(for: heightUnit)totleSteps += Int(usersHeight)})print("最新步数:\(totleSteps)")completion("\(totleSteps)", error)}healthStore.execute(query)}

5. 写入健康数据

/// 写入数据public func writeStep() {let steps = HKObjectType.quantityType(forIdentifier: .stepCount)!let quantity = HKQuantity(unit: HKUnit.count(), doubleValue: 1000)let now = Date()let start = now.addingTimeInterval(-3600 * 24)let end = nowlet sample = HKQuantitySample(type: steps, quantity: quantity, start: start, end: end)let healthStore = HKHealthStore()healthStore.save(sample) { (success, _) inif success {// 数据已写入 HealthKit} else {// 写入数据失败}}}

四、运行获取权限页面

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/52985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel流量控制与熔断降级

&#x1f4dd; 学技术、更要掌握学习的方法&#xff0c;一起学习&#xff0c;让进步发生 &#x1f469;&#x1f3fb; 作者&#xff1a;一只IT攻城狮 &#xff0c;关注我&#xff0c;不迷路 。 &#x1f490;学习建议&#xff1a;1、养成习惯&#xff0c;学习java的任何一个技术…

ARM开发,stm32mp157a-A7核PWM实验(驱动蜂鸣器,风扇,马达工作)

1.分析框图&#xff1b; 2.比较捕获寄存器&#xff08;产生PWM方波&#xff09;&#xff1b; 工作原理&#xff1a; 1、系统提供一个时钟源209MHZ&#xff0c;需要通过分频器进行分频&#xff0c;设置分频器值为209分频&#xff1b; 2、当定时器启动之后&#xff0c;自动重载…

7个用于机器学习和数据科学的基本 Python 库

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建3D应用场景 这篇文章针对的是刚开始使用Python进行AI的人&#xff0c;以及那些有经验的人&#xff0c;但对下一步要学习什么有疑问的人。我们将不时花点时间向初学者介绍基本术语和概念。如果您已经熟悉它们&#xff0c;我们鼓…

excel中两列数据生成折线图

WPS中excel的两列数据&#xff0c;第一列为x轴&#xff0c;第二列为y轴&#xff0c;生成折线图&#xff0c;并生成拟合函数。 1.选中两列数据&#xff0c;右击选择插入图表&#xff0c;选择XY&#xff08;散点图&#xff09;&#xff0c;生成散点折线图 2.选中图中散点&#x…

2022年30m全国逐年土地覆被数据

1.研究背景 2023年8月,武汉大学杨杰和黄昕教授团队向公众更新发布了CLCD 2022年全国土地覆数据(V1.0.2)。而CLCD 2021年全国土地覆数据(V1.0.1)也是在去年8月向公众更新发布。 中国在过去几十年中经济和人口迅速发展,土地覆盖随之发生巨大变化,因此迫切需要对其进行连续…

PDF校对:让您的文件无瑕疵

无论您是企业家、学生、教育者还是作家&#xff0c;我们都知道&#xff0c;提交或发布一个充满错误的PDF文件可能会给您的声誉或品牌带来严重损害。这就是为什么PDF校对如此关键的原因。现在&#xff0c;让我们深入了解PDF校对的重要性&#xff0c;以及如何确保您的文件尽可能完…

Spring boot如何工作

越来越方便了 java技术生态发展近25年&#xff0c;框架也越来越方便使用了&#xff0c;简直so easy&#xff01;&#xff01;&#xff01;我就以Spring衍生出的Spring boot做演示&#xff0c;Spring boot会让你开发应用更快速。 快速启动spring boot 请参照官网 Spring | Quic…

HTML <template> 标签

实例 使用 <template> 保留页面加载时隐藏的内容。使用 JavaScript 来显示: <button οnclick="showContent()">显示被隐藏的内容</button><template><h2>Flower</h2><img src="img_white_flower.jpg" width=&q…

windows中安装sqlite

1. 下载文件 官网下载地址&#xff1a;https://www.sqlite.org/download.html 下载sqlite-dll-win64-x64-3430000.zip和sqlite-tools-win32-x86-3430000.zip文件&#xff08;32位系统下载sqlite-dll-win32-x86-3430000.zip&#xff09;。 2. 安装过程 解压文件 解压上一步…

Python爬虫 异步、缓存技巧

在进行大规模数据抓取时&#xff0c;Python爬虫的速度和效率是至关重要的。本文将介绍如何通过异步请求、缓存和代理池等技巧来优化Python爬虫的速度和性能。我们提供了实用的方案和代码示例&#xff0c;帮助你加速数据抓取过程&#xff0c;提高爬虫的效率。 使用异步请求、缓…

章节 2:轻松入手JSX -《React.js手把手教程:从初学者到实战高手》- 第一部分:React.js基础

《React.js手把手教程&#xff1a;从初学者到实战高手》 第一部分&#xff1a;React.js基础 章节 2&#xff1a;轻松入手JSX 在上一章节中&#xff0c;我们初步认识了React.js。现在&#xff0c;我们将更深入地探索React.js中的JSX&#xff08;JavaScript XML&#xff09;语法…

GPIO输入-外电检测

前言 &#xff08;1&#xff09;本系列是基于STM32的项目笔记&#xff0c;内容涵盖了STM32各种外设的使用&#xff0c;由浅入深。 &#xff08;2&#xff09;小编使用的单片机是STM32F105RCT6&#xff0c;项目笔记基于小编的实际项目&#xff0c;但是博客中的内容适用于各种单片…

开源网安受邀参加软件供应链安全沙龙,推动企业提升安全治理能力

​8月23日下午&#xff0c;合肥软件行业软件供应链安全沙龙在中安创谷科技园举办。此次沙龙由合肥软件产业公共服务中心联合中安创谷科技园公司共同主办&#xff0c;开源网安软件供应链安全专家王晓龙、尹杰受邀参会并带来软件供应链安全方面的精彩内容分享&#xff0c;共同探讨…

uniapp 微信小程序:RecorderManager 录音DEMO

uniapp 微信小程序&#xff1a;RecorderManager 录音DEMO 简介index.vue参考资料 简介 使用 RecorderManager 实现录音。及相关的基本操作。&#xff08;获取文件信息&#xff0c;上传文件&#xff09; 此图包含Demo中用于上传测试的服务端程序upload.exe&#xff0c;下载后用…

Hadoop Yarn 核心调优参数

文章目录 测试集群环境说明Yarn 核心配置参数1. 调度器选择2. ResourceManager 调度器处理线程数量设置3. 是否启用节点功能的自动检测设置4. 是否将逻辑处理器当作物理核心处理器5. 设置物理核心到虚拟核心的转换乘数6. 设置 NodeManager 使用的内存量7. 设置 NodeManager 节点…

【微服务】04-Polly实现失败重试和限流熔断

文章目录 1. Polly实现失败重试1.1 Polly组件包1.2 Polly的能力1.3 Polly使用步骤1.4 适合失败重试的场景1.5 最佳实践 2.Polly实现熔断限流避免雪崩效应2.1 策略类型2.2 组合策略 1. Polly实现失败重试 1.1 Polly组件包 PollyPolly.Extensions.HttpMicrosoft.Extensions.Htt…

ppt转pdf免费的工具哪个好用?ppt在线转pdf的方法分享

在工作和学习中&#xff0c;将PPT文件转换为PDF格式具有重要意义。PDF文件的大小较小&#xff0c;适用于各种平台和设备&#xff0c;保持了原始文件的内容和格式&#xff0c;具有广泛的可读性和兼容性。那么小编就来为大家详细地说一说“ppt转pdf免费的工具哪个好用?ppt在线转…

HTML的label标签有什么用?

当你想要将表单元素&#xff08;如输入框、复选框、单选按钮等&#xff09;与其描述文本关联起来&#xff0c;以便提供更好的用户界面和可访问性时&#xff0c;就可以使用HTML中的<label>标签。<label>标签用于为表单元素提供标签或标识&#xff0c;使用户能够更清…

【微服务】05-网关与BFF(Backend For Frontend)

文章目录 1.打造网关1.1 简介1.2 连接模式1.3 打造网关 2.身份认证与授权2.1 身份认证方案2.1.1 JWT是什么2.1.2 启用JwtBearer身份认证2.1.3 配置身份认证2.1.4 JWT注意事项 1.打造网关 1.1 简介 BFF(Backend For Frontend)负责认证授权&#xff0c;服务聚合&#xff0c;目标…

解决抖音semi-ui的Input无法获取到onChange事件

最近在使用semi-ui框架的Input实现一个上传文件功能时遇到了坑&#xff0c;就是无法获取到onChange事件&#xff0c;通过console查看只是拿到了一个文件名。但若是把<Input>换成原生的<input>&#xff0c;就可以正常获取到事件。仔细看了下官方文档&#xff0c;发现…