운동한 유저 경로에 접근하기
앱은 HealthKit의 모든 운동과 관련된 경로를 읽을 수 있습니다(예: 사용자가 걷거나 달릴 때 취한 경로). 그러나 경로 데이터의 크기와 성격으로 인해 두 가지 문제가 발생합니다.
* 경로 샘플은 정적이지 않습니다.
* 대부분의 HealthKit 데이터와는 달리, 앱은 시간이 지남에 따라 경로 데이터를 추가하거나 업데이트할 수 있습니다. 예를 들어, 앱은 경로 데이터를 연결하기 전에 운동을 저장해야 합니다.
또한, 앱은 종종 경로 데이터를 후처리합니다. 예를 들어, 앱은 Apple Watch에서 초기 경로 샘플을 생성하고 저장할 수 있지만, iPhone이나 원격 서버에서 추가로 자연스러운 처리를 수행할 수 있습니다. 자연스러운 처리가 완료되면 앱은 동기화 식별자를 사용하여 경로 샘플을 업데이트하고, 원래 샘플을 새로운 업데이트된 버전으로 대체합니다.
결과적으로, 특정 운동에 대한 현재 경로 샘플만 반환하는 쿼리가 경로의 오래된 복사본을 반환하거나 아무것도 반환하지 않을 수 있습니다. 앱이 가장 최신의 경로 샘플을 받도록 보장하려면 고정된 개체 쿼리를 사용하여 현재 경로를 가져오고 추가 또는 업데이트를 추적하십시오.
경로 샘플을 획득한 후에도 기본 위치 데이터에 액세스하려면 두 번째 쿼리를 실행해야 합니다. 성능 이유로 시스템은 위치를 비동기적으로 일괄적으로 반환합니다. 새 위치 데이터 일괄이 도착할 때마다 앱은 위치를 처리하고, 예를 들어, 지도에 위치를 표시하거나 데이터를 분석하고 시각화할 수 있습니다.
경로 샘플 객체 가져오기
귀하의 앱이 가장 최신의 경로 정보를 수신하도록 보장하려면 고정된 객체 쿼리를 사용하여 경로에 액세스하고 업데이트를 추적하십시오.
let runningObjectQuery = HKQuery.predicateForObjects(from: myWorkout)
let routeQuery = HKAnchoredObjectQuery(type: HKSeriesType.workoutRoute(), predicate: runningObjectQuery, anchor: nil, limit: HKObjectQueryNoLimit) { (query, samples, deletedObjects, anchor, error) in
guard error == nil else {
// Handle any errors here.
fatalError("The initial query failed.")
}
// Process the initial route data here.
}
routeQuery.updateHandler = { (query, samples, deleted, anchor, error) in
guard error == nil else {
// Handle any errors here.
fatalError("The update failed.")
}
// Process updates or additions here.
}
store.execute(routeQuery)
쿼리의 업데이트 핸들러는 경로 데이터의 추가 사항이나 변경 사항을 수신합니다. 이를 통해 앱은 최신 버전의 경로를 가능한 빨리 처리할 수 있습니다.
경로 샘플의 위치 데이터에 액세스하기
HKWorkoutRoute 샘플을 받은 후에는 HKWorkoutRouteQuery를 사용하여 해당 위치 데이터에 액세스할 수 있습니다. 경로 샘플에는 수천 개의 위치가 포함될 수 있으므로 모든 위치 데이터를 한 번에 받지 못할 수 있습니다. 대신 시스템은 위치 데이터를 작은 일괄로 반환합니다.
경로와 관련된 위치를 처리하려면:
1. 쿼리 객체를 만듭니다. 위치를 수신할 블록을 제공합니다.
2. 쿼리를 실행합니다. HealthKit 저장소의 execute(_:) 메서드를 호출하여 쿼리를 실행합니다.
3. 경로 데이터를 수신합니다. 블록은 하나 이상의 위치 데이터 일괄을 수신합니다. 블록의 done 매개변수가 true인 경우 모든 데이터를 받았습니다.
4. 선택 사항: 추가 데이터 수신을 중지하려면 HealthKit 저장소의 stop(_:) 메서드를 호출합니다.
// Create the route query.
let query = HKWorkoutRouteQuery(route: myRoute) { (query, locationsOrNil, done, errorOrNil) in
// This block may be called multiple times.
if let error = errorOrNil {
// Handle any errors here.
return
}
guard let locations = locationsOrNil else {
fatalError("*** Invalid State: This can only fail if there was an error. ***")
}
// Do something with this batch of location data.
if done {
// The query returned all the location data associated with the route.
// Do something with the complete data set.
}
// You can stop the query by calling:
// store.stop(query)
}
store.execute(query)
'SwiftUI' 카테고리의 다른 글
WCSession 애플워치 아이폰 간 데이터 전송 (0) | 2024.03.14 |
---|---|
애플워치로 실시간 심박수 가져오기, 애플워치 타깃 추가하기 (0) | 2024.03.14 |
사용자의 운동 경로 기록하기 (0) | 2024.03.13 |
애플워치와 아이폰 간 데이터 통신 (0) | 2024.03.12 |
HKQuantityType (0) | 2024.03.11 |