@kingstinct/react-native-healthkit 12.1.2 → 12.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ios/CategoryTypeModule.swift +49 -97
- package/ios/CharacteristicTypeModule.swift +77 -63
- package/ios/CoreModule.swift +324 -280
- package/ios/CorrelationTypeModule.swift +192 -144
- package/ios/ElectrocardiogramModule.swift +185 -194
- package/ios/HeartbeatSeriesModule.swift +123 -171
- package/ios/Helpers.swift +312 -571
- package/ios/MedicationModule.swift +259 -0
- package/ios/PredicateHelpers.swift +334 -0
- package/ios/QuantityTypeModule.swift +297 -378
- package/ios/Serializers.swift +273 -210
- package/ios/SourceProxy.swift +2 -2
- package/ios/StateOfMindModule.swift +179 -125
- package/ios/WorkoutProxy.swift +235 -112
- package/ios/WorkoutsModule.swift +214 -262
- package/lib/commonjs/healthkit.ios.js +22 -2
- package/lib/commonjs/healthkit.js +35 -5
- package/lib/commonjs/hooks/useStatisticsForQuantity.js +1 -1
- package/lib/commonjs/hooks/useSubscribeToCategorySamples.js +20 -0
- package/lib/commonjs/modules.js +2 -1
- package/lib/commonjs/specs/MedicationModule.nitro.js +27 -0
- package/lib/commonjs/types/Constants.js +2 -1
- package/lib/commonjs/types/QuantityType.js +8 -1
- package/lib/commonjs/types/QueryOptions.js +18 -0
- package/lib/commonjs/types/WeatherCondition.js +32 -32
- package/lib/commonjs/types/Workouts.js +1 -50
- package/lib/commonjs/utils/getCategorySampleById.js +1 -1
- package/lib/commonjs/utils/getQuantitySampleById.js +1 -1
- package/lib/commonjs/utils/getWorkoutById.js +1 -1
- package/lib/commonjs/utils/subscribeToCategorySamples.js +29 -0
- package/lib/commonjs/utils/subscribeToQuantitySamples.js +8 -25
- package/lib/module/healthkit.ios.js +20 -2
- package/lib/module/healthkit.js +32 -2
- package/lib/module/hooks/useStatisticsForQuantity.js +1 -1
- package/lib/module/hooks/useSubscribeToCategorySamples.js +17 -0
- package/lib/module/modules.js +1 -0
- package/lib/module/specs/MedicationModule.nitro.js +26 -0
- package/lib/module/types/Constants.js +1 -0
- package/lib/module/types/QuantityType.js +7 -0
- package/lib/module/types/QueryOptions.js +17 -1
- package/lib/module/types/WeatherCondition.js +31 -31
- package/lib/module/types/Workouts.js +0 -49
- package/lib/module/utils/getCategorySampleById.js +1 -1
- package/lib/module/utils/getQuantitySampleById.js +1 -1
- package/lib/module/utils/getWorkoutById.js +1 -1
- package/lib/module/utils/subscribeToCategorySamples.js +26 -0
- package/lib/module/utils/subscribeToQuantitySamples.js +8 -25
- package/lib/typescript/healthkit.d.ts +18 -9
- package/lib/typescript/healthkit.ios.d.ts +33 -15
- package/lib/typescript/hooks/useSubscribeToCategorySamples.d.ts +3 -0
- package/lib/typescript/modules.d.ts +2 -0
- package/lib/typescript/specs/CategoryTypeModule.nitro.d.ts +2 -2
- package/lib/typescript/specs/CoreModule.nitro.d.ts +2 -1
- package/lib/typescript/specs/CorrelationTypeModule.nitro.d.ts +4 -2
- package/lib/typescript/specs/ElectrocardiogramModule.nitro.d.ts +1 -1
- package/lib/typescript/specs/HeartbeatSeriesModule.nitro.d.ts +1 -1
- package/lib/typescript/specs/MedicationModule.nitro.d.ts +56 -0
- package/lib/typescript/specs/QuantityTypeModule.nitro.d.ts +4 -4
- package/lib/typescript/specs/StateOfMindModule.nitro.d.ts +4 -3
- package/lib/typescript/types/CategoryType.d.ts +10 -20
- package/lib/typescript/types/Constants.d.ts +1 -0
- package/lib/typescript/types/CorrelationType.d.ts +8 -10
- package/lib/typescript/types/ElectrocardiogramSample.d.ts +2 -12
- package/lib/typescript/types/HeartbeatSeries.d.ts +2 -14
- package/lib/typescript/types/QuantitySample.d.ts +2 -8
- package/lib/typescript/types/QuantityType.d.ts +7 -8
- package/lib/typescript/types/QuantityTypeIdentifier.d.ts +23 -23
- package/lib/typescript/types/QueryOptions.d.ts +43 -28
- package/lib/typescript/types/Shared.d.ts +52 -7
- package/lib/typescript/types/StateOfMind.d.ts +7 -10
- package/lib/typescript/types/Subscriptions.d.ts +12 -3
- package/lib/typescript/types/WeatherCondition.d.ts +1 -1
- package/lib/typescript/types/Workouts.d.ts +28 -81
- package/lib/typescript/utils/subscribeToCategorySamples.d.ts +5 -0
- package/nitrogen/generated/ios/ReactNativeHealthkit-Swift-Cxx-Bridge.cpp +57 -0
- package/nitrogen/generated/ios/ReactNativeHealthkit-Swift-Cxx-Bridge.hpp +592 -389
- package/nitrogen/generated/ios/ReactNativeHealthkit-Swift-Cxx-Umbrella.hpp +65 -30
- package/nitrogen/generated/ios/ReactNativeHealthkitAutolinking.mm +8 -0
- package/nitrogen/generated/ios/ReactNativeHealthkitAutolinking.swift +15 -0
- package/nitrogen/generated/ios/c++/HybridCategoryTypeModuleSpecSwift.hpp +32 -26
- package/nitrogen/generated/ios/c++/HybridCoreModuleSpecSwift.hpp +36 -37
- package/nitrogen/generated/ios/c++/HybridCorrelationTypeModuleSpecSwift.hpp +55 -2
- package/nitrogen/generated/ios/c++/HybridElectrocardiogramModuleSpecSwift.hpp +36 -30
- package/nitrogen/generated/ios/c++/HybridHeartbeatSeriesModuleSpecSwift.hpp +35 -29
- package/nitrogen/generated/ios/c++/HybridMedicationModuleSpecSwift.cpp +11 -0
- package/nitrogen/generated/ios/c++/HybridMedicationModuleSpecSwift.hpp +181 -0
- package/nitrogen/generated/ios/c++/HybridQuantityTypeModuleSpecSwift.hpp +48 -42
- package/nitrogen/generated/ios/c++/HybridStateOfMindModuleSpecSwift.hpp +59 -36
- package/nitrogen/generated/ios/c++/HybridWorkoutProxySpecSwift.hpp +150 -29
- package/nitrogen/generated/ios/c++/HybridWorkoutsModuleSpecSwift.hpp +13 -28
- package/nitrogen/generated/ios/swift/AggregationStyle.swift +48 -0
- package/nitrogen/generated/ios/swift/CategorySample.swift +571 -24
- package/nitrogen/generated/ios/swift/ComparisonPredicateOperator.swift +2 -2
- package/nitrogen/generated/ios/swift/CorrelationSample.swift +640 -17
- package/nitrogen/generated/ios/swift/{PredicateWithStartAndEnd.swift → DateFilter.swift} +5 -5
- package/nitrogen/generated/ios/swift/ECGQueryOptionsWithAnchor.swift +11 -91
- package/nitrogen/generated/ios/swift/ECGQueryOptionsWithSortOrder.swift +11 -91
- package/nitrogen/generated/ios/swift/ElectrocardiogramSample.swift +570 -72
- package/nitrogen/generated/ios/swift/FilterForSamples.swift +349 -12
- package/nitrogen/generated/ios/swift/FilterForSamplesBase.swift +234 -0
- package/nitrogen/generated/ios/swift/FilterForWorkouts.swift +366 -0
- package/nitrogen/generated/ios/swift/FilterForWorkoutsBase.swift +240 -0
- package/nitrogen/generated/ios/swift/Func_void_MedicationDoseEventsWithAnchorResponse.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_QueryCorrelationSamplesWithAnchorResponse.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_StateOfMindSamplesWithAnchorResponse.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_MedicationDoseEvent_.swift +47 -0
- package/nitrogen/generated/ios/swift/Func_void_std__vector_UserAnnotatedMedication_.swift +47 -0
- package/nitrogen/generated/ios/swift/GeneralForm.swift +104 -0
- package/nitrogen/generated/ios/swift/HeartRateMotionContext.swift +44 -0
- package/nitrogen/generated/ios/swift/HeartbeatSeriesSample.swift +565 -37
- package/nitrogen/generated/ios/swift/HybridCategoryTypeModuleSpec.swift +1 -1
- package/nitrogen/generated/ios/swift/HybridCategoryTypeModuleSpec_cxx.swift +2 -2
- package/nitrogen/generated/ios/swift/HybridCoreModuleSpec.swift +2 -1
- package/nitrogen/generated/ios/swift/HybridCoreModuleSpec_cxx.swift +19 -31
- package/nitrogen/generated/ios/swift/HybridCorrelationTypeModuleSpec.swift +2 -1
- package/nitrogen/generated/ios/swift/HybridCorrelationTypeModuleSpec_cxx.swift +21 -2
- package/nitrogen/generated/ios/swift/HybridElectrocardiogramModuleSpec.swift +1 -1
- package/nitrogen/generated/ios/swift/HybridElectrocardiogramModuleSpec_cxx.swift +2 -2
- package/nitrogen/generated/ios/swift/HybridHeartbeatSeriesModuleSpec.swift +1 -1
- package/nitrogen/generated/ios/swift/HybridHeartbeatSeriesModuleSpec_cxx.swift +2 -2
- package/nitrogen/generated/ios/swift/HybridMedicationModuleSpec.swift +60 -0
- package/nitrogen/generated/ios/swift/HybridMedicationModuleSpec_cxx.swift +208 -0
- package/nitrogen/generated/ios/swift/HybridQuantityTypeModuleSpec.swift +2 -2
- package/nitrogen/generated/ios/swift/HybridQuantityTypeModuleSpec_cxx.swift +9 -43
- package/nitrogen/generated/ios/swift/HybridStateOfMindModuleSpec.swift +2 -1
- package/nitrogen/generated/ios/swift/HybridStateOfMindModuleSpec_cxx.swift +21 -2
- package/nitrogen/generated/ios/swift/HybridWorkoutProxySpec.swift +34 -6
- package/nitrogen/generated/ios/swift/HybridWorkoutProxySpec_cxx.swift +376 -36
- package/nitrogen/generated/ios/swift/InsulinDeliveryReason.swift +40 -0
- package/nitrogen/generated/ios/swift/MedicationConcept.swift +80 -0
- package/nitrogen/generated/ios/swift/MedicationDoseEvent.swift +781 -0
- package/nitrogen/generated/ios/swift/MedicationDoseEventLogStatus.swift +56 -0
- package/nitrogen/generated/ios/swift/MedicationDoseEventScheduleType.swift +40 -0
- package/nitrogen/generated/ios/swift/MedicationDoseEventsWithAnchorResponse.swift +81 -0
- package/nitrogen/generated/ios/swift/ObjectTypeIdentifier.swift +16 -16
- package/nitrogen/generated/ios/swift/PredicateWithMetadataKey.swift +7 -7
- package/nitrogen/generated/ios/swift/QuantitySample.swift +574 -27
- package/nitrogen/generated/ios/swift/QuantityTypeIdentifier.swift +16 -16
- package/nitrogen/generated/ios/swift/QueryCorrelationSamplesWithAnchorResponse.swift +81 -0
- package/nitrogen/generated/ios/swift/QueryOptionsWithAnchor.swift +11 -91
- package/nitrogen/generated/ios/swift/QueryOptionsWithAnchorAndUnit.swift +11 -91
- package/nitrogen/generated/ios/swift/QueryOptionsWithSortOrder.swift +11 -91
- package/nitrogen/generated/ios/swift/QueryOptionsWithSortOrderAndUnit.swift +11 -91
- package/nitrogen/generated/ios/swift/RelatedCoding.swift +76 -0
- package/nitrogen/generated/ios/swift/SampleType.swift +68 -0
- package/nitrogen/generated/ios/swift/SampleTypeIdentifier.swift +16 -16
- package/nitrogen/generated/ios/swift/SampleTypeIdentifierWriteable.swift +0 -16
- package/nitrogen/generated/ios/swift/StateOfMindSample.swift +586 -58
- package/nitrogen/generated/ios/swift/StateOfMindSamplesWithAnchorResponse.swift +81 -0
- package/nitrogen/generated/ios/swift/StatisticsQueryOptions.swift +7 -75
- package/nitrogen/generated/ios/swift/UserAnnotatedMedication.swift +87 -0
- package/nitrogen/generated/ios/swift/WeatherCondition.swift +144 -0
- package/nitrogen/generated/ios/swift/WorkoutQueryOptions.swift +11 -105
- package/nitrogen/generated/ios/swift/WorkoutQueryOptionsWithAnchor.swift +11 -105
- package/nitrogen/generated/ios/swift/WorkoutSample.swift +751 -78
- package/nitrogen/generated/shared/c++/AggregationStyle.hpp +64 -0
- package/nitrogen/generated/shared/c++/CategorySample.hpp +126 -23
- package/nitrogen/generated/shared/c++/CorrelationSample.hpp +134 -12
- package/nitrogen/generated/shared/c++/{PredicateWithStartAndEnd.hpp → DateFilter.hpp} +10 -10
- package/nitrogen/generated/shared/c++/ECGQueryOptionsWithAnchor.hpp +12 -31
- package/nitrogen/generated/shared/c++/ECGQueryOptionsWithSortOrder.hpp +12 -31
- package/nitrogen/generated/shared/c++/ElectrocardiogramSample.hpp +135 -36
- package/nitrogen/generated/shared/c++/FilterForSamples.hpp +124 -0
- package/nitrogen/generated/shared/c++/FilterForSamplesBase.hpp +109 -0
- package/nitrogen/generated/shared/c++/FilterForWorkouts.hpp +131 -0
- package/nitrogen/generated/shared/c++/FilterForWorkoutsBase.hpp +116 -0
- package/nitrogen/generated/shared/c++/GeneralForm.hpp +140 -0
- package/nitrogen/generated/shared/c++/HeartRateMotionContext.hpp +67 -0
- package/nitrogen/generated/shared/c++/HeartbeatSeriesSample.hpp +131 -28
- package/nitrogen/generated/shared/c++/HybridCategoryTypeModuleSpec.hpp +1 -2
- package/nitrogen/generated/shared/c++/HybridCoreModuleSpec.cpp +1 -0
- package/nitrogen/generated/shared/c++/HybridCoreModuleSpec.hpp +10 -28
- package/nitrogen/generated/shared/c++/HybridCorrelationTypeModuleSpec.cpp +1 -0
- package/nitrogen/generated/shared/c++/HybridCorrelationTypeModuleSpec.hpp +11 -1
- package/nitrogen/generated/shared/c++/HybridElectrocardiogramModuleSpec.hpp +1 -2
- package/nitrogen/generated/shared/c++/HybridHeartbeatSeriesModuleSpec.hpp +1 -2
- package/nitrogen/generated/shared/c++/HybridMedicationModuleSpec.cpp +24 -0
- package/nitrogen/generated/shared/c++/HybridMedicationModuleSpec.hpp +80 -0
- package/nitrogen/generated/shared/c++/HybridQuantityTypeModuleSpec.cpp +1 -1
- package/nitrogen/generated/shared/c++/HybridQuantityTypeModuleSpec.hpp +6 -25
- package/nitrogen/generated/shared/c++/HybridStateOfMindModuleSpec.cpp +1 -0
- package/nitrogen/generated/shared/c++/HybridStateOfMindModuleSpec.hpp +9 -2
- package/nitrogen/generated/shared/c++/HybridWorkoutProxySpec.cpp +33 -5
- package/nitrogen/generated/shared/c++/HybridWorkoutProxySpec.hpp +56 -16
- package/nitrogen/generated/shared/c++/InsulinDeliveryReason.hpp +62 -0
- package/nitrogen/generated/shared/c++/MedicationConcept.hpp +93 -0
- package/nitrogen/generated/shared/c++/MedicationDoseEvent.hpp +240 -0
- package/nitrogen/generated/shared/c++/MedicationDoseEventLogStatus.hpp +66 -0
- package/nitrogen/generated/shared/c++/MedicationDoseEventScheduleType.hpp +62 -0
- package/nitrogen/generated/shared/c++/MedicationDoseEventsWithAnchorResponse.hpp +89 -0
- package/nitrogen/generated/shared/c++/ObjectTypeIdentifier.hpp +105 -105
- package/nitrogen/generated/shared/c++/PredicateWithMetadataKey.hpp +8 -8
- package/nitrogen/generated/shared/c++/QuantitySample.hpp +130 -27
- package/nitrogen/generated/shared/c++/QuantityTypeIdentifier.hpp +105 -105
- package/nitrogen/generated/shared/c++/QueryCorrelationSamplesWithAnchorResponse.hpp +89 -0
- package/nitrogen/generated/shared/c++/QueryOptionsWithAnchor.hpp +12 -31
- package/nitrogen/generated/shared/c++/QueryOptionsWithAnchorAndUnit.hpp +12 -31
- package/nitrogen/generated/shared/c++/QueryOptionsWithSortOrder.hpp +12 -31
- package/nitrogen/generated/shared/c++/QueryOptionsWithSortOrderAndUnit.hpp +12 -31
- package/nitrogen/generated/shared/c++/RelatedCoding.hpp +84 -0
- package/nitrogen/generated/shared/c++/SampleType.hpp +87 -0
- package/nitrogen/generated/shared/c++/SampleTypeIdentifier.hpp +105 -105
- package/nitrogen/generated/shared/c++/SampleTypeIdentifierWriteable.hpp +105 -121
- package/nitrogen/generated/shared/c++/StateOfMindSample.hpp +139 -36
- package/nitrogen/generated/shared/c++/StateOfMindSamplesWithAnchorResponse.hpp +89 -0
- package/nitrogen/generated/shared/c++/StatisticsQueryOptions.hpp +8 -27
- package/nitrogen/generated/shared/c++/UserAnnotatedMedication.hpp +90 -0
- package/nitrogen/generated/shared/c++/WeatherCondition.hpp +88 -0
- package/nitrogen/generated/shared/c++/WorkoutQueryOptions.hpp +12 -37
- package/nitrogen/generated/shared/c++/WorkoutQueryOptionsWithAnchor.hpp +12 -37
- package/nitrogen/generated/shared/c++/WorkoutSample.hpp +159 -35
- package/package.json +1 -1
- package/src/healthkit.ios.ts +30 -0
- package/src/healthkit.ts +68 -3
- package/src/hooks/useStatisticsForQuantity.ts +1 -1
- package/src/hooks/useSubscribeToCategorySamples.ts +31 -0
- package/src/modules.ts +4 -0
- package/src/specs/CategoryTypeModule.nitro.ts +2 -2
- package/src/specs/CoreModule.nitro.ts +3 -0
- package/src/specs/CorrelationTypeModule.nitro.ts +11 -3
- package/src/specs/ElectrocardiogramModule.nitro.ts +1 -1
- package/src/specs/HeartbeatSeriesModule.nitro.ts +1 -1
- package/src/specs/MedicationModule.nitro.ts +140 -0
- package/src/specs/QuantityTypeModule.nitro.ts +4 -7
- package/src/specs/StateOfMindModule.nitro.ts +10 -2
- package/src/types/CategoryType.ts +15 -22
- package/src/types/Constants.ts +3 -0
- package/src/types/CorrelationType.ts +10 -15
- package/src/types/ElectrocardiogramSample.ts +2 -14
- package/src/types/HeartbeatSeries.ts +2 -15
- package/src/types/QuantitySample.ts +2 -8
- package/src/types/QuantityType.ts +8 -17
- package/src/types/QuantityTypeIdentifier.ts +25 -25
- package/src/types/QueryOptions.ts +54 -43
- package/src/types/Shared.ts +74 -17
- package/src/types/StateOfMind.ts +8 -10
- package/src/types/Subscriptions.ts +19 -3
- package/src/types/WeatherCondition.ts +1 -1
- package/src/types/Workouts.ts +28 -91
- package/src/utils/getCategorySampleById.ts +1 -1
- package/src/utils/getQuantitySampleById.ts +1 -1
- package/src/utils/getWorkoutById.ts +1 -2
- package/src/utils/subscribeToCategorySamples.ts +38 -0
- package/src/utils/subscribeToQuantitySamples.ts +12 -37
- package/nitrogen/generated/ios/swift/FilterForSamplesAnd.swift +0 -94
- package/nitrogen/generated/ios/swift/FilterForSamplesOr.swift +0 -94
- package/nitrogen/generated/ios/swift/PredicateForSamples.swift +0 -21
- package/nitrogen/generated/ios/swift/PredicateForWorkouts.swift +0 -23
- package/nitrogen/generated/ios/swift/PredicateForWorkoutsAnd.swift +0 -108
- package/nitrogen/generated/ios/swift/PredicateForWorkoutsOr.swift +0 -108
- package/nitrogen/generated/ios/swift/PredicateFromWorkout.swift +0 -45
- package/nitrogen/generated/ios/swift/PredicateWithMetadataOperator.swift +0 -48
- package/nitrogen/generated/ios/swift/PredicateWithUUID.swift +0 -35
- package/nitrogen/generated/ios/swift/PredicateWithUUIDs.swift +0 -47
- package/nitrogen/generated/ios/swift/Variant_PredicateWithUUID_PredicateWithUUIDs_PredicateWithMetadataKey_PredicateWithStartAndEnd_PredicateFromWorkout_FilterForSamplesAnd_FilterForSamplesOr.swift +0 -23
- package/nitrogen/generated/ios/swift/Variant_PredicateWithUUID_PredicateWithUUIDs_PredicateWithMetadataKey_PredicateWithStartAndEnd_PredicateFromWorkout_WorkoutActivityTypePredicate_WorkoutDurationPredicate_PredicateForWorkoutsOr_PredicateForWorkoutsAnd.swift +0 -25
- package/nitrogen/generated/ios/swift/WorkoutActivityTypePredicate.swift +0 -35
- package/nitrogen/generated/shared/c++/FilterForSamplesAnd.hpp +0 -90
- package/nitrogen/generated/shared/c++/FilterForSamplesOr.hpp +0 -90
- package/nitrogen/generated/shared/c++/PredicateForWorkoutsAnd.hpp +0 -96
- package/nitrogen/generated/shared/c++/PredicateForWorkoutsOr.hpp +0 -96
- package/nitrogen/generated/shared/c++/PredicateFromWorkout.hpp +0 -77
- package/nitrogen/generated/shared/c++/PredicateWithMetadataOperator.hpp +0 -84
- package/nitrogen/generated/shared/c++/PredicateWithUUID.hpp +0 -75
- package/nitrogen/generated/shared/c++/PredicateWithUUIDs.hpp +0 -76
- package/nitrogen/generated/shared/c++/WorkoutActivityTypePredicate.hpp +0 -76
package/ios/WorkoutProxy.swift
CHANGED
|
@@ -32,33 +32,15 @@ func getWorkoutRoutesInternal(
|
|
|
32
32
|
workout: HKWorkout
|
|
33
33
|
) async throws -> [HKWorkoutRoute]? {
|
|
34
34
|
let workoutPredicate = HKQuery.predicateForObjects(from: workout)
|
|
35
|
-
let samples = try await withCheckedThrowingContinuation {
|
|
36
|
-
(continuation: CheckedContinuation<[HKSample], Error>) in
|
|
37
|
-
let query = HKAnchoredObjectQuery(
|
|
38
|
-
type: HKSeriesType.workoutRoute(),
|
|
39
|
-
predicate: workoutPredicate,
|
|
40
|
-
anchor: nil,
|
|
41
|
-
limit: HKObjectQueryNoLimit
|
|
42
|
-
) {
|
|
43
|
-
(_, samples, _, _, error) in
|
|
44
|
-
|
|
45
|
-
if let hasError = error {
|
|
46
|
-
return continuation.resume(throwing: hasError)
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
guard let samples = samples else {
|
|
51
|
-
return continuation.resume(
|
|
52
|
-
throwing: RuntimeError.error(withMessage: "Empty response")
|
|
53
|
-
)
|
|
54
|
-
}
|
|
55
35
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
36
|
+
let response = try await sampleAnchoredQueryAsync(
|
|
37
|
+
sampleType: HKSeriesType.workoutRoute(),
|
|
38
|
+
limit: Double(HKObjectQueryNoLimit),
|
|
39
|
+
queryAnchor: nil,
|
|
40
|
+
predicate: workoutPredicate
|
|
41
|
+
)
|
|
60
42
|
|
|
61
|
-
guard let routes = samples as? [HKWorkoutRoute] else {
|
|
43
|
+
guard let routes = response.samples as? [HKWorkoutRoute] else {
|
|
62
44
|
return nil
|
|
63
45
|
}
|
|
64
46
|
|
|
@@ -82,7 +64,7 @@ func getRouteLocations(
|
|
|
82
64
|
|
|
83
65
|
guard let currentLocationBatch = locationsOrNil else {
|
|
84
66
|
return continuation.resume(
|
|
85
|
-
throwing:
|
|
67
|
+
throwing: runtimeErrorWithPrefix("Unexpected empty response")
|
|
86
68
|
)
|
|
87
69
|
}
|
|
88
70
|
|
|
@@ -131,7 +113,7 @@ func getSerializedWorkoutLocations(
|
|
|
131
113
|
|
|
132
114
|
var allRoutes: [WorkoutRoute] = []
|
|
133
115
|
guard let _routes = routes else {
|
|
134
|
-
throw
|
|
116
|
+
throw runtimeErrorWithPrefix("Unexpected empty response")
|
|
135
117
|
}
|
|
136
118
|
for route in _routes {
|
|
137
119
|
let routeMetadata = serializeMetadata(
|
|
@@ -153,12 +135,14 @@ func getSerializedWorkoutLocations(
|
|
|
153
135
|
allRoutes.append(
|
|
154
136
|
WorkoutRoute(
|
|
155
137
|
locations: routeLocations,
|
|
156
|
-
HKMetadataKeySyncIdentifier: routeMetadata.isString(key: "HKMetadataKeySyncIdentifier")
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
138
|
+
HKMetadataKeySyncIdentifier: routeMetadata.isString(key: "HKMetadataKeySyncIdentifier")
|
|
139
|
+
? routeMetadata.getString(
|
|
140
|
+
key: "HKMetadataKeySyncIdentifier"
|
|
141
|
+
) : nil,
|
|
142
|
+
HKMetadataKeySyncVersion: routeMetadata.isDouble(key: "HKMetadataKeySyncVersion")
|
|
143
|
+
? routeMetadata.getDouble(
|
|
144
|
+
key: "HKMetadataKeySyncVersion"
|
|
145
|
+
) : nil
|
|
162
146
|
)
|
|
163
147
|
)
|
|
164
148
|
}
|
|
@@ -168,34 +152,33 @@ func getSerializedWorkoutLocations(
|
|
|
168
152
|
func saveWorkoutRouteInternal(
|
|
169
153
|
workout: HKWorkout,
|
|
170
154
|
locations: [LocationForSaving]
|
|
171
|
-
) ->
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
try await routeBuilder.finishRoute(with: workout, metadata: nil)
|
|
155
|
+
) async throws -> Bool {
|
|
156
|
+
try await withCheckedThrowingContinuation { continuation in
|
|
157
|
+
Task {
|
|
158
|
+
do {
|
|
159
|
+
// create CLLocations and return if locations are empty
|
|
160
|
+
let clLocations = mapLocations(from: locations)
|
|
161
|
+
let routeBuilder = HKWorkoutRouteBuilder(
|
|
162
|
+
healthStore: store,
|
|
163
|
+
device: nil
|
|
164
|
+
)
|
|
165
|
+
try await routeBuilder.insertRouteData(clLocations)
|
|
166
|
+
try await routeBuilder.finishRoute(with: workout, metadata: nil)
|
|
184
167
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
168
|
+
return continuation.resume(returning: true)
|
|
169
|
+
} catch {
|
|
170
|
+
return continuation.resume(throwing: error)
|
|
189
171
|
}
|
|
190
|
-
|
|
191
172
|
}
|
|
173
|
+
|
|
192
174
|
}
|
|
193
175
|
}
|
|
194
176
|
|
|
195
177
|
class WorkoutProxy: HybridWorkoutProxySpec {
|
|
196
|
-
|
|
197
178
|
// Return a Promise instead of directly returning the value; wrap async logic.
|
|
198
|
-
func getStatistic(quantityType: QuantityTypeIdentifier, unitOverride: String?) throws -> Promise<
|
|
179
|
+
func getStatistic(quantityType: QuantityTypeIdentifier, unitOverride: String?) throws -> Promise<
|
|
180
|
+
QueryStatisticsResponse?
|
|
181
|
+
> {
|
|
199
182
|
return Promise.async {
|
|
200
183
|
if #available(iOS 16.0, *) {
|
|
201
184
|
let type = try initializeQuantityType(quantityType.stringValue)
|
|
@@ -208,7 +191,7 @@ class WorkoutProxy: HybridWorkoutProxySpec {
|
|
|
208
191
|
}
|
|
209
192
|
}
|
|
210
193
|
|
|
211
|
-
func getAllStatistics()
|
|
194
|
+
func getAllStatistics() -> Promise<[String: QueryStatisticsResponse]> {
|
|
212
195
|
return Promise.async {
|
|
213
196
|
var result: [String: QueryStatisticsResponse] = [:]
|
|
214
197
|
if #available(iOS 16.0, *) {
|
|
@@ -225,34 +208,58 @@ class WorkoutProxy: HybridWorkoutProxySpec {
|
|
|
225
208
|
|
|
226
209
|
func toJSON(key: String?) throws -> WorkoutSample {
|
|
227
210
|
if let key = key, !key.isEmpty {
|
|
228
|
-
|
|
211
|
+
warnWithPrefix("WorkoutProxy does not support toJSON with key: \(key)")
|
|
229
212
|
}
|
|
230
213
|
|
|
231
214
|
return WorkoutSample(
|
|
232
|
-
uuid: self.uuid,
|
|
233
|
-
device: self.device,
|
|
234
215
|
workoutActivityType: self.workoutActivityType,
|
|
235
216
|
duration: self.duration,
|
|
217
|
+
events: self.events,
|
|
218
|
+
activities: self.activities,
|
|
219
|
+
metadataAverageMETs: self.metadataAverageMETs,
|
|
220
|
+
metadataElevationAscended: self.metadataElevationAscended,
|
|
221
|
+
metadataElevationDescended: self.metadataElevationDescended,
|
|
222
|
+
metadataIndoorWorkout: self.metadataIndoorWorkout,
|
|
223
|
+
metadataAverageSpeed: self.metadataAverageSpeed,
|
|
224
|
+
metadataMaximumSpeed: self.metadataMaximumSpeed,
|
|
225
|
+
sampleType: self.sampleType,
|
|
236
226
|
startDate: self.startDate,
|
|
237
227
|
endDate: self.endDate,
|
|
238
|
-
|
|
228
|
+
hasUndeterminedDuration: self.hasUndeterminedDuration,
|
|
229
|
+
metadataWeatherCondition: self.metadataWeatherCondition,
|
|
230
|
+
metadataWeatherHumidity: self.metadataWeatherHumidity,
|
|
231
|
+
metadataWeatherTemperature: self.metadataWeatherTemperature,
|
|
232
|
+
metadataInsulinDeliveryReason: self.metadataInsulinDeliveryReason,
|
|
233
|
+
metadataHeartRateMotionContext: self.metadataHeartRateMotionContext,
|
|
234
|
+
uuid: self.uuid,
|
|
239
235
|
sourceRevision: self.sourceRevision,
|
|
240
|
-
|
|
241
|
-
|
|
236
|
+
device: self.device,
|
|
237
|
+
metadata: self.metadata,
|
|
238
|
+
metadataExternalUUID: self.metadataExternalUUID,
|
|
239
|
+
metadataTimeZone: self.metadataTimeZone,
|
|
240
|
+
metadataWasUserEntered: self.metadataWasUserEntered,
|
|
241
|
+
metadataDeviceSerialNumber: self.metadataDeviceSerialNumber,
|
|
242
|
+
metadataUdiDeviceIdentifier: self.metadataUdiDeviceIdentifier,
|
|
243
|
+
metadataUdiProductionIdentifier: self.metadataUdiProductionIdentifier,
|
|
244
|
+
metadataDigitalSignature: self.metadataDigitalSignature,
|
|
245
|
+
metadataDeviceName: self.metadataDeviceName,
|
|
246
|
+
metadataDeviceManufacturerName: self.metadataDeviceManufacturerName,
|
|
247
|
+
metadataSyncIdentifier: self.metadataSyncIdentifier,
|
|
248
|
+
metadataSyncVersion: self.metadataSyncVersion,
|
|
249
|
+
metadataWasTakenInLab: self.metadataWasTakenInLab,
|
|
250
|
+
metadataReferenceRangeLowerLimit: self.metadataReferenceRangeLowerLimit,
|
|
251
|
+
metadataReferenceRangeUpperLimit: self.metadataReferenceRangeUpperLimit,
|
|
252
|
+
metadataAlgorithmVersion: self.metadataAlgorithmVersion
|
|
242
253
|
)
|
|
243
254
|
}
|
|
244
255
|
|
|
245
256
|
var workoutPredicate: NSPredicate {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
return predicate
|
|
249
|
-
}
|
|
257
|
+
let predicate = HKQuery.predicateForObjects(from: self.workout)
|
|
258
|
+
return predicate
|
|
250
259
|
}
|
|
251
260
|
|
|
252
261
|
var uuid: String {
|
|
253
|
-
|
|
254
|
-
return workout.uuid.uuidString
|
|
255
|
-
}
|
|
262
|
+
return workout.uuid.uuidString
|
|
256
263
|
}
|
|
257
264
|
|
|
258
265
|
var device: Device? {
|
|
@@ -272,30 +279,28 @@ class WorkoutProxy: HybridWorkoutProxySpec {
|
|
|
272
279
|
}
|
|
273
280
|
|
|
274
281
|
var workoutActivityType: WorkoutActivityType {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
}
|
|
282
|
+
if let activityType = WorkoutActivityType.init(
|
|
283
|
+
rawValue: Int32(workout.workoutActivityType.rawValue)
|
|
284
|
+
) {
|
|
285
|
+
return activityType
|
|
286
|
+
}
|
|
281
287
|
|
|
282
|
-
|
|
288
|
+
warnWithPrefix(
|
|
289
|
+
"Unknown workoutActivityType with rawValue: \(workout.workoutActivityType.rawValue), falling back to 'other'"
|
|
290
|
+
)
|
|
283
291
|
|
|
284
|
-
|
|
285
|
-
}
|
|
292
|
+
return WorkoutActivityType.other
|
|
286
293
|
}
|
|
287
294
|
|
|
288
295
|
var duration: Quantity {
|
|
289
|
-
|
|
290
|
-
let quantity = HKQuantity(unit: .second(), doubleValue: workout.duration)
|
|
296
|
+
let quantity = HKQuantity(unit: .second(), doubleValue: workout.duration)
|
|
291
297
|
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
298
|
+
let duration = serializeQuantityTyped(
|
|
299
|
+
unit: .second(),
|
|
300
|
+
quantity: quantity
|
|
301
|
+
)
|
|
296
302
|
|
|
297
|
-
|
|
298
|
-
}
|
|
303
|
+
return duration
|
|
299
304
|
}
|
|
300
305
|
|
|
301
306
|
var totalDistance: Quantity? {
|
|
@@ -309,21 +314,17 @@ class WorkoutProxy: HybridWorkoutProxySpec {
|
|
|
309
314
|
}
|
|
310
315
|
|
|
311
316
|
var totalEnergyBurned: Quantity? {
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
)
|
|
317
|
-
}
|
|
317
|
+
return serializeQuantityTyped(
|
|
318
|
+
unit: HKUnit.kilocalorie(),
|
|
319
|
+
quantityNullable: workout.totalEnergyBurned
|
|
320
|
+
)
|
|
318
321
|
}
|
|
319
322
|
|
|
320
323
|
var totalSwimmingStrokeCount: Quantity? {
|
|
321
|
-
get {
|
|
322
324
|
return serializeQuantityTyped(
|
|
323
325
|
unit: .count(),
|
|
324
326
|
quantityNullable: workout.totalSwimmingStrokeCount
|
|
325
327
|
)
|
|
326
|
-
}
|
|
327
328
|
|
|
328
329
|
}
|
|
329
330
|
|
|
@@ -340,27 +341,148 @@ class WorkoutProxy: HybridWorkoutProxySpec {
|
|
|
340
341
|
}
|
|
341
342
|
|
|
342
343
|
var startDate: Date {
|
|
343
|
-
|
|
344
|
-
return workout.startDate
|
|
345
|
-
}
|
|
344
|
+
return workout.startDate
|
|
346
345
|
}
|
|
347
346
|
|
|
348
347
|
var endDate: Date {
|
|
349
|
-
|
|
350
|
-
return workout.endDate
|
|
351
|
-
}
|
|
348
|
+
return workout.endDate
|
|
352
349
|
}
|
|
353
350
|
|
|
354
|
-
var metadata: AnyMap
|
|
355
|
-
|
|
356
|
-
return serializeMetadata(workout.metadata)
|
|
357
|
-
}
|
|
351
|
+
var metadata: AnyMap {
|
|
352
|
+
return serializeMetadata(workout.metadata)
|
|
358
353
|
}
|
|
359
354
|
|
|
360
|
-
var sourceRevision: SourceRevision
|
|
361
|
-
|
|
362
|
-
|
|
355
|
+
var sourceRevision: SourceRevision {
|
|
356
|
+
return serializeSourceRevision(workout.sourceRevision)
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// BaseSample properties
|
|
360
|
+
var sampleType: SampleType {
|
|
361
|
+
return serializeSampleType(workout.sampleType)
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
var hasUndeterminedDuration: Bool {
|
|
365
|
+
return workout.hasUndeterminedDuration
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
// Weather metadata
|
|
369
|
+
var metadataWeatherCondition: WeatherCondition? {
|
|
370
|
+
return serializeWeatherCondition(
|
|
371
|
+
workout.metadata?[HKMetadataKeyWeatherCondition] as? HKWeatherCondition)
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
var metadataWeatherHumidity: Quantity? {
|
|
375
|
+
return serializeUnknownQuantityTyped(
|
|
376
|
+
quantity: workout.metadata?[HKMetadataKeyWeatherHumidity] as? HKQuantity)
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
var metadataWeatherTemperature: Quantity? {
|
|
380
|
+
return serializeUnknownQuantityTyped(
|
|
381
|
+
quantity: workout.metadata?[HKMetadataKeyWeatherTemperature] as? HKQuantity)
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
var metadataInsulinDeliveryReason: InsulinDeliveryReason? {
|
|
385
|
+
return serializeInsulinDeliveryReason(
|
|
386
|
+
workout.metadata?[HKMetadataKeyInsulinDeliveryReason] as? HKInsulinDeliveryReason)
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
var metadataHeartRateMotionContext: HeartRateMotionContext? {
|
|
390
|
+
return serializeHeartRateMotionContext(
|
|
391
|
+
workout.metadata?[HKMetadataKeyHeartRateMotionContext] as? HKHeartRateMotionContext)
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Workout-specific metadata
|
|
395
|
+
var metadataAverageMETs: Quantity? {
|
|
396
|
+
return serializeUnknownQuantityTyped(
|
|
397
|
+
quantity: workout.metadata?[HKMetadataKeyAverageMETs] as? HKQuantity)
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
var metadataElevationAscended: Quantity? {
|
|
401
|
+
return serializeUnknownQuantityTyped(
|
|
402
|
+
quantity: workout.metadata?[HKMetadataKeyElevationAscended] as? HKQuantity)
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
var metadataElevationDescended: Quantity? {
|
|
406
|
+
if #available(iOS 18.0, *) {
|
|
407
|
+
return serializeUnknownQuantityTyped(
|
|
408
|
+
quantity: workout.metadata?[HKMetadataKeyElevationDescended] as? HKQuantity)
|
|
363
409
|
}
|
|
410
|
+
return nil
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
var metadataIndoorWorkout: Bool? {
|
|
414
|
+
return workout.metadata?[HKMetadataKeyIndoorWorkout] as? Bool
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
var metadataAverageSpeed: Quantity? {
|
|
418
|
+
return serializeUnknownQuantityTyped(
|
|
419
|
+
quantity: workout.metadata?[HKMetadataKeyAverageSpeed] as? HKQuantity)
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
var metadataMaximumSpeed: Quantity? {
|
|
423
|
+
return serializeUnknownQuantityTyped(
|
|
424
|
+
quantity: workout.metadata?[HKMetadataKeyMaximumSpeed] as? HKQuantity)
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// BaseObject metadata
|
|
428
|
+
var metadataExternalUUID: String? {
|
|
429
|
+
return workout.metadata?[HKMetadataKeyExternalUUID] as? String
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
var metadataTimeZone: String? {
|
|
433
|
+
return workout.metadata?[HKMetadataKeyTimeZone] as? String
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
var metadataWasUserEntered: Bool? {
|
|
437
|
+
return workout.metadata?[HKMetadataKeyWasUserEntered] as? Bool
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
var metadataDeviceSerialNumber: String? {
|
|
441
|
+
return workout.metadata?[HKMetadataKeyDeviceSerialNumber] as? String
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
var metadataUdiDeviceIdentifier: String? {
|
|
445
|
+
return workout.metadata?[HKMetadataKeyUDIDeviceIdentifier] as? String
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
var metadataUdiProductionIdentifier: String? {
|
|
449
|
+
return workout.metadata?[HKMetadataKeyUDIProductionIdentifier] as? String
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
var metadataDigitalSignature: String? {
|
|
453
|
+
return workout.metadata?[HKMetadataKeyDigitalSignature] as? String
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
var metadataDeviceName: String? {
|
|
457
|
+
return workout.metadata?[HKMetadataKeyDeviceName] as? String
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
var metadataDeviceManufacturerName: String? {
|
|
461
|
+
return workout.metadata?[HKMetadataKeyDeviceManufacturerName] as? String
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
var metadataSyncIdentifier: String? {
|
|
465
|
+
return workout.metadata?[HKMetadataKeySyncIdentifier] as? String
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
var metadataSyncVersion: Double? {
|
|
469
|
+
return workout.metadata?[HKMetadataKeySyncVersion] as? Double
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
var metadataWasTakenInLab: Bool? {
|
|
473
|
+
return workout.metadata?[HKMetadataKeyWasTakenInLab] as? Bool
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
var metadataReferenceRangeLowerLimit: Double? {
|
|
477
|
+
return workout.metadata?[HKMetadataKeyReferenceRangeLowerLimit] as? Double
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
var metadataReferenceRangeUpperLimit: Double? {
|
|
481
|
+
return workout.metadata?[HKMetadataKeyReferenceRangeUpperLimit] as? Double
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
var metadataAlgorithmVersion: Double? {
|
|
485
|
+
return workout.metadata?[HKMetadataKeyAlgorithmVersion] as? Double
|
|
364
486
|
}
|
|
365
487
|
|
|
366
488
|
var events: [WorkoutEvent]? {
|
|
@@ -375,7 +497,7 @@ class WorkoutProxy: HybridWorkoutProxySpec {
|
|
|
375
497
|
endDate: event.dateInterval.end
|
|
376
498
|
)
|
|
377
499
|
}
|
|
378
|
-
|
|
500
|
+
warnWithPrefix(
|
|
379
501
|
"Failed to initialize WorkoutEventType with rawValue: \(event.type.rawValue)"
|
|
380
502
|
)
|
|
381
503
|
return nil
|
|
@@ -411,18 +533,19 @@ class WorkoutProxy: HybridWorkoutProxySpec {
|
|
|
411
533
|
if #available(iOS 17.0.0, *) {
|
|
412
534
|
return try await getWorkoutPlanInternal(workout: self.workout)
|
|
413
535
|
} else {
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
)
|
|
536
|
+
warnWithPrefix("Workout plans are only available on iOS 17.0 or later")
|
|
537
|
+
return nil
|
|
417
538
|
}
|
|
418
539
|
}
|
|
419
540
|
}
|
|
420
541
|
|
|
421
|
-
func saveWorkoutRoute(locations: [LocationForSaving])
|
|
422
|
-
return
|
|
542
|
+
func saveWorkoutRoute(locations: [LocationForSaving]) -> Promise<Bool> {
|
|
543
|
+
return Promise.async {
|
|
544
|
+
return try await saveWorkoutRouteInternal(workout: self.workout, locations: locations)
|
|
545
|
+
}
|
|
423
546
|
}
|
|
424
547
|
|
|
425
|
-
func getWorkoutRoutes()
|
|
548
|
+
func getWorkoutRoutes() -> Promise<[WorkoutRoute]> {
|
|
426
549
|
return Promise.async {
|
|
427
550
|
return try await getSerializedWorkoutLocations(workout: self.workout)
|
|
428
551
|
}
|