운동하는 동안 사용자의 경로 기록하기
앱은 HealthKit에서 운동과 관련하여 경로(예: 걷거나 달릴 때 사용자의 경로)를 생성하고 연결할 수 있습니다. 운동 중에는 사용자를 추적하여 일련의 위치 업데이트를 수집할 수 있습니다. 이러한 업데이트는 사용자의 위치(경도, 위도 및 고도)와 업데이트 시간을 모두 나타냅니다. 다른 앱은 이러한 위치를 사용하여 지도에 경로를 그리거나 HealthKit에서 제공되지 않는 메트릭(예: 운동 중 특정 간격의 사용자 속도)을 계산할 수 있습니다.
운동 경로를 만들기 위해서는 아래와 같은 단계가 있습니다.
1. 권한 요청. 운동을 시작하기 전에 앱은 반드시 HealthKit 데이터 타입과 Core Location 업데이트를 모두 사용할 수 있는 권한을 요청해야 합니다.
2. 운동 시작. route builder 객체를 준비하고 유저의 위치를 트래킹을 시작합니다.
3. builder에 위치 추가. 앱이 Core Location에서 위치 업데이트를 받으면, 필요에 따라 업데이트를 필터링하고 부드럽게 하고, 경로 빌더에 추가하십시오.
4. 운동 종료. 유저의 위치 트래킹을 중단합니다. 운동 기록을 HealthKit store에 저장합니다.
5. route를 종료합니다. route builder에 연관된 운동과 함께 route를 저장합니다
권한 요청하기
HealthKit에 있는 데이터를 사용하기 전에 반드시 권한을 요청해야 합니다. 특히 경로 데이터의 경우, HKWorkout과 HKWorkoutRoute 샘플을 모두 읽고 공유할 수 있는 권한을 요청해야 합니다.
또한 앱이 Core Location에서 위치 업데이트를 받기 전에 위치 서비스를 사용할 수 있는 권한을 요청해야 합니다. 위치 서비스 사용 권한 요청에 대한 자세한 내용은 CLLocationManager를 참조하십시오.
운동 시작하기
사용자가 새로운 운동을 시작하면, Core Location 프레임워크의 CLLocationManager 객체를 사용하여 사용자의 위치를 추적하기 시작하세요. 위치 관리자의 startUpdatingLocation() 메서드를 호출한 후, 위치 관리자의 대리인은 사용자의 현재 위치를 포함하는 업데이트를 받기 시작합니다.
// Start tracking the user.
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
다음으로, 운동을 위한 경로 빌더를 만들고 저장합니다. 운동하는 동안, 핵심 위치 업데이트에서 경로 빌더에 위치를 점진적으로 추가한 다음, 축적된 데이터에서 경로를 생성합니다.
// Create the route builder.
routeBuilder = HKWorkoutRouteBuilder(healthStore: store, device: nil)
빌더에 위치 더하기
앱이 Core Location에서 위치 업데이트를 받을 때, 위치를 필터링하고 부드럽게 한 다음 insertRouteData(_:completion:)를 호출하여 경로 빌더에 위치를 추가하십시오.
// MARK: - CLLocationManagerDelegate Methods.
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// Filter the raw data.
let filteredLocations = locations.filter { (location: CLLocation) -> Bool in
location.horizontalAccuracy <= 50.0
}
guard !filteredLocations.isEmpty else { return }
// Add the filtered data to the route.
routeBuilder.insertRouteData(filteredLocations) { (success, error) in
if !success {
// Handle any errors here.
}
}
}
날것의 핵심 위치 데이터는 상당한 양의 노이즈을 포함할 수 있기 때문에, 앱은 경로 빌더에 추가하기 전에 부정확한 위치를 필터링해야 합니다. 정확도가 50미터 이상인 위치를 추가하지 마세요. 최상의 결과를 얻으려면, 위치 사이의 시간을 3초 이하로 유지하세요.
운동 종료
유저가 운동을 끝냈을 때 유저 트래킹을 중지하고 HealthKit store에 운동을 저장합니다. 저장하는 방법 링크
경로 완료
운동을 끝낸 후 남아있는 위치들을 경로 빌더에 추가하고 finishRoute(with:metadata:completion:)를 호출합니다.
// Create, save, and associate the route with the provided workout.
routeBuilder.finishRoute(with: myWorkout, metadata: myMetadata) { (newRoute, error) in
guard newRoute != nil else {
// Handle any errors here.
return
}
// Optional: Do something with the route here.
}
그런 다음 빌더는 경로 데이터를 처리합니다. 오류가 없다면, 빌더는 운동 경로를 HealthKit 스토어에 저장하고 제공된 운동과 연결합니다. 그런 다음 완료 핸들러를 호출하고 새로 생성된 경로 객체를 통과합니다.
오류가 발생하면, 빌더는 완료 핸들러를 호출하고 대신 오류 객체를 전달합니다. 당신의 앱은 오류를 처리하고 다시 시도하거나 정상적으로 실패해야 합니다.
당신은 하나의 운동과만 경로를 연결할 수 있습니다. 경로를 만든 후에는 운동을 변경할 수 없습니다.
'SwiftUI' 카테고리의 다른 글
애플워치로 실시간 심박수 가져오기, 애플워치 타깃 추가하기 (0) | 2024.03.14 |
---|---|
사용자의 운동 경로 기록 가져오기 (0) | 2024.03.13 |
애플워치와 아이폰 간 데이터 통신 (0) | 2024.03.12 |
HKQuantityType (0) | 2024.03.11 |
HKLiveWorkoutDataSource (0) | 2024.03.11 |