스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
다중 기기 운동 앱 구축하기
HealthKit을 사용하여 iPhone을 Apple Watch 기반 운동 앱에 연동하는 방법을 알아보세요. 기기 간에 운동을 미러링하고 사이클링 데이터 유형을 활용하는 방법을 살펴봅니다. 추가로 iPad를 위한 HealthKit도 있습니다.
리소스
관련 비디오
WWDC23
WWDC21
WWDC20
-
다운로드
♪ 감미로운 힙합 ♪ ♪ 환영합니다 제 이름은 시리샤이며 HealthKit 팀의 엔지니어입니다 오늘날 App Store에는 건강을 증진하고 유지하는 건강 및 피트니스 앱이 수백 개나 있죠 그리고 이 모든 앱을 위해 HealthKit이 중앙화된 암호화 데이터베이스를 제공해 여러분의 멋진 앱이 사용자에게 일관된 건강 데이터를 보여 줄 수 있게 합니다 제가 사랑하는 Workout API는 HealthKit이 제공하는 매우 강력한 것이죠 오늘 영상의 예시를 위해 제가 사이클링 운동을 추적할 Apple Watch용 사이클링 앱을 미리 생성해 뒀습니다 손쉬운 접근을 위해 제 iPhone을 자전거 손잡이에 장착해 사이클링 컴퓨터로 사용하려는데요 그렇게 하면 손잡이에 손을 떼지 않고도 Apple Watch에 표시된 실시간 지표를 빠르고 쉽게 확인할 수 있죠 HealthKit은 Apple Watch와 iPhone 간의 활동 운동 세션을 제어하고 미러링할 새로운 Workout API를 도입했습니다 그리고 운동의 지원을 업데이트하기 위해 추적할 새로운 데이터 유형인 사이클링 속도, 파워, 케이던스 기능 한계 파워(FTP)를 추가했죠 거기서 끝나지 않고 HealthKit은 건강 앱과 함께 iPad에서도 사용할 수 있습니다 고객이 iPad에서 iCloud 계정으로 로그인하면 HealthKit을 통해 iPad로 동기화된 건강 데이터를 볼 수 있는데요 더 풍부한 건강 및 운동 후 경험을 제공할 수 있다면 어떨지 한번 상상해 보세요 오늘 저는 예시 앱을 사용해 Apple Watch에서 실행 중인 운동을 페어링된 iPhone과 동기화하는 방법을 시연하겠습니다 그런 다음 코드를 몇 줄 추가해 새로운 사이클링 지표를 수집하고 기기 간에 동기화하는 방법을 보여 드릴 거고요 iPad에서 운동을 표시할 때 필요한 인증 세부 정보로 마무리 짓겠습니다 이제 Apple Watch, iPhone, iPad가 어떻게 함께 작동하면서 훌룡한 운동 경험을 제공하는지를 확인해 봅시다 제 예시 앱은 Apple Watch에서 운동을 실행하는데요 운동 세션을 중앙화된 객체로 사용해 세션의 생명 주기, 시작, 중지 중단 등을 관리합니다 운동 세션이 익숙하지 않으시면 이전에 했던 세션인 'Workouts와 함께 작업하는 새로운 방법'과 'Apple Watch에서 운동 앱 구축하기'를 확인하세요 저는 iPhone에서 운동을 제어할 건데요 그러려면 이 운동 세션을 Apple Watch에서 iPhone으로 가져와야 합니다 이를 위해 HealthKit의 새로운 미러링 세션 API를 사용하겠습니다 Apple Watch에서 미러링된 세션이 시작되면 iPhone 앱이 실행 중이 아닐 때도 백그라운드에서 세션이 구동되어 운동 세션을 전달합니다 세션을 수신하려면 iPhone 앱이 준비되어 있어야겠죠 그래서 우선 HealthStore를 사용해 iPhone 앱 구동 시퀀스에서 핸들러를 설정하겠습니다 그러면 앱이 Apple Watch에서 세션을 수신할 준비가 되죠 포그라운드나 백그라운드에서 iPhone 앱이 구동될 때마다 미러링 시작 핸들러를 구현해 Apple Watch에서 전달된 활성 운동 세션을 수신하도록 할 겁니다 그런 다음 운동 구성을 사이클링의 활성 유형으로 생성하고요 기존의 Start Watch App API를 iPhone 앱에서 호출해 패어링된 Apple Watch에서 앱을 구동하고 운동 구성을 전달합니다 iPhone에서 구성을 수신하면 Apple Watch 앱에서 운동 세션을 생성할 수 있죠 Apple Watch의 운동 세션은 초기 세션이라고 부르고요 iPhone의 운동 세션은 미러링 세션이라고 부릅니다 실제 모습은 이렇습니다 iPhone 앱에서 운동을 시작하면 iPhone에서 구성을 전달받아 Apple Watch의 앱이 구동됩니다 지금까지는 괜찮군요 이 API가 정말 편리한 이유는 초기 세션과 미러링 세션의 상태를 HealthKit이 계속 동기화하기 때문인데요 예를 들어 Apple Watch에서 초기 세션이 중지되면 iPhone의 미러링 세션에서도 마찬가지로 중지됩니다 활성 운동 세션의 사본을 iPhone에 가져오는 것 외에도 HealthKit은 두 기기 간에 관련 운동 데이터를 교환하는 새로운 API를 제공하며 활동을 시작 및 종료하고 이벤트를 생성하는 기능도 제공합니다 좋아요 이제 초기 세션이 준비됐고 iPhone은 핸들러를 수신할 준비가 됐으니 Apple Watch에서 미러링하도록 startMirroringTo CompanionDevice를 호출하고 초기 세션을 시작하겠습니다 Apple Watch에서 startMirroring을 호출하면 Healthkit이 iPhone 컴패니언 앱을 백그라운드에서 구동해 앱이 실시간 활동을 준비하고 미러링을 시작할 핸들러를 호출할 시간을 10초 줍니다 좋아요, Apple Watch에서 세션이 시작됐고 iPhone이 사본을 가져왔군요 이제 기기 간에 세션 상태를 어떻게 주고받는지 보여 드리겠습니다 예시 앱에서 사용자에게 운동 세션의 실행, 중지 등의 상태를 보여 드리려고 하는데요 그래서 Apple Watch와 iPhone에서 세션 상태와 생성된 이벤트를 모니터링할 세션 대리자를 설정하겠습니다 iPhone 앱에서 검색해 회수한 미러링 세션의 참조를 유지하는 것이 중요하다는 점을 유념하세요 Apple Watch에서 startActivity를 호출하면 초기 세션을 시작하고 실행 중인 세션 상태를 변경합니다 이 상태 업데이트는 초기 세션의 세션 대리자로 설정된 Apple Watch 앱에 전달되죠 iPhone의 앱 역시 미러링 세션 대리자를 통해 상태가 업데이트됩니다 이렇게 간단히 iPhone으로 활성 운동 세션을 가져오고 세션의 변경점을 모니터링할 수 있죠 실제 모습은 이렇습니다 Apple Watch에서 운동 세션이 시작되면 iPhone과 Apple Watch의 중지 버튼이 활성화되어 운동 세션이 실행 중임을 가리키죠 초기 세션과 미러링 세션 간의 세션 상태 동기화 외에도 중지와 재개 같은 이벤트를 생성하고 전송할 수도 있습니다 Apple Watch에서 운동 세션을 중지하면 Apple Watch 앱과 iPhone의 미러링 세션은 세션 대리자를 통해 중지 이벤트를 알림으로 받습니다 실제 모습은 이런데요 Apple Watch에서 운동 세션을 중지하면 두 기기 모두 재개 버튼이 활성화되죠 이제 iPhone에 운동 세션이 생겼으니 iPhone에서 운동을 제어할 수도 있습니다 iPhone에서 미러링 세션을 재개하면 Apple Watch의 초기 세션 대리자가 상태 변경을 알림으로 받고 미러링 세션 대리자는 재개 이벤트를 얻습니다 다음으로 올해 도입되는 HealthKit의 새로운 사이클링 기능을 어떻게 활용하는지 보여 드릴 텐데요 사이클링 속도, 파워, 케이던스 등 새로운 데이터 유형 심박수 데이터를 수집하고 건강 데이터베이스에 기록하는 심박수 모니터처럼 이러한 데이터 유형을 제공하도록 설계된 Bluetooth 기기에 직접 연결할 수 있는 새로운 기능 이러한 Bluetooth 기기에서 수집한 데이터를 바탕으로 Apple Watch의 Healthkit이 자동으로 FTP를 계산하고 저장하는 기능이 이에 해당되죠 제 자전거에는 파워와 케이던스를 수집하고 Apple Watch와 페어링된 파워 미터가 있는데요 자전거를 탔을 때 감지기가 Apple Watch에 기록하는 데이터를 iPhone에 전송해 표시되도록 앱을 확장하고자 합니다 이를 위해 우선 권장 빌더 API인 beginCollection을 사용해 사이클링 지표를 수집하고요 데이터를 전송하기 위해 sendData(toRemoteWorkoutSession) API를 사용할 겁니다 사이클링 지표를 전송하도록 Apple Watch의 Bluetooth 감지기가 전송한 속도, 케이던스 파워 데이터를 패키지한 다음, 초기 세션에서 sendData(toRemote WorkoutSession)를 호출하겠습니다 그 결과 iPhone의 미러링 세션 대리자는 didReceiveDataFromRemoteDevice 호출과 함께 iPhone에서 언팩해 표시할 수 있는 패키지 데이터를 수신하죠 지금 보시는 예시 앱 모습이 어떻게 Apple Watch가 사이클링 지표를 전송하고 iPhone 앱에서는 어떻게 표시되는지입니다 sendData (toRemoteWorkoutSession)로 반대 방향인 iPhone에서 Apple Watch로 데이터를 전송할 수도 있습니다 제가 예시 앱으로 운동 중 물 섭취량을 추적해 다음 번에 자전거를 탈 때 더 나은 수분 섭취 계획을 생성하려고 하는데요 이를 위해 미러링 세션에서 물 섭취량을 패키지해 iPhone에서 Apple Watch로 전송하겠습니다 초기 세션 대리자 메서드인 didReceiveDataFromRemoteDevice를 Apple Watch에서 언팩해 저장될 패키지 데이터와 함께 호출합니다 예시 앱에서는 이렇게 보이죠 버튼을 탭해서 섭취한 물을 온스 단위로 측정해 Apple Watch로 전송하면 섭취한 물의 총량이 표시되죠 stopMirroringToCompanionDevice API를 호출해 운동 중에 언제든지 세션의 미러링을 중단할 수 있습니다 이 메서드를 호출하면 컴패니언 기기로 데이터를 전송하는 것을 중단하며 미러링 세션의 didDisconnect FromRemoteDeviceWithError 대리자 메서드가 호출됩니다 그리고 사이클링을 끝내면 빌더를 끝내는 것으로 초기 세션을 종료하고 Apple Watch에 저장할 수 있죠 Apple Watch에 저장한 운동 샘플은 다른 기기에도 동기화되므로 운동 후 요약 정보를 더 자세한 차트와 시각화로 나타낼 수 있습니다 좋아요 다음은 iPad에서 실행 중인 앱에서 운동 후 요약 정보를 제시하겠습니다 Apple Watch에 저장한 운동은 자동으로 iPad에 동기화되기 때문에 운동 데이터를 시각화하기까지 몇 가지만 변경하면 됩니다 HealthKit 데이터에 접근하는 여느 앱처럼 iPad의 제 앱도 우선 사용자 인증을 받아야 하는데요 앱이 인증을 요청하면 필요한 인증 시트가 나타납니다 iPad에서 여러분의 앱은 창이 여러 개일 수 있으므로 적절한 창 위에 인증 시트가 나타나도록 해야 합니다 앱에서 이를 수행하기 위해 우선 HealthKitUI 프레임워크를 가져옵니다 읽고자 하는 데이터 유형을 지정할 건데요 구체적으로는 활동 에너지 사이클링 속도, 파워, 케이던스 심박수, 운동 샘플이 이에 해당합니다 제가 구축한 SwiftUI 앱이 있으니 HealthKitUI 프레임워크의 새로운 healthDataAccessRequest 뷰 수정자를 사용해 공유하고 읽을 데이터 유형과 트리거를 전달하고요 트리거를 참으로 설정하면 앱에서 인증 시트가 제시됩니다 UIKit 앱에서는 healthStores.authorization ViewControllerPresenter 속성을 설정한 다음 공유하고 읽으려는 유형의 인증을 요청합니다 이제 인증이 처리됐으니 iPad에서 제 운동을 확인해 보죠 멋지네요! 이제 운동 데이터에 접속할 수 있고 iPad 화면의 크기를 활용해 앱에 더 풍부한 경험을 생성할 수 있겠어요 참 쉽죠? 이제 iPhone에서 운동을 시작 및 제어하고 풍부한 사이클링 데이터를 Apple Watch에서 수집, 동기화하며 운동 세부 정보를 iPad에서 볼 수 있게 됐습니다 이제 마무리 짓겠습니다 iPad에서 인증을 지원하도록 앱을 업데이트하세요 여러분의 피트니스 앱에 사이클링이 있다면 새로운 데이터 유형을 위한 지원을 추가할 수 있습니다 iPhone과 Apple Watch에서 운동 앱을 구축하는 경우 기기 간에 데이터를 미러링하고 상태를 제어할 수 있는 새로운 미러링 세션 API를 확인하세요 그리고 필요하다면 동기화 식별자와 버전 번호를 써서 여러분의 서버와 사용자의 기기 간에 데이터 일관성을 유지하세요 마지막으로 저희에게 피드백을 보내 주시기 바라요 저희는 세상을 건강하게 유지하도록 멋진 앱을 지속적으로 구축하는 데 필요한 기능을 지원하겠습니다 시청해 주셔서 감사합니다 ♪
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.