spike_flutter_sdk 1.0.8 copy "spike_flutter_sdk: ^1.0.8" to clipboard
spike_flutter_sdk: ^1.0.8 copied to clipboard

Reads HealthKit data from iOS HealthKit, and syncs it with Spike backend.

Spike Flutter SDK allows you to read the Apple HealthKit and Android Health Connect data. Then, it allows you to send the data to your backend chosen, and get the data returned which is processed by the backend. Also, you can enable background delivery in case iOS device is being used. And finally, it is possible to enable event tracking to see if everything works as intended or just provide your own event tracking library.

Features #

  1. Read the Apple HealthKit data.
  2. Send this data to backend.
  3. Register periodic background tasks to send and read the data.
  4. Track various events of the package by utilizing shared preferences.

Getting started #

iOS Setup Guide #

At first in your app's entitlements select HealthKit and in your app's info.plist file add permissions:

<key>NSHealthShareUsageDescription</key>
<string>WHY_YOU_NEED_TO_SHARE_DATA</string>
<key>NSHealthUpdateUsageDescription</key>
<string>WHY_YOU_NEED_TO_USE_DATA</string>
copied to clipboard

If you plan to use WorkoutRoute Series please provide additionally CoreLocation permissions:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>WHY_YOU_NEED_TO_ALWAYS_SHARE_LOCATION</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>WHY_YOU_NEED_TO_SHARE_LOCATION</string>
copied to clipboard

Android Setup Guide #

To interact with Health Connect within the app, declare the Health Connect package name in your AndroidManifest.xml file:

<!-- Check whether Health Connect is installed or not -->
<queries>
    <package android:name="com.google.android.apps.healthdata" />
</queries>`
copied to clipboard

Every data type your app reads or writes needs to be declared using a permission in your manifest. For the full list of permissions and their corresponding data types, see List of data types.

To create the declaration, add to regular permissions any of.

<uses-permission android:name="android.permission.health.READ_ACTIVE_CALORIES_BURNED"/>
<uses-permission android:name="android.permission.health.WRITE_ACTIVE_CALORIES_BURNED"/>
<uses-permission android:name="android.permission.health.READ_BASAL_BODY_TEMPERATURE"/>
<uses-permission android:name="android.permission.health.WRITE_BASAL_BODY_TEMPERATURE"/>
<uses-permission android:name="android.permission.health.READ_BASAL_METABOLIC_RATE"/>
<uses-permission android:name="android.permission.health.WRITE_BASAL_METABOLIC_RATE"/>
<uses-permission android:name="android.permission.health.READ_BLOOD_GLUCOSE"/>
<uses-permission android:name="android.permission.health.WRITE_BLOOD_GLUCOSE"/>
<uses-permission android:name="android.permission.health.READ_BLOOD_PRESSURE"/>
<uses-permission android:name="android.permission.health.WRITE_BLOOD_PRESSURE"/>
<uses-permission android:name="android.permission.health.READ_BODY_FAT"/>
<uses-permission android:name="android.permission.health.WRITE_BODY_FAT"/>
<uses-permission android:name="android.permission.health.READ_BODY_TEMPERATURE"/>
<uses-permission android:name="android.permission.health.WRITE_BODY_TEMPERATURE"/>
<uses-permission android:name="android.permission.health.READ_BONE_MASS"/>
<uses-permission android:name="android.permission.health.WRITE_BONE_MASS"/>
<uses-permission android:name="android.permission.health.READ_CERVICAL_MUCUS"/>
<uses-permission android:name="android.permission.health.WRITE_CERVICAL_MUCUS"/>
<uses-permission android:name="android.permission.health.READ_EXERCISE"/>
<uses-permission android:name="android.permission.health.WRITE_EXERCISE"/>
<uses-permission android:name="android.permission.health.READ_DISTANCE"/>
<uses-permission android:name="android.permission.health.WRITE_DISTANCE"/>
<uses-permission android:name="android.permission.health.READ_ELEVATION_GAINED"/>
<uses-permission android:name="android.permission.health.WRITE_ELEVATION_GAINED"/>
<uses-permission android:name="android.permission.health.READ_EXERCISE"/>
<uses-permission android:name="android.permission.health.WRITE_EXERCISE"/>
<uses-permission android:name="android.permission.health.READ_FLOORS_CLIMBED"/>
<uses-permission android:name="android.permission.health.WRITE_FLOORS_CLIMBED"/>
<uses-permission android:name="android.permission.health.READ_HEART_RATE"/>
<uses-permission android:name="android.permission.health.WRITE_HEART_RATE"/>
<uses-permission android:name="android.permission.health.READ_HEIGHT"/>
<uses-permission android:name="android.permission.health.WRITE_HEIGHT"/>
<uses-permission android:name="android.permission.health.READ_HYDRATION"/>
<uses-permission android:name="android.permission.health.WRITE_HYDRATION"/>
<uses-permission android:name="android.permission.health.READ_LEAN_BODY_MASS"/>
<uses-permission android:name="android.permission.health.WRITE_LEAN_BODY_MASS"/>
<uses-permission android:name="android.permission.health.READ_MENSTRUATION"/>
<uses-permission android:name="android.permission.health.WRITE_MENSTRUATION"/>
<uses-permission android:name="android.permission.health.READ_MENSTRUATION"/>
<uses-permission android:name="android.permission.health.WRITE_MENSTRUATION"/>
<uses-permission android:name="android.permission.health.READ_NUTRITION"/>
<uses-permission android:name="android.permission.health.WRITE_NUTRITION"/>
<uses-permission android:name="android.permission.health.READ_OVULATION_TEST"/>
<uses-permission android:name="android.permission.health.WRITE_OVULATION_TEST"/>
<uses-permission android:name="android.permission.health.READ_OXYGEN_SATURATION"/>
<uses-permission android:name="android.permission.health.WRITE_OXYGEN_SATURATION"/>
<uses-permission android:name="android.permission.health.READ_POWER"/>
<uses-permission android:name="android.permission.health.WRITE_POWER"/>
<uses-permission android:name="android.permission.health.READ_RESPIRATORY_RATE"/>
<uses-permission android:name="android.permission.health.WRITE_RESPIRATORY_RATE"/>
<uses-permission android:name="android.permission.health.READ_RESTING_HEART_RATE"/>
<uses-permission android:name="android.permission.health.WRITE_RESTING_HEART_RATE"/>
<uses-permission android:name="android.permission.health.READ_SEXUAL_ACTIVITY"/>
<uses-permission android:name="android.permission.health.WRITE_SEXUAL_ACTIVITY"/>
<uses-permission android:name="android.permission.health.READ_SLEEP"/>
<uses-permission android:name="android.permission.health.WRITE_SLEEP"/>
<uses-permission android:name="android.permission.health.READ_SLEEP"/>
<uses-permission android:name="android.permission.health.WRITE_SLEEP"/>
<uses-permission android:name="android.permission.health.READ_SPEED"/>
<uses-permission android:name="android.permission.health.WRITE_SPEED"/>
<uses-permission android:name="android.permission.health.READ_STEPS"/>
<uses-permission android:name="android.permission.health.WRITE_STEPS"/>
<uses-permission android:name="android.permission.health.READ_STEPS"/>
<uses-permission android:name="android.permission.health.WRITE_STEPS"/>
<uses-permission android:name="android.permission.health.READ_TOTAL_CALORIES_BURNED"/>
<uses-permission android:name="android.permission.health.WRITE_TOTAL_CALORIES_BURNED"/>
<uses-permission android:name="android.permission.health.READ_VO2_MAX"/>
<uses-permission android:name="android.permission.health.WRITE_VO2_MAX"/>
<uses-permission android:name="android.permission.health.READ_WEIGHT"/>
<uses-permission android:name="android.permission.health.WRITE_WEIGHT"/>
<uses-permission android:name="android.permission.health.READ_WHEELCHAIR_PUSHES"/>
<uses-permission android:name="android.permission.health.WRITE_WHEELCHAIR_PUSHES"/>
copied to clipboard

Inside your MainActivity declaration add a reference to health_permissions and an intent filter for the Health Connect permissions action

<activity android:name=".MainActivity">
    <meta-data android:name="health_permissions" android:resource="@array/health_permissions" />

    <intent-filter>
        <action android:name="androidx.health.ACTION_SHOW_PERMISSIONS_RATIONALE" />
    </intent-filter>
</activity>
copied to clipboard

Health connect developer toolbox: http://goo.gle/health-connect-toolbox

Usage #

The examples below demonstrate how to use this package in various of cases.

Initialization #

First, you must get the correct credentials in order for this package to be usable.

const authToken = 'fa0b3803-6068-4ea7-9788-eccce210d30c';
const appId = 'ea9e03f5-be45-49fb-bf4c-47a88c184c3b';
const customerEndUserId = 'jasbdhasbfashfj';
const postbackURL = 'https://example.com/';
const host = 'https://api.spikeapi.com';
copied to clipboard

Creating connection #

Using the credentials received, you can create the connection. It is super trivial and just too easy to do.

final connection = await SpikeSDK.createConnection(
  host: host,
  appId: appId,
  authToken: authToken,
  customerEndUserId: customerEndUserId,
);
copied to clipboard

Creating WebHook connection #

Creating Web Hook connection is also super easy to create.

final webHookConnection = await SpikeSDK.createConnection(
  host: host,
  appId: appId,
  authToken: authToken,
  customerEndUserId: customerEndUserId,
  postbackURL: postbackURL,
);
copied to clipboard

Requesting permissions #

In order to use the connection properly, you must first ask for the permissions needed for your purposes. Let us assume you want to get heart data. For this, you must to ask for heart data permissions. See the example below about how easy it is to do so.

SpikeSDK.ensurePermissionsAreGranted([SpikeDataType.heart]);
copied to clipboard

Just one line of code, and you are requesting the permissions.

Using the connection #

Using both simple and Web Hook connections are very easy to use. See the example below.

final heartData = await connection.extractData(SpikeDataType.heart);
final heartJobDetails = await webHookConnection.extractAndPostData(SpikeDataType.heart);
copied to clipboard

Enabling background delivery (WebHook connection and iOS only) #

Enabling the background delivery should be straightforward as shown below.

await SpikeSDK.enableBackgroundDelivery(
  connection: webHookConnection,
  types: [SpikeDataType.summary, SpikeDataType.heart],
  intervalSeconds: 30, // 0 would be for immediate delivery of the data.
);
copied to clipboard

After the background delivery is enabled, its' all relevant data is stored in memory, and you do not need to enable it again when the app opens again.

Disabling background delivery (WebHook connection and iOS only) #

Disabling the background delivery is even more simplier.

await SpikeSDK.disableBackgroundDelivery(
  connection: webHookConnection,
);
copied to clipboard

Checking the background delivery types (WebHook connection and iOS only) #

Sometimes you may want to check for which types the connection is registered for the background delivery. This is very simple.

final types = await SpikeSDK.getBackgroundDeliveryTypes(
  connection: webHookConnection,
);
copied to clipboard
5
likes
0
points
1.11k
downloads

Publisher

verified publisherspikeapi.com

Weekly Downloads

2024.10.07 - 2025.04.21

Reads HealthKit data from iOS HealthKit, and syncs it with Spike backend.

Homepage

License

unknown (license)

Dependencies

cryptography, flutter, get_it, hex, http, shared_preferences, update, uuid

More

Packages that depend on spike_flutter_sdk