Skip to content

Write and delete health data

Writes change the player’s health store. Require an intentional user action, direction-specific permissions, and a deletion path.

long end = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
var sample = new StepsSample
{
Count = 1200,
StartTime = end - 60 * 60 * 1000,
EndTime = end
};
sample.Values["count"] = sample.Count;
HealthDataWriteResult result = await HealthBridgeService.WriteDataAsync(
new HealthDataWriteQuery("steps", sample));
if (!result.Success)
{
// Preserve unsaved UI state and offer a safe retry.
}
var workout = new WorkoutWriteSample
{
ExerciseType = "Running",
Title = "Training Run",
StartTime = end - 30 * 60 * 1000,
EndTime = end,
DistanceMeters = 5000,
Location = WorkoutLocationType.Outdoor
};
HealthDataWriteResult result =
await HealthBridgeService.WriteWorkoutAsync(workout);

Times are UTC Unix milliseconds. Duration is derived. Preflight exercise names with ExerciseTypeMapper.TryToIOSRawValue or TryToAndroidExerciseType. Unknown or platform-unsupported names can fail.

Workout writes require exercise write permission. Optional calories, distance, steps, and heart-rate samples require their matching write permissions.

if (HealthBridgeService.Provider.Supports(HealthCapability.DeleteData))
{
var query = HealthDataDeleteQuery.FromSample(appCreatedSample);
HealthDataDeleteResult result =
await HealthBridgeService.DeleteDataAsync(query);
if (result.Success)
{
// Remove the record from UI only now.
}
}

HealthKit deletes only objects written by the current app. Health Connect uses record IDs. HealthBridge does not expose broad time-range deletion.

  1. Explain the write or deletion.
  2. Prevent duplicate submission while pending.
  3. Confirm Success before changing saved UI state.
  4. Preserve a record until deletion succeeds.
  5. Sanitize errors and private payloads.
  6. Remove synthetic test records after device validation.