nativeScript健康数据
适用于Nativescript的健康数据插件,使用Google Fit和Apple HealthKit。
npm i --save nativescript-health-data

NativeScript健康数据插件

这是一个NativeScript插件,它抽象了Apple HealthKit和Google Fit,用于从用户的设备读取健康数据。

Build Status NPM version Downloads Twitter Follow

先决条件

Android

Google Fit API密钥 - 前往Google开发者控制台,创建一个项目,并启用Fitness API。然后在凭据下,为Android应用程序创建一个Fitness 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中,该示例是在Nativescript w/ Angular中开发的。

以下是如何导入和实例化插件的方法,所有示例都假设这种设置

import { AggregateBy, HealthData, HealthDataType } from "nativescript-health-data";

export class MyHealthyClass {
private healthData: HealthData;

constructor() {
this.healthData = new HealthData();
}
}

isAvailable

这告诉您设备是否支持健康数据。在iOS上,这可能是始终为true。在Android上,如果Play Services版本不够新,用户将被提示(自动)更新其版本。如果您不希望这种行为,可以向此函数传递false,如下所示。

this.healthData.isAvailable(false)
.then(available => console.log(available));

isAuthorized

此函数(以及下一个函数)接受一个HealthDataType数组。每个都有nameaccessType

  • name可以是'可用数据类型'之一。
  • accessType可以是readwritereadAndWrite(请注意,此插件目前仅支持读取数据,但将会改变)。

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

必填属性是startDataendDatedataTypedataType必须是'可用数据类型'之一。

默认情况下,数据不聚合,因此返回所有单个数据点。然而,此插件提供了一种通过hourdaysourceAndDay聚合数据的方法,后者将使您能够按源(Fitbit、Nike Run Club、手动输入等)读取每日数据。

如果您在运行query之前没有运行requestAuthorization,则插件会为您运行requestAuthorization(对于请求的dataType)。欢迎您。😉

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,尽管每种类型只有一个选项。实际上,目前 Android 上忽略 unit,iOS 上有未记录的类型可以传入(例如,mi 用于 distance)。

原因是我想为每种类型支持更多单位,但这尚未实现...因此,这是为了未来的向后兼容性!🤯

数据类型 单位 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
心率 count/min TYPE_HEART_RATE_BPM HKQuantityTypeIdentifierHeartRate
脂肪百分比 % TYPE_BODY_FAT_PERCENTAGE HKQuantityTypeIdentifierBodyFatPercentage

鸣谢

  • Filipe Mendes 为 SPMS,葡萄牙卫生部的共享服务工作的同时,为这个存储库的第一个版本做出了出色的贡献。当他没有时间维护它时,他友好地将这个存储库转让给了我。
  • Daniel Leal,为 一个优秀的PR