Make Apple Health workout recording watch-only

The phone no longer writes estimated Health workouts: the watch, which
runs the live session, is the sole recorder. Replaces WorkoutHealthWriter
with a WorkoutHealthDeleter that only removes a legacy phone-estimate
workout when its record is deleted here, drops the MET calorie table and
the phone's write/read Health scopes, and keeps phoneEstimate decodable
for existing documents.

Claude-Session: https://claude.ai/code/session_01HJDQQDA9QdP8zByg43H5v3
This commit is contained in:
2026-07-08 07:56:19 -04:00
parent 06fa52345b
commit a4ed4df756
9 changed files with 102 additions and 261 deletions
+8 -13
View File
@@ -9,12 +9,13 @@ import Foundation
import HealthKit
// Bridges the app's HealthKit-free domain types to HealthKit, and centralizes the
// authorization type sets so the watch (which records the session) and the phone
// (which writes an estimated workout when no watch ran) request consistent scopes.
// authorization type sets. The watch records the live session (shares the workout +
// energy, reads HR back); the phone only ever deletes a legacy phone-estimate workout
// it previously authored, so it needs nothing but workout-share.
extension WorkoutActivityType {
/// The HealthKit activity type used to tag a saved workout, so it lands in the
/// right Apple Health / Fitness category and credits the rings appropriately.
/// The HealthKit activity type used to tag the watch's saved workout, so it lands
/// in the right Apple Health / Fitness category and credits the rings appropriately.
var hkActivityType: HKWorkoutActivityType {
switch self {
case .traditionalStrength: .traditionalStrengthTraining
@@ -52,16 +53,10 @@ enum WorkoutHealthAuthorization {
HKCharacteristicType(.dateOfBirth), // max HR for zone tracking
]
/// Phone: writes an estimated workout when no watch session ran; reads body
/// measurements to size the calorie estimate (and HR to display watch data).
/// Phone: shares only the workout type, the minimum HealthKit requires to delete a
/// legacy phone-estimate `HKWorkout` this app authored. The phone reads nothing and
/// no longer writes any workouts of its own (recording is watch-only).
static let phoneShare: Set<HKSampleType> = [
.workoutType(),
HKQuantityType(.activeEnergyBurned),
]
static let phoneRead: Set<HKObjectType> = [
HKQuantityType(.bodyMass),
HKQuantityType(.heartRate),
HKCharacteristicType(.dateOfBirth),
HKCharacteristicType(.biologicalSex),
]
}