218 Exploring New Data Representations in Healthkit
218 Exploring New Data Representations in Healthkit
218 Exploring New Data Representations in Healthkit
in HealthKit
© 2019 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.
70,000
Apps in the Health and Fitness Category on the App Store
•
Hearing health
•
Hearing health
•
Hearing health
•
Hearing health
•
Hearing health
•
Hearing health
•
Hearing health
HealthKit Data Model
Reviewing samples
Sample
Backing Data
Set([Systolic Blood {
[CLLocation 1,
Pressure, "resourceType":
CLLocation 2,
Diastolic Blood "AllergyIntolerance",
CLLocation 3,
Pressure]) . . .
. . .]
}
•
Hearing health
Quantity Data
Components of Quantity Data
Quantity Type
Quantity Sample
Quantity 5 km 60 kg 72 BPM
Start: May 28, 2019 Start: May 29, 2019 Start: May 29, 2019
Date 7:15:00 8:00:00 10:05:00
Interval End: May 28, 2019, End: May 29, 2019 End: May 29, 2019
9:30:00 8:00:00 10:05:00
Representing Multiple Quantities
Sensor
64 BPM 66 BPM 67 BPM 65 BPM 63 BPM
s
0 1 2 3 4 5 6 7 8
Representing Multiple Quantities
Single quantity sample
65 BPM
Start: 0
End: 8
UUID: 95-95b0-c2
device: myController
metadata: {"game1"}
Sensor
64 BPM 66 BPM 67 BPM 65 BPM 63 BPM
s
0 1 2 3 4 5 6 7 8
Representing Multiple Quantities
Multiple quantity samples
Sensor
64 BPM 66 BPM 67 BPM 65 BPM 63 BPM
s
0 1 2 3 4 5 6 7 8
Representing Multiple Quantities
Quantity series
???
Start: 0
End: 8
UUID: 95-95b0-c2
device: myController
metadata: {"game1"}
Sensor
64 BPM 66 BPM 67 BPM 65 BPM 63 BPM
s
0 1 2 3 4 5 6 7 8
Aggregating Multiple Quantities
Aggregating Multiple Quantities
Aggregation Style
Cumulative
Discrete
Aggregating Multiple Quantities
Aggregation Style
Cumulative
Discrete
Aggregating Multiple Quantities
Distance
Cumulative Calories
Steps
Discrete
Aggregating Multiple Quantities
Distance
Cumulative Calories
Sum
Steps
Discrete
Aggregating Multiple Quantities
Distance
Cumulative Calories
Sum
Steps
Discrete
Aggregating Multiple Quantities
Distance
Cumulative Calories
Sum
Steps
Heart Rate
Discrete Body Mass
Height
Aggregating Multiple Quantities
Distance
Cumulative Calories
Sum
Steps
Cumulative
Sum: 6 km
1 km 2 km 3 km
Aggregating Multiple Quantities
Cumulative Discrete
Average: 65 BPM
Minimum: 63 BPM
Sum: 6 km Maximum: 67 BPM
Most Recent: 63 BPM
// HKCumulativeQuantitySample
class HKCumulativeQuantitySample : HKQuantitySample {
var sumQuantity: HKQuantity { get }
}
// HKDiscreteQuantitySample
class HKDiscreteQuantitySample : HKQuantitySample {
var minimumQuantity: HKQuantity { get }
var averageQuantity: HKQuantity { get }
var maximumQuantity: HKQuantity { get }
var mostRecentQuantity: HKQuantity { get }
var mostRecentQuantityDateInterval: DateInterval { get }
}
NEW
// HKCumulativeQuantitySample
public let HKPredicateKeyPathSum: String
// HKDiscreteQuantitySample
public let HKPredicateKeyPathMin: String
public let HKPredicateKeyPathAverage: String
public let HKPredicateKeyPathMax: String
public let HKPredicateKeyPathMostRecent: String
public let HKPredicateKeyPathMostRecentStartDate: String
public let HKPredicateKeyPathMostRecentEndDate: String
public let HKPredicateKeyPathMostRecentDuration: String
Aggregating Multiple Quantities
Average: 65 BPM, Minimum: 63 BPM, Maximum:
??? 67 BPM, Most Recent: 63 BPM
Start: 0
End: 8
UUID: 95-95b0-c2
device: myController
metadata: {"game1"}
Sensor
64 BPM 66 BPM 67 BPM 65 BPM 63 BPM
s
0 1 2 3 4 5 6 7 8
Building a Quantity Series
Average: 65 BPM, Minimum: 63 BPM, Maximum: 67 BPM, Most Recent: 63 BPM
Start: 0
End: 8
UUID: 95-95b0-c2
device: myController
metadata: {"game1"}
Sensor
64 BPM 66 BPM 67 BPM 65 BPM 63 BPM
s
0 1 2 3 4 5 6 7 8
// How to Use HKQuantitySeriesSampleBuilder
Provides updates
150
112.5
Beats Per Minute
75
37.5
0
0 5 min 10 min
HKQuantitySeriesSampleQuery
HKQuantitySeriesSampleQuery(quantitySample: HKQuantitySample,
quantityHandler: (HKQuantitySeriesSampleQuery,
HKQuantity?,
Date?,
Bool,
Error?) -> Void)
HKQuantitySeriesSampleQuery NEW
HKQuantitySeriesSampleQuery(quantityType: HKQuantityType,
predicate: NSPredicate?,
quantityHandler: (HKQuantitySeriesSampleQuery,
HKQuantity?,
Date?,
Bool,
Error?) -> Void)
HKQuantitySeriesSampleQuery NEW
HKQuantitySeriesSampleQuery(quantityType: HKQuantityType,
predicate: NSPredicate?,
quantityHandler: (HKQuantitySeriesSampleQuery,
HKQuantity?,
DateInterval?,
HKQuantitySample?,
Bool,
Error?) -> Void)
HKQuantitySeriesSampleQuery
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
HKQuantitySeriesSampleQuery
quantity: 64 BPM
start: 2
end: 2
sample: nil
done: false
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
HKQuantitySeriesSampleQuery
quantity: 67 BPM
start: 4
end: 4
sample: nil
done: false
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
HKQuantitySeriesSampleQuery
quantity: 65 BPM
start: 6
end: 6
sample: nil
done: false
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
HKQuantitySeriesSampleQuery
quantity: 63 BPM
start: 8
end: 8
sample: nil
done: true
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
HKQuantitySeriesSampleQuery
query.includeSample = true
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
HKQuantitySeriesSampleQuery
query.includeSample = true
quantity: 64 BPM
start: 2
end: 2
sample: QS1
done: false
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
HKQuantitySeriesSampleQuery
query.includeSample = true
quantity: 67 BPM
start: 4
end: 4
sample: QS2
done: false
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
HKQuantitySeriesSampleQuery
query.includeSample = true
quantity: 65 BPM
start: 6
end: 6
sample: QS1
done: false
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
HKQuantitySeriesSampleQuery
query.includeSample = true
quantity: 63 BPM
start: 8
end: 8
sample: QS2
done: true
64 BPM 65 BPM
QS1 Start:2 Start: 6
End:2 End: 6
67 BPM 63 BPM
QS2 Start: 4 Start: 8
End: 4 End: 8
s
0 1 2 3 4 5 6 7 8
•
Demo
•
s
0 1 2 3 4 5
Heart Rate
1.23 s
68 BPM
s
0 1 2 3 4 5
Heart Rate
68 BPM
1.23 s
68 BPM
s
0 1 2 3 4 5
Heart Rate
Heart Rate
Quantity Type
Quantity Sample
68 BPM Quantity
68 BPM
s
0 1 2 3 4 5
Heart Rate Variability SDNN
1.23 s
s
0 1 2 3 4 5
Heart Rate Variability SDNN
1.23 s
0.99s 1.00s 0.99s 0.97s
s
0 1 2 3 4 5
Heart Rate Variability SDNN
0.0109 s
1.23 s
0.99s 1.00s 0.99s 0.97s
s
0 1 2 3 4 5
Heart Rate Variability SDNN
Heart Rate
Variability SDNN
Quantity Type
Quantity Sample
0.0109 Quantity
68 BPMs
s
0 1 2 3 4 5
1.23 s
s
0 1 2 3 4 5
1.23 s
s
0 1 2 3 4 5
Sensor
s
0 1 2 3 4 5
HKHeartbeatSeriesSample NEW
Start: 0
End: 5
UUID: 95-95b0-c2
device: myController
metadata: {"game1"}
Sensor
s
0 1 2 3 4 5
Heartbeat Series vs. Quantity Series
// HKHeartbeatSeriesSample
class HKHeartbeatSeriesSample : HKSeriesSample
NEW
// HKHeartbeatSeriesSample
class HKHeartbeatSeriesSample : HKSeriesSample
// HKHeartbeatSeriesBuilder
class HKHeartbeatSeriesBuilder : HKSeriesBuilder
// Building HKHeartbeatSeriesSamples with HKHeartbeatSeriesBuilder
s
0 1 2 3 4 5
Sensor
1.99s
s
0 1 2 3 4 5
// Building HKHeartbeatSeriesSamples with HKHeartbeatSeriesBuilder
builder.finishSeries() {
(heartbeatSeriesSample, error) in
// If no error, heartbeatSeriesSample was created and saved in the database by the builder
}
// Building HKHeartbeatSeriesSamples with HKHeartbeatSeriesBuilder
builder.finishSeries() {
(heartbeatSeriesSample, error) in
// If no error, heartbeatSeriesSample was created and saved in the database by the builder
}
NEW
// HKHeartbeatSeriesSample
class HKHeartbeatSeriesSample : HKSeriesSample
// HKHeartbeatSeriesBuilder
class HKHeartbeatSeriesBuilder : HKSeriesBuilder
// HKHeartbeatSeriesQuery
class HKHeartbeatSeriesQuery : HKQuery
// Querying for Beat-to-Beat Measurements with HKHeartbeatSeriesQuery
Hearing health
Heart Rate Events
Heart Rate Events
Heart Rate Events
Heart Rate Events NEW
HKCategoryTypeIdentifiers
Hearing health
Pure-Tone Testing
And help provide assessment on the kind of hearing impairment/loss you have
And help provide assessment on the kind of hearing impairment/loss you have
125Hz 250Hz 500Hz 1kHz 2kHz 4kHz
L: 11 dBHL L: 18 dBHL L: 34 dBHL L: 33 dBHL L: 47 dBHL L: 32 dBHL
R: 31 dBHL R: 17 dBHL R: 27 dBHL R: 13 dBHL R: 30 dBHL R: 43 dBHL
25
50
125Hz 250Hz 500Hz 1kHz 2kHz 4kHz
HKAudiogramSample NEW
05/19/2019 10:30:00
UUID: 95-95b0-c2
device: myController
metadata: {"game1"}
25
R
50
125Hz 250Hz 500Hz 1kHz 2kHz 4kHz
// Creating an HKAudiogramSample
// Step 1: Create an HKAudiogramSensitivityPoint with the left and right ear sensitivity
values associated with a single frequency
let frequency = HKQuantity(unit: HKUnit.hertz(), doubleValue: 250.0)
// Step 1: Create an HKAudiogramSensitivityPoint with the left and right ear sensitivity
values associated with a single frequency
let frequency = HKQuantity(unit: HKUnit.hertz(), doubleValue: 250.0)
// Step 1: Create an HKAudiogramSensitivityPoint with the left and right ear sensitivity
values associated with a single frequency
let frequency = HKQuantity(unit: HKUnit.hertz(), doubleValue: 250.0)
// Step 1: Create an HKAudiogramSensitivityPoint with the left and right ear sensitivity
values associated with a single frequency
let frequency = HKQuantity(unit: HKUnit.hertz(), doubleValue: 250.0)
.headphoneAudioExposure
Audio Exposure NEW
HKQuantityTypeIdentifiers
.environmentalAudioExposure
NEW
.audioExposureEvent
•
Hearing health
Summary