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

Created

What’s the expected frequency of HealthKit enableBackgroundDelivery: HKCategoryTypeIdentifier.sleepAnalysis
Hello, I have enabled HealthKit background delivery for sleep analysis samples: private func setupSleepDataBackgroundDelivery() { if let sleepType = HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis) { healthStore.enableBackgroundDelivery(for: sleepType, frequency: .immediate) { (success, error) in } } } In general, this function works. But I would love to know what the limitations / expected delivery delay for frequency: .immediate is. The documentation is only very vague about this and specifies that some sample types such as steps are only delivered once per hour. But how about sleep data? Is this expected to be delivered immediately once available on iPhone? Thanks a lot for your help!
2
2
494
Jun ’25
How to save medication dose with new HealthKit apis?
The recent WWDC presentation on HealthKit demonstrated how to associate side effects with a medication dose using HKObjectType.categoryType(forIdentifier:) and HKCategorySample, a subclass of HKObject. There also appears to be an object type specifically for medication doses: HKMedicationDoseEventType, accessible via HKObjectType.medicationDoseEventType(). However, there’s no corresponding public subclass of HKObject that supports this identifier. The most relevant class, HKMedicationDoseEvent, exists but has an inaccessible initializer. Is there currently a supported way to use HKMedicationDoseEventType, or is this functionality not yet available? https://developer.apple.com/videos/play/wwdc2025/321/
1
1
232
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
243
Jun ’25
HealthKit Authorization Requests Immediately Denied in iOS 18.5 - No Permission Dialog Shown
I am experiencing a critical issue with HealthKit authorization in iOS 18.5 where requestAuthorization() calls are immediately denied without showing the user permission dialog. Problem Description: HealthKit authorization requests immediately return .sharingDenied status No system permission dialog is displayed to the user Authorization status changes from .notDetermined to .sharingDenied in <0.1 seconds This occurs for all HealthKit data types (step count, heart rate, sleep analysis, etc.) Technical Details: iOS Version: 18.5 (22F76) Xcode Version: 16F6 Device: iPhone (tested on both simulator and physical device) Bundle IDs tested: com.hereforyou.test2024, com.hereforyou.app Entitlements: com.apple.developer.healthkit = true Code Implementation: let healthStore = HKHealthStore() let stepType = HKObjectType.quantityType(forIdentifier: .stepCount)! // Status before request: .notDetermined try await healthStore.requestAuthorization(toShare: [], read: [stepType]) // Status after request: .sharingDenied (immediate, <0.1 seconds) Evidence this is not a code issue: Other HealthKit apps from App Store work correctly on the same device Proper entitlements are configured and verified HKHealthStore.isHealthDataAvailable() returns true Same code worked in previous iOS versions Multiple Bundle IDs tested with same result Expected Behavior: System should display HealthKit permission dialog allowing user to grant/deny access Actual Behavior: Authorization is immediately denied without user interaction Steps to Reproduce: Create new iOS app with HealthKit entitlements Call requestAuthorization() for any HealthKit data type Observe immediate denial without permission dialog Is this a known issue in iOS 18.5? Are there any workarounds or timeline for a fix? Best regards
3
0
169
Jun ’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
195
Jun ’25
Statistics collection query first result returned is wrong
I'm reading hourly statistics from HealthKit using executeStatisticsCollectionQuery (code below). Expectation What I expect is to get back the list with one row per hour, where each hours has the same cumulative sum value. Actual result In results, first hour always contains less calories than next hours, which all have the same value. Example: Start: 2025-06-02T00:00:00+03:00, anchor: 2025-06-02T00:00:00+03:00, end: 2025-06-02T12:00:00+03:00 🟡 2025-06-02T00:00:00+03:00 Optional(50.3986 kcal) 🟡 2025-06-02T01:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T02:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T03:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T04:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T05:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T06:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T07:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T08:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T09:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T10:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T11:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T12:00:00+03:00 Optional(14.0224 kcal) As you can see, here we have 2025-06-02T00:00:00+03:00 Optional(50.3986 kcal) Now, if I add one more hour to the request (from beginning of time window), the same hour has proper calories count, while newly added hour, has wrong value): 2025-06-01T23:00:00+03:00, anchor: 2025-06-01T23:00:00+03:00, end: 2025-06-02T12:00:00+03:00. 🟡 2025-06-01T23:00:00+03:00 Optional(50.3986 kcal) 🟡 2025-06-02T00:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T01:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T02:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T03:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T04:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T05:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T06:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T07:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T08:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T09:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T10:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T11:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T12:00:00+03:00 Optional(14.0224 kcal) And now first hour of the day, magically has more calories burned: 2025-06-02T00:00:00+03:00 Optional(64.421 kcal) I suspect similar things happen with other quantity types, but haven't yet found a way to reproduce it. Am I doing something wrong or is it a bug in HealthKit? Code let anchorDate = startDate let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: [.strictStartDate]) healthStore.executeStatisticsCollectionQuery( quantityType: .basalEnergyBurned, quantitySamplePredicate: predicate, options: [.separateBySource, .cumulativeSum], anchorDate: anchorDate, intervalComponents: DateComponents(hour: 1), initialResultsHandler: { statistics, error in if let error = error { log(.error, "Error retrieving steps: \(error.localizedDescription)") continuation.resume(throwing: SpikeException("Error retrieving steps: \(error.localizedDescription)")) return } if let statistics { let f = ISO8601DateFormatter() f.timeZone = TimeZone.current for s in statistics { log(.debug, "\(f.string(from: s.startDate)) \(s.sumQuantity())") } } continuation.resume(returning: statistics ?? []) } )
2
0
133
Jun ’25
watchOS workout app not reachable from iOS (sometimes)
In general my workout app is reachable from the iPhone when running a workout, even if in the background. However if the watch app restarts (due to crash or being closed via the dock) via handleActiveWorkoutRecovery then it is only reachable when in the foreground, even though a workout is running. Is this expected / desired behaviour? Is the app given a tighter sandbox (having it's "background privileges" reduced) because of the earlier crash? This behaviour occasionally happens without a crash (or being closed via the dock) - all of a sudden it is no longer reachable via the iPhone. It feels like the app is being "sandboxed" like in #1 but there is no crash or any other kind of log indicating any issue. Generally the only remedy is to stop the workout and restart the app. My question is - is this expected? Is there some condition that causes the watchOS to sandbox the app? Or is this a Watch Connectivity bug?
0
0
161
May ’25
Healthkit - Oura Sync Issue
We are working on the health related application and use apple health kit to sync the data from different devices like watches or ring. We are targeting oura ring to get sleep and other parameters data. We are able to sync the data from oura for all other parameters (like pulse, respiratory rate, blood pressure, etc..) other than sleep. Surprisingly, sleep data that comes through other devices is syncing as expected from the health kit. We are even getting the data which is added manually in health kit. The only sleep data not syncing is from oura. Can we get a document or any kind of help to sync the data from oura in to our application using health kit?
0
0
115
May ’25
怎样读取健康记录心理状态的情境,并将自己APP的数据传入进去
读取是不是解析 metadata 的对应键来获取值对吧~但我看了相关开发文档好像没找到这个的键是什么~于是也没法写入到对应的,现在只能自定义键来进行写入 但是这样写入后无法显示在心情下方的影响因素后面~ 这个 key 是没公开的吗还是说我方法弄错了~请各位大大指教
2
0
114
May ’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
305
May ’25
iOS companion app with no Watch connected
Based on Cooordinate with the companion app in this article by Apple https://developer.apple.com/documentation/healthkit/running-workout-sessions if a workout were to be started on the iPhone companion app but with no Watch available, given HKLiveWorkoutBuilder not available in iOS, does the iPhone app need to implement it's own workout tracking such as a timer for counting the elapsed time and location updates for distance and GPS tracking? If so in an instance where a paired Apple Watch were to exist and the workout is continued in the Watch app should the iPhone companion app stop this custom workout tracking and revert to the mirrored workout from the Watch to ensure accurate and synchronised data between the apps?
0
0
201
May ’25
healthStore.workoutSessionMirroringStartHandler never called
I'm trying to run this example project: https://developer.apple.com/documentation/HealthKit/building-a-multidevice-workout-app When I run it on my device (iPhone 16 Pro and Apple Watch Ultra 2) I get this error: -[SPRemoteInterface _appRecoverAnyExtendedRuntimeSession:]_block_invoke:4350: Got no sessions back from -[CSLSSessionService existingRunningSessions:] or -[CSLSSessionService existingScheduledSessions:] after receiving a PUICInitializeSessionServiceAction I start the workout from my phone, which successfully starts the workout on the watch. But this callback is never triggered on the phone: healthStore.workoutSessionMirroringStartHandler { // not happening } This makes it difficult to learn the mirroring workout technique. I'm using Xcode 16.3 and Mac OS 15.4.1. Any help appreciated!
0
2
163
Apr ’25
Data Processing Addendum
For an app that plan to integrate Apple HealthKit to allow app users to upload and download their health data, where can I locate the Data Processing Addendum that specifies who the data controller and processor will be, and how such health data will be used or distributed?
0
0
81
Apr ’25
WatchOS HealthKit HKObserverQuery crashes in background
I have a watchOS app with a connected iOS app using Swift and SwiftUI. The watchOS app should read heart rate date in the background using HKOberserQuery and enableBackgroundDelivery(), send the data to the iPhone app via WCSession. The iPhone app then sends the data to a Firebase project. The issue I am facing now it that the app with the HKObserverQuery works fine when the app is in the foreground, but when the app runs in the background, the observer query gets triggered for the first time (after one hour), but then always get terminated from the watchdog timeout with the following error message: CSLHandleBackgroundHealthKitQueryAction scene-create watchdog transgression: app<app.nanacare.nanacare.nanaCareHealthSync.watchkitapp((null))>:14451 exhausted real (wall clock) time allowance of 15.00 seconds I am using Xcode 16.3 on MacOS 15.4 The App is running on iOS 18.4 and watchOS 11.4 What is the reason for this this issue? I only do a simple SampleQuery to fetch the latest heart rate data inside the HKObserverQuery and then call the completionHandler. The query itself takes less than one second. Or is there a better approach to read continuously heart rate data from healthKit in the background on watchOS? I don't have an active workout session, and I don't need all heart rate data. Once every 15 minutes or so would be enough.
11
1
831
Apr ’25
Location of indoor workouts
In the fitness app under iOS 18, the location of all workouts is displayed on a small map. For workouts with routes, I can already successfully read out the route and thus also determine the starting point. So that works. For indoor workouts such as yoga or indoor rowing, the exact location is also displayed in the fitness app. I would now also like to read out this location for these indoor workouts in my app. Does anyone know how to do this?
2
0
872
Jan ’25
HealthKit returns different values depending on the OS the request is made on
Hi, I've had trouble for a while now with HealthKit giving me different values if I make the request on iOS and WatchOS. I am using the exact same method on both with the same parameters but I get vast differences in the results. The code I am using to call HealthKit on both devices is: let dateRange = HKQuery.predicateForSamples(withStart: Date().removeMonths(numberOfMonths: 1), end: Date().endOfDay()) let predicate: NSPredicate predicate = NSCompoundPredicate(type: .and, subpredicates: [dateRange]) let query = HKStatisticsQuery(quantityType: HKQuantityType(.stepCount), quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, error in if error != nil { //print("Error fetching step count, or there is no data: \(error.localizedDescription), \(startDate) -> \(endDate)") onComplete(0) return } if let result, let sum = result.sumQuantity() { let stepCount = sum.doubleValue(for: HKUnit.count()) DispatchQueue.main.async { onComplete(Int(stepCount)) } } } healthStore.execute(query) }
4
0
1.2k
Jan ’25
incomplete route data in Apple Health
When we upload workout data to HealthKit the route information with the workout detailed data is incomplete: just a few dots. When we select "Show all workout routes" the route data for the same workout shows correctly. We use the HKWorkoutBuilder to store the workout data, and add the location data with the HKWorkoutRouteBuilder to the workout with Is this an Apple Health issue, or do we have to change something in the way we store the location data to the workout?
3
0
523
Nov ’24
HKWorkoutSession.sendToRemoteWorkoutSession doesn't report success or failure
We are seeing an issue where sending data using the asynchronous method HKWorkoutSession.sendToRemoteWorkoutSession(data: Data) will never return in some cases (no success nor failure). This issue is happening for roughly 5% of Workouts started and will stay broken for the whole workout. The other 95% of the workouts, the connection works flawlessly. This happens on both watchOS 10 and 11, and with phones running iOS 17 or 18. The issue is quite random and not reproducible. Our app has thousands of workouts a day that use the workout session workout data send, with constant messages being send every few seconds. In some of those 5% cases the "sendToRemoteWorkoutSession" will throw way later, like 30+ minutes later, if the watch app is awake long enough to capture a log of a failure. Our code uses the same flow as in the sample project: https://developer.apple.com/documentation/healthkit/workouts_and_activity_rings/building_a_multidevice_workout_app Here is some sample code, which is pretty simple. Setup code: let workoutSession = try HKWorkoutSession(healthStore: healthStore, configuration: configuration) workoutSession.delegate = self activeWorkoutSession?.startMirroringToCompanionDevice { success, error in print("Mirroring started on companion device: \(success), error: \(error)") } workoutSession?.prepare() then later we send data using the workout session: do { print("Will send data") try await workoutSession.sendToRemoteWorkoutSession(data: data) print("Successfully sent data") // This nor the error may be called after waiting extensive amounts of time } catch { print("Failed to send data, error: \(error)") // This nor the success may be called after waiting extensive amounts of time } So far, the only fix is to restart the phone and watch at the same time, which is not a great user experience. Is anyone else seeing this issue? or know how to fix this issue?
2
0
1k
Nov ’24
What’s the expected frequency of HealthKit enableBackgroundDelivery: HKCategoryTypeIdentifier.sleepAnalysis
Hello, I have enabled HealthKit background delivery for sleep analysis samples: private func setupSleepDataBackgroundDelivery() { if let sleepType = HKObjectType.categoryType(forIdentifier: HKCategoryTypeIdentifier.sleepAnalysis) { healthStore.enableBackgroundDelivery(for: sleepType, frequency: .immediate) { (success, error) in } } } In general, this function works. But I would love to know what the limitations / expected delivery delay for frequency: .immediate is. The documentation is only very vague about this and specifies that some sample types such as steps are only delivered once per hour. But how about sleep data? Is this expected to be delivered immediately once available on iPhone? Thanks a lot for your help!
Replies
2
Boosts
2
Views
494
Activity
Jun ’25
How to save medication dose with new HealthKit apis?
The recent WWDC presentation on HealthKit demonstrated how to associate side effects with a medication dose using HKObjectType.categoryType(forIdentifier:) and HKCategorySample, a subclass of HKObject. There also appears to be an object type specifically for medication doses: HKMedicationDoseEventType, accessible via HKObjectType.medicationDoseEventType(). However, there’s no corresponding public subclass of HKObject that supports this identifier. The most relevant class, HKMedicationDoseEvent, exists but has an inaccessible initializer. Is there currently a supported way to use HKMedicationDoseEventType, or is this functionality not yet available? https://developer.apple.com/videos/play/wwdc2025/321/
Replies
1
Boosts
1
Views
232
Activity
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?
Replies
5
Boosts
0
Views
243
Activity
Jun ’25
HealthKit Authorization Requests Immediately Denied in iOS 18.5 - No Permission Dialog Shown
I am experiencing a critical issue with HealthKit authorization in iOS 18.5 where requestAuthorization() calls are immediately denied without showing the user permission dialog. Problem Description: HealthKit authorization requests immediately return .sharingDenied status No system permission dialog is displayed to the user Authorization status changes from .notDetermined to .sharingDenied in <0.1 seconds This occurs for all HealthKit data types (step count, heart rate, sleep analysis, etc.) Technical Details: iOS Version: 18.5 (22F76) Xcode Version: 16F6 Device: iPhone (tested on both simulator and physical device) Bundle IDs tested: com.hereforyou.test2024, com.hereforyou.app Entitlements: com.apple.developer.healthkit = true Code Implementation: let healthStore = HKHealthStore() let stepType = HKObjectType.quantityType(forIdentifier: .stepCount)! // Status before request: .notDetermined try await healthStore.requestAuthorization(toShare: [], read: [stepType]) // Status after request: .sharingDenied (immediate, <0.1 seconds) Evidence this is not a code issue: Other HealthKit apps from App Store work correctly on the same device Proper entitlements are configured and verified HKHealthStore.isHealthDataAvailable() returns true Same code worked in previous iOS versions Multiple Bundle IDs tested with same result Expected Behavior: System should display HealthKit permission dialog allowing user to grant/deny access Actual Behavior: Authorization is immediately denied without user interaction Steps to Reproduce: Create new iOS app with HealthKit entitlements Call requestAuthorization() for any HealthKit data type Observe immediate denial without permission dialog Is this a known issue in iOS 18.5? Are there any workarounds or timeline for a fix? Best regards
Replies
3
Boosts
0
Views
169
Activity
Jun ’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
Replies
1
Boosts
0
Views
195
Activity
Jun ’25
Heath Data of Watch
I want to know , how many days will the data of health stays in apple watch . For example, I have not synced the watch with iPhone for two weeks . Then When I synced it , I am only able to see the last week data on iPhone of the watch . Is it true ?
Replies
1
Boosts
0
Views
161
Activity
Jun ’25
Statistics collection query first result returned is wrong
I'm reading hourly statistics from HealthKit using executeStatisticsCollectionQuery (code below). Expectation What I expect is to get back the list with one row per hour, where each hours has the same cumulative sum value. Actual result In results, first hour always contains less calories than next hours, which all have the same value. Example: Start: 2025-06-02T00:00:00+03:00, anchor: 2025-06-02T00:00:00+03:00, end: 2025-06-02T12:00:00+03:00 🟡 2025-06-02T00:00:00+03:00 Optional(50.3986 kcal) 🟡 2025-06-02T01:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T02:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T03:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T04:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T05:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T06:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T07:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T08:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T09:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T10:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T11:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T12:00:00+03:00 Optional(14.0224 kcal) As you can see, here we have 2025-06-02T00:00:00+03:00 Optional(50.3986 kcal) Now, if I add one more hour to the request (from beginning of time window), the same hour has proper calories count, while newly added hour, has wrong value): 2025-06-01T23:00:00+03:00, anchor: 2025-06-01T23:00:00+03:00, end: 2025-06-02T12:00:00+03:00. 🟡 2025-06-01T23:00:00+03:00 Optional(50.3986 kcal) 🟡 2025-06-02T00:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T01:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T02:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T03:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T04:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T05:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T06:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T07:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T08:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T09:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T10:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T11:00:00+03:00 Optional(64.421 kcal) 🟡 2025-06-02T12:00:00+03:00 Optional(14.0224 kcal) And now first hour of the day, magically has more calories burned: 2025-06-02T00:00:00+03:00 Optional(64.421 kcal) I suspect similar things happen with other quantity types, but haven't yet found a way to reproduce it. Am I doing something wrong or is it a bug in HealthKit? Code let anchorDate = startDate let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: [.strictStartDate]) healthStore.executeStatisticsCollectionQuery( quantityType: .basalEnergyBurned, quantitySamplePredicate: predicate, options: [.separateBySource, .cumulativeSum], anchorDate: anchorDate, intervalComponents: DateComponents(hour: 1), initialResultsHandler: { statistics, error in if let error = error { log(.error, "Error retrieving steps: \(error.localizedDescription)") continuation.resume(throwing: SpikeException("Error retrieving steps: \(error.localizedDescription)")) return } if let statistics { let f = ISO8601DateFormatter() f.timeZone = TimeZone.current for s in statistics { log(.debug, "\(f.string(from: s.startDate)) \(s.sumQuantity())") } } continuation.resume(returning: statistics ?? []) } )
Replies
2
Boosts
0
Views
133
Activity
Jun ’25
watchOS workout app not reachable from iOS (sometimes)
In general my workout app is reachable from the iPhone when running a workout, even if in the background. However if the watch app restarts (due to crash or being closed via the dock) via handleActiveWorkoutRecovery then it is only reachable when in the foreground, even though a workout is running. Is this expected / desired behaviour? Is the app given a tighter sandbox (having it's "background privileges" reduced) because of the earlier crash? This behaviour occasionally happens without a crash (or being closed via the dock) - all of a sudden it is no longer reachable via the iPhone. It feels like the app is being "sandboxed" like in #1 but there is no crash or any other kind of log indicating any issue. Generally the only remedy is to stop the workout and restart the app. My question is - is this expected? Is there some condition that causes the watchOS to sandbox the app? Or is this a Watch Connectivity bug?
Replies
0
Boosts
0
Views
161
Activity
May ’25
Healthkit - Oura Sync Issue
We are working on the health related application and use apple health kit to sync the data from different devices like watches or ring. We are targeting oura ring to get sleep and other parameters data. We are able to sync the data from oura for all other parameters (like pulse, respiratory rate, blood pressure, etc..) other than sleep. Surprisingly, sleep data that comes through other devices is syncing as expected from the health kit. We are even getting the data which is added manually in health kit. The only sleep data not syncing is from oura. Can we get a document or any kind of help to sync the data from oura in to our application using health kit?
Replies
0
Boosts
0
Views
115
Activity
May ’25
怎样读取健康记录心理状态的情境,并将自己APP的数据传入进去
读取是不是解析 metadata 的对应键来获取值对吧~但我看了相关开发文档好像没找到这个的键是什么~于是也没法写入到对应的,现在只能自定义键来进行写入 但是这样写入后无法显示在心情下方的影响因素后面~ 这个 key 是没公开的吗还是说我方法弄错了~请各位大大指教
Replies
2
Boosts
0
Views
114
Activity
May ’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); } };
Replies
6
Boosts
0
Views
305
Activity
May ’25
iOS companion app with no Watch connected
Based on Cooordinate with the companion app in this article by Apple https://developer.apple.com/documentation/healthkit/running-workout-sessions if a workout were to be started on the iPhone companion app but with no Watch available, given HKLiveWorkoutBuilder not available in iOS, does the iPhone app need to implement it's own workout tracking such as a timer for counting the elapsed time and location updates for distance and GPS tracking? If so in an instance where a paired Apple Watch were to exist and the workout is continued in the Watch app should the iPhone companion app stop this custom workout tracking and revert to the mirrored workout from the Watch to ensure accurate and synchronised data between the apps?
Replies
0
Boosts
0
Views
201
Activity
May ’25
healthStore.workoutSessionMirroringStartHandler never called
I'm trying to run this example project: https://developer.apple.com/documentation/HealthKit/building-a-multidevice-workout-app When I run it on my device (iPhone 16 Pro and Apple Watch Ultra 2) I get this error: -[SPRemoteInterface _appRecoverAnyExtendedRuntimeSession:]_block_invoke:4350: Got no sessions back from -[CSLSSessionService existingRunningSessions:] or -[CSLSSessionService existingScheduledSessions:] after receiving a PUICInitializeSessionServiceAction I start the workout from my phone, which successfully starts the workout on the watch. But this callback is never triggered on the phone: healthStore.workoutSessionMirroringStartHandler { // not happening } This makes it difficult to learn the mirroring workout technique. I'm using Xcode 16.3 and Mac OS 15.4.1. Any help appreciated!
Replies
0
Boosts
2
Views
163
Activity
Apr ’25
Data Processing Addendum
For an app that plan to integrate Apple HealthKit to allow app users to upload and download their health data, where can I locate the Data Processing Addendum that specifies who the data controller and processor will be, and how such health data will be used or distributed?
Replies
0
Boosts
0
Views
81
Activity
Apr ’25
WatchOS HealthKit HKObserverQuery crashes in background
I have a watchOS app with a connected iOS app using Swift and SwiftUI. The watchOS app should read heart rate date in the background using HKOberserQuery and enableBackgroundDelivery(), send the data to the iPhone app via WCSession. The iPhone app then sends the data to a Firebase project. The issue I am facing now it that the app with the HKObserverQuery works fine when the app is in the foreground, but when the app runs in the background, the observer query gets triggered for the first time (after one hour), but then always get terminated from the watchdog timeout with the following error message: CSLHandleBackgroundHealthKitQueryAction scene-create watchdog transgression: app<app.nanacare.nanacare.nanaCareHealthSync.watchkitapp((null))>:14451 exhausted real (wall clock) time allowance of 15.00 seconds I am using Xcode 16.3 on MacOS 15.4 The App is running on iOS 18.4 and watchOS 11.4 What is the reason for this this issue? I only do a simple SampleQuery to fetch the latest heart rate data inside the HKObserverQuery and then call the completionHandler. The query itself takes less than one second. Or is there a better approach to read continuously heart rate data from healthKit in the background on watchOS? I don't have an active workout session, and I don't need all heart rate data. Once every 15 minutes or so would be enough.
Replies
11
Boosts
1
Views
831
Activity
Apr ’25
Location of indoor workouts
In the fitness app under iOS 18, the location of all workouts is displayed on a small map. For workouts with routes, I can already successfully read out the route and thus also determine the starting point. So that works. For indoor workouts such as yoga or indoor rowing, the exact location is also displayed in the fitness app. I would now also like to read out this location for these indoor workouts in my app. Does anyone know how to do this?
Replies
2
Boosts
0
Views
872
Activity
Jan ’25
HealthKit returns different values depending on the OS the request is made on
Hi, I've had trouble for a while now with HealthKit giving me different values if I make the request on iOS and WatchOS. I am using the exact same method on both with the same parameters but I get vast differences in the results. The code I am using to call HealthKit on both devices is: let dateRange = HKQuery.predicateForSamples(withStart: Date().removeMonths(numberOfMonths: 1), end: Date().endOfDay()) let predicate: NSPredicate predicate = NSCompoundPredicate(type: .and, subpredicates: [dateRange]) let query = HKStatisticsQuery(quantityType: HKQuantityType(.stepCount), quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, error in if error != nil { //print("Error fetching step count, or there is no data: \(error.localizedDescription), \(startDate) -> \(endDate)") onComplete(0) return } if let result, let sum = result.sumQuantity() { let stepCount = sum.doubleValue(for: HKUnit.count()) DispatchQueue.main.async { onComplete(Int(stepCount)) } } } healthStore.execute(query) }
Replies
4
Boosts
0
Views
1.2k
Activity
Jan ’25
Differences in Step Counts Between HealthKit and the Health App
For a given date, there are discrepancies between the step counts obtained from HealthKit and those displayed in the Health app. Is it possible for such discrepancies to occur even if step counts are not manually entered and multiple devices are not being used?
Replies
1
Boosts
0
Views
516
Activity
Nov ’24
incomplete route data in Apple Health
When we upload workout data to HealthKit the route information with the workout detailed data is incomplete: just a few dots. When we select "Show all workout routes" the route data for the same workout shows correctly. We use the HKWorkoutBuilder to store the workout data, and add the location data with the HKWorkoutRouteBuilder to the workout with Is this an Apple Health issue, or do we have to change something in the way we store the location data to the workout?
Replies
3
Boosts
0
Views
523
Activity
Nov ’24
HKWorkoutSession.sendToRemoteWorkoutSession doesn't report success or failure
We are seeing an issue where sending data using the asynchronous method HKWorkoutSession.sendToRemoteWorkoutSession(data: Data) will never return in some cases (no success nor failure). This issue is happening for roughly 5% of Workouts started and will stay broken for the whole workout. The other 95% of the workouts, the connection works flawlessly. This happens on both watchOS 10 and 11, and with phones running iOS 17 or 18. The issue is quite random and not reproducible. Our app has thousands of workouts a day that use the workout session workout data send, with constant messages being send every few seconds. In some of those 5% cases the "sendToRemoteWorkoutSession" will throw way later, like 30+ minutes later, if the watch app is awake long enough to capture a log of a failure. Our code uses the same flow as in the sample project: https://developer.apple.com/documentation/healthkit/workouts_and_activity_rings/building_a_multidevice_workout_app Here is some sample code, which is pretty simple. Setup code: let workoutSession = try HKWorkoutSession(healthStore: healthStore, configuration: configuration) workoutSession.delegate = self activeWorkoutSession?.startMirroringToCompanionDevice { success, error in print("Mirroring started on companion device: \(success), error: \(error)") } workoutSession?.prepare() then later we send data using the workout session: do { print("Will send data") try await workoutSession.sendToRemoteWorkoutSession(data: data) print("Successfully sent data") // This nor the error may be called after waiting extensive amounts of time } catch { print("Failed to send data, error: \(error)") // This nor the success may be called after waiting extensive amounts of time } So far, the only fix is to restart the phone and watch at the same time, which is not a great user experience. Is anyone else seeing this issue? or know how to fix this issue?
Replies
2
Boosts
0
Views
1k
Activity
Nov ’24