Start getting Spike data in 3 steps. All Spike SDK async method calls should be wrapped into try catch block.
Step 1 - Create Spike connection
To set up the Spike SDK create SpikeConnectionV3
instance with your Spike application id, application user id and signature unique to each of your apllication users (more on generating signatures here):
import SpikeSDK
static func createConnectionAPIv3(
applicationId: Int,
signature: String,
endUserId: String
) async throws -> SpikeConnectionAPIv3
)
Step 2 - Ask user for permissions
Provide permissions to access iOS HealthKit data. Spike SDK method will check required permissions and request them if needed. Permission dialog may not be shown according on iOS permissions rules.
try await spikeConnectionTemp.requestPermissions(forStatistics: [
.stepsTotal,
.distanceWalking,
]
)
Step 3 - Get data
Info: The maximum permitted date range is 90 days
There are two types of data you can retrieve from Spike:
- Records consist of the raw data points collected from user devices or applications.
- Statistics, on the other hand, are calculated values derived from records.
Statistics
Get daily statistics for steps and total distance from Apple Health:
func getStatistics(
ofTypes types: [StatisticsType.steps],
from: Date.now.addingTimeInterval(-60 * 60 * 24),
to: Date.now,
interval: StatisticsInterval.hour,
filter: StatisticsFilter(providers: [.apple])
) async throws -> [Statistic]
where:
public enum StatisticsType: String {
case steps
case distanceTotal = "distance_total"
case distanceWalking = "distance_walking"
case distanceCycling = "distance_cycling"
case distanceRunning = "distance_running"
case caloriesBurnedTotal = "calories_burned_total"
case caloriesBurnedBasal = "calories_burned_basal"
case caloriesBurnedActive = "calories_burned_active"
}
public enum StatisticsInterval: String, Codable {
case hour
case day
}
public struct StatisticsFilter {
public var excludeManual: Bool = false
public var providers: [Provider]? = nil
}
// Result:
public struct Statistic: Codable, Hashable {
public var start: Date
public var end: Date
public var duration: Int
public var type: StatisticsType
public var value: Double
public var unit: Unit
public var rowCount: Int?
public var recordIds: [UUID]?
}
Records
func getRecords(
ofTypes types: [MetricType.stepsTotal],
from: Date.now.addingTimeInterval(-60 * 60 * 24),
to: Date.now,
filter: StatisticsFilter(providers: [.apple])
) async throws -> [Record]
where:
public enum MetricType: String, Codable, Hashable {
case stepsTotal
case distanceTotal
case distanceWalking
case distanceCycling
case distanceRunning
case caloriesBurnedActive
case caloriesBurnedBasal
case caloriesBurnedTotal
}
// Result
public struct Record: Codable, Hashable {
public var recordId: UUID
public var inputMethod: InputMethod?
public var startAt: Date
public var endAt: Date?
public var modifiedAt: Date
public var duration: Int?
public var provider: Provider?
public var providerSource: ProviderSource?
public var isSourceAggregated: Bool?
public var source: RecordSource?
public var metrics: [String: Double]?
public var activityTags: [ActivityTag]?
public var activityType: ActivityType?
public var sessions: [ActivityEntry]?
public var laps: [ActivityEntry]?
public var segments: [ActivityEntry]?
public var splits: [ActivityEntry]?
public var samples: [ActivitySamples]?
public var routePoints: [ActivitySamples]?
}