- 版本:1.3.2
- GitHub:
- NPM: https://npmjs.net.cn/package/nativescript-health-data-enduco
- 下载
- 昨天:0
- 上周:1
- 上个月:5
Nativescript的Health Data插件
这是一个NativeScript插件,它抽象了Apple HealthKit和Google Fit,以便从用户的设备中读取健康数据。
先决条件
Android
Google Fit API密钥 - 前往 Google开发者控制台,创建一个项目,并启用健身API
。然后在凭据
下,为Android应用程序创建一个健身API
OAuth2客户端ID(选择用户数据
并点击我需要哪些凭据?
按钮)。如果您使用Linux/maxOS,请使用以下代码生成您的SHA1密钥。
keytool -exportcert -keystore path-to-debug-or-production-keystore -list -v
请注意,默认(调试)密钥库密码为空。
iOS
确保您已在您的应用程序ID中启用HealthKit
权限。
安装
使用NativeScript CLI安装插件
tns plugin add nativescript-health-data
API
以下示例全部使用TypeScript编写,并使用Angular在Nativescript中开发演示。
以下是如何导入和实例化插件,所有示例都期望这种设置
import { AggregateBy, HealthData, HealthDataType } from "nativescript-health-data";
export class MyHealthyClass {
private healthData: HealthData;
constructor() {
this.healthData = new HealthData();
}
}
isAvailable
这告诉您设备是否支持Health Data。在iOS上这可能是始终为true
。在Android上,如果Play Services版本不够新,用户将(自动)被提示更新其版本。如果您不希望这种行为,请将此函数的参数设置为false,如下所示。
this.healthData.isAvailable(false)
.then(available => console.log(available));
isAuthorized
此函数(以及下一个函数)接受一个HealthDataType
的Array
。其中每个都有name
和accessType
。
name
可以是“可用数据类型”之一。- accessType可以是
read
、write
或readAndWrite
(请注意,此插件当前仅支持读取数据,但这将会改变)。
iOS在这里有点愚蠢:如果您只请求了“读取”访问,您将永远不会从此方法收到一个
true
响应。详情在此。
this.healthData.isAuthorized([<HealthDataType>{name: "steps", accessType: "read"}])
.then(authorized => console.log(authorized));
requestAuthorization
此函数接受与isAuthorized
相同的参数,如果用户之前没有授权您的应用程序访问传递的任何HealthDataType
,则将触发一个同意屏幕。
请注意,此插件当前仅支持读取数据,但这将会改变。
const types: Array<HealthDataType> = [
{name: "height", accessType: "write"},
{name: "weight", accessType: "readAndWrite"},
{name: "steps", accessType: "read"},
{name: "distance", accessType: "read"}
];
this.healthData.requestAuthorization(types)
.then(authorized => console.log(authorized))
.catch(error => console.log("Request auth error: ", error));
query
必需属性是startData
、endDate
和dataType
。dataType
必须是“可用数据类型”之一。
默认情况下数据不聚合,因此返回所有单个数据点。然而,此插件提供了一种通过hour
、day
或sourceAndDay
聚合数据的方法,后者将允许您按源(Fitbit、Nike Run Club、手动输入等)读取每日数据。
如果您在运行query
之前没有运行requestAuthorization
,则插件会为您(对于请求的dataType
)运行requestAuthorization
。欢迎您。😉
this.healthData.query(
{
startDate: new Date(new Date().getTime() - 3 * 24 * 60 * 60 * 1000), // 3 days ago
endDate: new Date(), // now
dataType: "steps", // equal to the 'name' property of 'HealthDataType'
unit: "count", // make sure this is compatible with the 'dataType' (see below)
aggregateBy: "day", // optional, one of: "hour", "day", "sourceAndDay"
sortOrder: "desc" // optional, default "asc"
})
.then(result => console.log(JSON.stringify(result)))
.catch(error => this.resultToShow = error);
startMonitoring
(目前仅限iOS)
如果您想在被健康数据更改时收到通知,您可以监控特定类型。即使您的应用处于后台,也可以通过enableBackgroundUpdates: true
实现。注意,iOS会唤醒您的应用以便您可以对这一通知做出反应(例如,在onUpdate
函数中查询此数据类型的最近更改),但作为交换,您需要告诉iOS您已完成。因此,请确保按以下方式调用completionHandler
。
并非所有数据类型都支持backgroundUpdateFrequency: "immediate"
,因此您的应用在HealthKit中添加/删除数据时可能不会立即被调用。
后台通知可能在iOS模拟器上不起作用,请在实际设备上进行测试。
this.healthData.startMonitoring(
{
dataType: "heartRate",
enableBackgroundUpdates: true,
backgroundUpdateFrequency: "immediate",
onUpdate: (completionHandler: () => void) => {
console.log("Our app was notified that health data changed, so querying...");
this.getData("heartRate", "count/min").then(() => completionHandler());
}
})
.then(() => this.resultToShow = `Started monitoring heartRate`)
.catch(error => this.resultToShow = error);
stopMonitoring
(目前仅限iOS)
如果您不再希望收到健康数据更改的通知,最好调用此方法。
this.healthData.stopMonitoring(
{
dataType: "heartRate",
})
.then(() => this.resultToShow = `Stopped monitoring heartRate`)
.catch(error => this.resultToShow = error);
支持的数据类型
在版本1.0.0中,您可以读取以下支持的数据类型。同时,请确保传递正确的unit
。
请注意,您需要负责传递正确的unit
,尽管每种类型只有1个选项。实际上,目前Android上忽略了unit
,而在iOS上,您可以传递未记录的类型(例如,distance
的mi
)。
原因是我想为每种类型支持更多的单位,但这尚未实现...所以这是为了未来的向下兼容!🤯
数据类型 | 单位 | GoogleFit数据类型 | Apple HealthKit数据类型 |
---|---|---|---|
距离 | m | TYPE_DISTANCE_DELTA |
HKQuantityTypeIdentifierDistanceWalkingRunning |
步数 | 计数 | TYPE_STEP_COUNT_DELTA |
HKQuantityTypeIdentifierStepCount |
卡路里 | 计数 | TYPE_CALORIES_EXPENDED |
HKQuantityTypeIdentifierActiveEnergyBurned |
身高 | m | TYPE_HEIGHT |
HKQuantityTypeIdentifierHeight |
体重 | kg | TYPE_WEIGHT |
HKQuantityTypeIdentifierBodyMass |
心率 | 计数/分钟 | TYPE_HEART_RATE_BPM |
HKQuantityTypeIdentifierHeartRate |
体脂百分比 | % | TYPE_BODY_FAT_PERCENTAGE |
HKQuantityTypeIdentifierBodyFatPercentage |
鸣谢
- Filipe Mendes,他在为葡萄牙卫生部的共享服务(SPMS)工作时,为这个存储库提供了出色的第一个版本。当他没有时间维护它时,他友好地将这个存储库转交给了我。
- Daniel Leal,他为一个伟大的PR做出了贡献。