Health & Fitness

RSS for tag

Explore the technical aspects of health and fitness features, including sensor data acquisition, health data processing, and integration with the HealthKit framework.

Health & Fitness Documentation

Posts under Health & Fitness subtopic

Post

Replies

Boosts

Views

Activity

Is it possible to provide an interface for real-time sleep status monitoring
Apple Watch automatically tracks sleep data and syncs it to the iPhone, making it available through HealthKit for historical analysis. However, there is no way to retrieve real-time data on whether a user has entered sleep, or whether they are in a specific sleep stage at any given moment. Is it possible to provide an interface for real-time sleep status monitoring
1
0
568
Feb ’25
Integrating Apple Fitness+ Workouts – How to Retrieve Metadata?
Platform & Version: iOS Version: 18.3.1 Development Environment: Xcode 16.2, macOS 14.6.1 Description of the Issue: We're exploring ways to better integrate Apple Fitness+ workouts into our app. We've noticed that some third-party apps, such as Strava and HealthFit, now display Fitness+ workout details, including the title, trainer, and an image. I’ve been investigating how this is possible, and the only relevant change I’ve found is that HKMetadataKeyAppleFitnessPlusCatalogIdentifier is now being set for Fitness+ workouts. However, I can’t find any public API or official documentation that explains how to use these identifiers to retrieve the associated workout details. Question: Is there an official API available to fetch metadata for Fitness+ workouts using these identifiers? Or are these third-party apps potentially accessing private APIs? If no API exists, is the only option to create a manual mapping of these identifiers—something that seems impractical given the constantly evolving Fitness+ workout catalog? Any guidance on this would be greatly appreciated. Thanks!
4
0
608
Feb ’25
How to Save Heart Rate in HKCategoryTypeIdentifier.mindfulSession
I’m trying to associate heart rate (HR) data with a mindfulness session (HKCategoryTypeIdentifier.mindfulSession) in HealthKit, but I can’t find any documentation on how to do this. I’ve seen third-party apps (like Medito) successfully log HR within Mindful Minutes, even when the session takes place on an iPhone (not an Apple Watch). However, when I try saving HR in the metadata, it does not appear in the Health app's Mindful Minutes section. Code snippet: func logMindfulnessSession(start: Bool, heartRate: Double? = nil) { let mindfulType = HKCategoryType.categoryType(forIdentifier: .mindfulSession)! let now = Date() let endTime = now.addingTimeInterval(Double(selectedDuration)) var metadata: [String: Any]? = nil if let hr = heartRate { let heartRateUnit = HKUnit.count().unitDivided(by: HKUnit.minute()) let hrQuantity = HKQuantity(unit: heartRateUnit, doubleValue: hr) metadata = ["heartRate": hrQuantity] // ❓ Is there a correct key for HR? } let sample = HKCategorySample( type: mindfulType, value: 0, start: now, end: endTime, metadata: metadata ) healthStore.save(sample) { success, error in if let error = error { print("HealthKit session save error: \(error.localizedDescription)") } else { print("Mindfulness session saved successfully.") if let hr = heartRate { print("Saved with HR: \(hr) BPM") } } } } Questions: What is the correct metadata key for associating heart rate with a mindful session? Does HealthKit require a specific format (e.g., HKQuantitySample) for HR? 0 Are there additional permissions needed to allow HR to appear in Mindful Minutes? Does HR need to be stored separately in HKQuantityTypeIdentifier.heartRate, and if so, how do third-party apps ensure it appears in the same entry as the mindful session? thank you!
1
0
628
Mar ’25
Healthstore read only in objective-C ?
I have an App in objective-c that is using Health data (walk/run, cycling) to give advice to users . I do not want/need to write any data in the Healtkit. If i do (with the 3 values in the plist / .info : self.healthStore requestAuthorizationToShareTypes:nil readTypes:readDataTypes My request crashes. *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Must request authorization for at least one data type' *** First throw call stack: ( 0 CoreFoundation 0x00000001804b910c __exceptionPreprocess + 172 1 libobjc.A.dylib 0x0000000180092da8 objc_exception_throw + 72 2 CoreFoundation 0x00000001804b901c -[NSException initWithCoder:] + 0 3 HealthKit 0x000000019da034d4 -[HKHealthStore _validateAuthorizationRequestWithShareTypes:readTypes:] + 92 4 HealthKit 0x000000019da03670 -[HKHealthStore requestAuthorizationToShareTypes:readTypes:shouldPrompt:completion:] + 292 BUT in swift : healthStore.requestAuthorization(toShare: nil, read: readTypes) is working, présents only my 2 datas to read... in the same IOS , same phone without crashing. What is the difference ? Nil object in objective-c and Nil object in swift are not the same ? how do i make readonly requests in objective C ?
5
0
376
Mar ’25
HKAnchoredObjectQuery Stops Receiving Updates
I implemented this to receive updates for specific data types and keep the latest daily information up to date. However, for some reason, it only works for a while before stopping completely. Background Delivery internal func backgroundDeliveryForReadTypes(enable: Bool, types: Set<HKQuantityType>) async { do { if enable { try await statusForAuthorizationRequest(toWrite: [], toRead: types) for type in types { try await healthStore.enableBackgroundDelivery(for: type, frequency: .daily) } } else { for type in types { try await healthStore.disableBackgroundDelivery(for: type) } } } catch { debugPrint("Error enabling background delivery: \(error.localizedDescription)") } } HKQueryAnchor internal var walkingActivityQueryAnchor: HKQueryAnchor? { get { if let anchorData = UserDefaults.standard.data(forKey: "walkingActivityAnchor") { return try? NSKeyedUnarchiver.unarchivedObject(ofClass: HKQueryAnchor.self, from: anchorData) } return nil } set { if let newAnchor = newValue { let anchorData = try? NSKeyedArchiver.archivedData(withRootObject: newAnchor, requiringSecureCoding: true) UserDefaults.standard.set(anchorData, forKey: "walkingActivityAnchor") } else { UserDefaults.standard.removeObject(forKey: "walkingActivityAnchor") } } } HKAnchoredObjectQuery internal func observeWalkingActivityInBackground( _ start: Bool, toRead: Set<HKQuantityType>, completion: @escaping @Sendable (Result<WalkingActivityData?, Error>) -> Void ) { if start { guard (walkingActivityQuery == nil) else { return } let predicate = getPredicate(date: Date()) let queryDescriptors = toRead.map { HKQueryDescriptor(sampleType: $0, predicate: predicate) } let handleSamples: @Sendable (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> Void = { [weak self] _, samples, _, newAnchor, error in guard let self = self else { return } if let error = error { completion(.failure(error)) return } guard let samples = samples, !samples.isEmpty else { completion(.success(nil)) return } Task { self.walkingActivityQueryAnchor = newAnchor let activity = await self.getWalkingActivity(date: Date()) completion(.success(activity)) } } let query = HKAnchoredObjectQuery( queryDescriptors: queryDescriptors, anchor: walkingActivityQueryAnchor, limit: HKObjectQueryNoLimit, resultsHandler: handleSamples ) query.updateHandler = handleSamples healthStore.execute(query) walkingActivityQuery = query } else { if let query = walkingActivityQuery { healthStore.stop(query) walkingActivityQuery = nil } } } WalkingActivityData private func getWalkingActivity(date: Date) async -> WalkingActivityData { async let averageHeartRate = try await self.getAverageHeartRate(date: date) async let steps = try self.getStepCount(date: date) async let durationMinutes = try self.getTotalDurationInMinutes(date: date) async let distanceMeters = try self.getDistanceWalkingRunning(date: date, unit: .meter()) async let activeCalories = try self.getActiveEnergyBurned(date: date) return await WalkingActivityData( date: date, steps: try? steps, activeCalories: try? activeCalories, distanceMeters: try? distanceMeters, durationMinutes: try? durationMinutes, averageHeartRate: try? averageHeartRate ) } Example of getAverageHeartRate func getAverageHeartRate(date: Date) async throws -> Double? { let type = HKQuantityType(.heartRate) _ = try checkAuthorizationStatus(for: type) guard let heartRate = try await getDescriptor( date: date, type: type, options: .discreteAverage ).result(for: healthStore) .statistics(for: date)? .averageQuantity()?.doubleValue(for: HKUnit.count().unitDivided(by: HKUnit.minute())) else { return nil } return Double(String(format: "%.2f", heartRate)) ?? 0.0 } Descriptor & predicate internal func getPredicate(startDate: Date, endDate: Date) -> NSCompoundPredicate { let predicateForSamples = HKQuery.predicateForSamples(withStart: startDate, end: endDate) let excludeManual = NSPredicate(format: "metadata.%K != YES", HKMetadataKeyWasUserEntered) return NSCompoundPredicate(andPredicateWithSubpredicates: [predicateForSamples, excludeManual]) } internal func getDescriptor(startDate: Date, endDate: Date, type: HKQuantityType, options: HKStatisticsOptions) -> HKStatisticsCollectionQueryDescriptor { let calendar = Calendar(identifier: .gregorian) let anchorDate = calendar.date(bySetting: .hour, value: 0, of: startDate)! var interval = DateComponents() interval.day = 1 return HKStatisticsCollectionQueryDescriptor( predicate: HKSamplePredicate.quantitySample(type: type, predicate: getPredicate(startDate: startDate, endDate: endDate)), options: options, anchorDate: anchorDate, intervalComponents: interval ) } Implementation public func observeWalkingActivityInBackground(_ start: Bool, toRead: Set<HKQuantityType>, memberID: String) { observeWalkingActivityInBackground(start, toRead: toRead) { [weak self] result in guard let self = self else { return } } }
1
0
228
Mar ’25
Querying heart rate samples hangs for some users
This is an ongoing issue that I haven't been able to solve: I am querying different types of HealthKit data over the past year. While this works fine for HRV, it hangs for some users when I'm trying to get heart rate data. Here's the relevant query func initialRead(from startDate: Date) async throws -> [HKSample] { let endDate = anchorStart let interval: TimeInterval = .days(7) var currentStartDate = startDate var currentEndDate = Date(timeInterval: interval, since: currentStartDate) var samples: [HKSample] = [] while currentStartDate <= endDate { let datePredicate = SampleType.datePredicate(start: currentStartDate, end: currentEndDate) let predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [datePredicate,HKQuery.predicateForObjects(withMetadataKey: HKMetadataKeyHeartRateMotionContext, allowedValues: [HKHeartRateMotionContext.sedentary])]) do { let result = try await withCheckedThrowingContinuation { continuation in let completionQuery = HKSampleQuery(sampleType: HKQuantityType.heartRate, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: [.init(key: HKSampleSortIdentifierStartDate, ascending: true)]) { query, samples, error in if let samples { continuation.resume(returning: samples) } else { if let error { continuation.resume(throwing: error) } else { continuation.resume(returning: []) } } } healthStore.execute(completionQuery) } samples = samples.merge(from: result) } catch { Logger.general.error("Reading failed for dates \(currentStartDate) to \(currentEndDate): \(error)") } currentStartDate = currentEndDate currentEndDate = Date(timeInterval: interval, since: currentStartDate) } return samples } extension HKSampleType { static func datePredicate( start:Date?, end:Date?) -> NSPredicate { HKQuery.predicateForSamples(withStart: start, end:end, options: .strictStartDate) } } For reference, I expect about 1000 sedentary samples per week. Basically what happens for these users is when they start reading the HR data, the app hangs. They start each read manually via a special TestFlight build with buttons for starting the different data type readings. Any advice on how to proceed with this bug would be great since it only affects some users. I am able to create test builds for this audience to test different options. One theory is the motion context predicate is screwing something up. If any apple dev can enlighten me how to narrow down the issue, that would be great.
1
0
175
Mar ’25
Recording a HeartbeatSeries
I need to be able to create and store a HeartbeatSeries for a given time-period from an Apple Watch, to then retrieve that data from HealthKit to be processed. I have working code which allows me to begin a workout session, which is being used to determine how long a session has been running for. I also have working code for retrieving HeartbeatSeries data from HealthKit. The issue is that no HeartbeatSeries data is being stored into HealthKit as a result of the workout session running. Whether that session is running for as little as 30 seconds or as long as 20 minutes, nothing is stored. However, when I use the the Apple "Meditation" app (formerly known as "Breathe"), I can query HealthKit afterwards and retrieve a list of individual heartbeat timings during that 2 minute period. Therefore, it IS possible to store a HeartbeatSeries from within an app on the Apple Watch. What I would like to know is, how can I use the pulse sensor built-in to the Apple Watch to be able to record a HeartbeatSeries similar to how the Meditation app does it.
3
0
99
Mar ’25
Has HealthKit Changed GPS Standards in iOS 18.4 Beta 4?
I am a developer from mainland China. Today, I noticed that the HKWorkoutRoute data stored by my app in HealthKit shows significant discrepancies when viewed on the workout route map in the Health and Fitness apps on iOS 18.4. Instead of displaying the actual movement path, the route appears to be offset by several hundred meters. I collected this data using my app on watchOS 11.3.1, and all CLLocation data comes directly from Core Location. I did not convert WGS84 standard data to GCJ02. Reviewing historical data, all workout routes before March 17, 2025, appear correct, but every record after that date exhibits the offset issue.
2
0
92
Mar ’25
Synchronization Timing Between Apple Watch HealthKit Store and iPhone HealthKit Store
Hi, I’m currently working on an app that utilizes sleep data from HealthKit to provide users with meaningful insights about their sleep. To ensure a smooth user experience, I’d like to understand when sleep data collected by the Apple Watch is saved to the HealthKit store and when it gets synced to the iPhone. Ideally, I want to fetch sleep data right after the user wakes up and opens our app. However, to do this reliably, I need to know the timing of how and when this data becomes available in the iPhone’s HealthKit store. I’ve looked through the official documentation and relevant WWDC sessions but couldn’t find clear information on this topic. If anyone has insights or experience with how and when the Apple Watch syncs HealthKit data—especially sleep records—to the iPhone, I’d greatly appreciate your input. Thanks!
1
0
87
Apr ’25
Incorrect Step Count from Apple HealthKit Data
Hi, i'm trying to get the number of step counts a person has taken. I decided to pull the data from health kit and the number of steps are incorrect. Come to find out apple health recommends an app called pedometer++ for the number of steps counted and after testing I realized that they are getting the correct number of steps a person is taking. How can I pull the correct number of steps a person has taken? I want to be able to merge the data from watch and phone to make sure we are getting the correct number of steps but not double counting the steps either. any guidance on this would be appreciated! Here's the code snippet that i'm using right now: permissions: { read: [AppleHealthKit.Constants.Permissions.StepCount], write: [], }, }; AppleHealthKit.initHealthKit(permissions, error => { if (error) { console.log('Error initializing HealthKit: ', error); return; } else { dispatch(setAllowHealthKit(true)); getHealthKitData(); console.log('HealthKit initialized successfully'); } }); const getHealthKitData = async () => { try { const today = new Date(); const options = { startDate: new Date(today.setHours(0, 0, 0, 0)).toISOString(), endDate: new Date().toISOString(), }; const steps = await new Promise((resolve, reject) => { AppleHealthKit.getStepCount(options, (error, results) => { if (error) reject(error); resolve(results?.value); }); }); setStepsCount(steps); } catch (error) { console.error('Error fetching HealthKit data:', error); } };
6
0
167
Jul ’25
Non-ViewModifier way to present WorkoutPlan preview
Hello, is there a way to present WorkoutPlan preview just like it was presented on WWDC video: https://developer.apple.com/videos/play/wwdc2023/10016/ with WorkoutCompositions? Or was this way ditched completely and is not possible to reproduce anymore? I find it weird that this view modifier accepts non-optional WorkoutPlan when the process of creating one can fail for many reasons with fatalError (that's another issue - why isn't there throws used anywhere?) when not checked with dedicated methods and I think that it would make more sense to create WorkoutPlan when user completes filling some kind of form. Because right now it's needed to compute the non-optional WorkoutPlan for the sake of .workoutPreview modifier live for any changes and that can often lead to errors. Non-modifier way of presenting the preview, like the one presented on WWDC would work really well for my project
1
0
115
Jun ’25
Fitness app not now show saved routes
When I set the distanceFilter = 5 (5 meters) in the GPS CLLocationManager I can't display the workout routes in the Apple Fitness app after writing the recorded GPS data to HealthKit via HKWorkoutRouteBuilder. The smaller distanceFilter, Fitness will displays the route. Should I consider setting up a small distanceFilter when developing a workout app on watchOS?
5
0
110
Jul ’25
Workout Buddy not available
Has anyone seen the workout buddy options on watch OS yet? I am not able to get it on my watch. My setup is an iPhone 16 and Watch Ultra 1 with the 26 OS I am currently using beta 3. English US language on both and US as region. I am located in Germany though. I restarted both devices multiple times without any changes. Hopefully someone can help.
1
0
71
Jul ’25
HealthKit Permission request throws error
Hi guys, We have an app that consumes data from Apple HealthKit. We use an HKObserverQuery to monitor changes in HealthKit data, and occasionally use regular HKSampleQuery requests when the app is in the foreground. Over the past few weeks, we’ve been encountering a significant number of errors when requesting additional HealthKit permissions (beyond what the user has already granted). The error message we’re seeing is: The operation couldn't be completed. (_UIViewServiceInterfaceErrorDomain error 2.) When this error occurs, all previously granted HealthKit permissions are automatically revoked, which is highly disruptive. We have a few questions and would greatly appreciate any insights or explanations regarding this behavior: Could this error occur if a permission request is triggered right as the app moves to the background? Why would previously granted permissions be revoked automatically after this error? If this is due to some internal behavior in iOS (e.g., a system-level protection or timeout), is there any known workaround or best practice to prevent this from happening? Thanks in advance for your help!
2
0
90
Jul ’25
HealthKit Background Delivery and URLSession.shared.dataTask
Hello. I have implemented background delivery for detecting changes in health kit with HKObserverQuery. It works well, I am reading changes. And I am sending this changes to an https endpoint with using an URLSession.shared.dataTask inside the HKObserverQuery callback while my app is terminated. I have several questions about this: Is starting a URLSession.shared.dataTask inside HKObserverQuery callback when app is terminated is correct way to do it? I am calling HKObserverQuery completion handler whatever dataTask returned success or failure but I am wondering what if the network connection is low and this dataTask response could not received in 2-3 seconds. I have read background deliveries should take 1-2 seconds. Should I use an URL session with background configuration for sending those HTTPS requests? If so, should I use download task or upload task (they don't fit my requirements I am sending a simple json)?
2
0
113
Aug ’25
Health Kit Background Delivery and URLSession.shared.dataTask
Hello. I have implemented background delivery for detecting changes in health kit with HKObserverQuery. It works well, I am reading changes. And I am sending this changes to an https endpoint with using an URLSession.shared.dataTask inside the HKObserverQuery callback while my app is terminated. I have several questions about this: Is starting a URLSession.shared.dataTask inside HKObserverQuery callback is correct way to do it? I am calling HKObserverQuery completion handler whatever dataTask returned success or failure but I am wondering what if the network connection is low and this dataTask response could not received in 2-3 seconds. I have read HealthKit background deliveries should take 1-2 seconds. Should I use background task somehow for sending those HTTPS requests?
1
0
103
Aug ’25
Guidance / Documentation on iOS 18.6.1 Blood Oxygen Saturation
Are there any HealthKit related changes to be aware of in the new update that enables SPO2 / Blood Oxygen Saturation measurements on certain Apple Watch models within the US? I’m aware of processing happening on the phone…. But beyond that: Does this mean values are then saved to Apple Health? Do these models still take background SPO2 measurements in the same way as other models do? Are these values then visible in third party iOS apps as normal through HealthKit? Do these values sync back to the paired Apple Watch HealthKit store for third party apps to access on the Watch? For reference I have an iOS and WatchOS app that, amongst other features, provides the ability to see your SPO2 values in the Watch app, complications and in the iOS app.
7
0
229
Sep ’25
Best Practices for Continuous Background Biometric Monitoring on Apple Watch
Hello, everyone! I'm seeking some guidance on the App Store review process and technical best practices for a watchOS app. My goal is to create an app that uses HealthKit to continuously monitor a user's heart rate in the background for sessions lasting between 30 minutes and 3 hours. This app would not be a fitness or workout tracker. My primary question is about the best way to achieve this reliably while staying within the App Store Review Guidelines. Is it advisable to use the WorkoutKit framework to start a custom, non-fitness "session" for the purpose of continuous background monitoring? Are there any other recommended APIs or frameworks for this kind of background data collection on watchOS that I should be aware of? What are the key review considerations I should be mindful of, particularly regarding Guideline 4.1 (Design) and the intended use of APIs? My app's core functionality would require this kind of data for a beneficial purpose. I want to ensure my approach is technically sound and has the best chance of a successful review. Any insights or advice from developers who have experience with similar use cases would be incredibly helpful! Thank you!
1
0
296
Aug ’25
Extremely persistent HealthKit read permissions issue
Overview of Issue My implementation of HealthKit is no longer able to read values due to authorization issues (ex. "HealthKitService: Not authorized to read HKQuantityTypeIdentifierHeight. Status: 0"). I have been through every conceivable debugging step including building a minimal project that just requests HealthKit data and the issue has persisted. I've tried my personal as well as Organizational developer teams. My MacOS and Mac Mini. Simulator and personal device. Rechecked entitlements, reprovisioned certificates. This makes no sense. And I have been unable to find anything similar in the Developer forums or documentation. The problem occurs during the onboarding flow when the app requests HealthKit permissions. Even when the user grants permission in the HealthKit authorization sheet, the authorizationStatus for characteristic data types (like Biological s3x and Date of Birth) and quantity data types (like Height and Weight) consistently returns as .sharingDenied. This prevents the app from pre-filling the user's profile with their HealthKit data, forcing them to enter it manually. The issue seems to be environmental rather than a specific code bug, as it has been reproduced in a minimal test case app and persists despite extensive troubleshooting. Minimal test project: https://github.com/ChristopherJones72521/HealthKitTestApp** STEPS TO REPRODUCE Build app, attempt to sign in. No data is imported into the respective fields in the main app. Console logs confirm. PLATFORM AND VERSION iOS Development environment: Xcode Version 16.4 (16F6), macOS 15.5 (24F74) Run-time configuration: iOS 18.5 Relevant Code Snippets Here are the key pieces of code that illustrate the implementation and the problem: 1. Requesting HealthKit Permissions (HealthKitService.swift) This function is called to request authorization for the required HealthKit data types. The typesToRead and typesToWrite are defined in a centralized HealthKitTypes struct. // HealthKitService.swift func requestPermissions(completion: @escaping (Bool, Error?) -&gt; Void) { guard HKHealthStore.isHealthDataAvailable() else { completion(false, HealthKitError.notAvailable) return } let typesToRead: Set&lt;HKObjectType&gt; = [ HKObjectType.characteristicType(forIdentifier: .dateOfBirth)!, HKObjectType.characteristicType(forIdentifier: .biologicals3x)!, HKObjectType.quantityType(forIdentifier: .height)!, HKObjectType.quantityType(forIdentifier: .bodyMass)! ] let typesToWrite: Set&lt;HKSampleType&gt; = [ HKObjectType.workoutType(), HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)! ] healthStore.requestAuthorization(toShare: typesToWrite, read: typesToRead) { success, error in DispatchQueue.main.async { if let error = error { print("HealthKitService: Error requesting authorization: \(error.localizedDescription)") completion(false, error) } else { print("HealthKitService: Authorization request completed. Success: \(success)") completion(success, nil) } } } } 2. Reading Biological s3x (HealthKitService.swift) This function attempts to read the user's biological s3x. The print statements are included to show the authorization status check, which is where the issue is observed. // HealthKitService.swift func readBiologicals3x() async throws -&gt; HKBiologicals3xObject? { guard HKHealthStore.isHealthDataAvailable() else { throw HealthKitError.notAvailable } let s3xAuthStatus = healthStore.authorizationStatus(for: HKObjectType.characteristicType(forIdentifier: .biologicals3x)!) print("HealthKitService: Auth status for Biological s3x: \(s3xAuthStatus.rawValue)") guard s3xAuthStatus == .sharingAuthorized else { print("HealthKitService: Not authorized to read Biological s3x.") throw HealthKitError.notAuthorized } do { return try healthStore.biologicals3x() } catch { print("HealthKitService: Error executing biologicals3x query: \(error.localizedDescription)") throw HealthKitError.queryFailed(error) } } 3. Calling HealthKit Functions During Onboarding (OnboardingFlowView.swift) This is how the HealthKitService is used within the onboarding flow. The requestHealthKitAndPrefillData function is called after the user signs in, and it attempts to read the data to pre-fill the profile form. // OnboardingFlowView.swift func readHealthKitDataAsync() async { print("Attempting to read HealthKit data async...") // ... (calls to HealthKitService.shared.readDateOfBirth(), readHeight(), etc.) do { if let biologicals3xObject = try await HealthKitService.shared.readBiologicals3x() { if self.selectedGender == nil { switch biologicals3xObject.biologicals3x { case .female: self.selectedGender = .female case .male: self.selectedGender = .male case .other: self.selectedGender = .other default: break } } } } catch { print("OnboardingFlowView: Error reading Biological s3x: (error.localizedDescription)") } print("OnboardingFlowView: Finished HealthKit data processing.") } Console Logs Attempting to read HealthKit data async... HealthKitService: Reading Date of Birth... HealthKitService: Current auth status for DOB (during read attempt): 0 HealthKitService: Not authorized to read Date of Birth. Status: 0 OnboardingFlowView: Error reading Date of Birth: The operation couldn’t be completed. (Strike_Force.HealthKitError error 2.) HealthKitService: Reading Height... HealthKitService: Current auth status for HKQuantityTypeIdentifierHeight (during read attempt): 0 HealthKitService: Not authorized to read HKQuantityTypeIdentifierHeight. Status: 0 OnboardingFlowView: Error reading Height: The operation couldn’t be completed. (Strike_Force.HealthKitError error 2.) HealthKitService: Reading Weight (Body Mass)... HealthKitService: Current auth status for HKQuantityTypeIdentifierBodyMass (during read attempt): 0 HealthKitService: Not authorized to read HKQuantityTypeIdentifierBodyMass. Status: 0 OnboardingFlowView: Error reading Weight: The operation couldn’t be completed. (Strike_Force.HealthKitError error 2.) HealthKitService: Pre-read check for Biologicals3x auth status: 1 (Denied) HealthKitService: Reading Biological s3x... HealthKitService: Current auth status for Biological s3x (during read attempt): 1 HealthKitService: Not authorized to read Biological s3x. Status: 1 OnboardingFlowView: Error reading Biological s3x: The operation couldn’t be completed. (Strike_Force.HealthKitError error 2.)
2
0
206
Sep ’25