건강 데이터에 대한 접근 권한 부여
개인 정보 보호를 위해 HealthKit은 세심한 권한 부여를 필요로 합니다. 데이터를 액세스하거나 저장하기 전에 앱에서 사용하는 각 데이터 유형에 대한 읽기 및 공유 권한을 요청해야 합니다. 그러나 모든 데이터 유형에 대한 권한을 한 번에 요청할 필요는 없습니다. 대신, 데이터에 액세스할 때 권한을 요청하기 전까지 기다리는 것이 더 합리적일 수 있습니다.
개인 정보 보호를 위한 일환으로, 사용자가 HealthKit에서 데이터를 읽는 데 대한 권한을 부여했는지 여부를 앱이 알 수 없습니다. 사용자가 권한을 거부한 경우, HealthKit에서 데이터를 읽으려고 시도하면 앱이 성공적으로 HealthKit 저장소에 저장한 샘플만 반환됩니다.
HealthKit 활성화
HealthKit 데이터를 읽거나 저장하기 위해 권한을 요청하기 전에, 앱에 HealthKit 기능을 추가해야 합니다. 또한 Health 권한 시트에 대한 사용자 정의 메시지를 제공해야 합니다.
Xcode는 HealthKit 데이터를 읽기 및 쓰기 위해 별도의 사용자 정의 메시지를 필요로 합니다. 데이터를 읽기 위한 메시지를 사용자 정의하려면 NSHealthShareUsageDescription 키를 설정하고, 데이터를 쓰기 위한 메시지를 사용자 정의하려면 NSHealthUpdateUsageDescription 키를 설정하십시오.
Xcode 13 이상에서 생성된 프로젝트의 경우, 이러한 키를 앱의 Info 탭의 Target Properties 목록에서 설정하십시오. Xcode 12 이하에서 생성된 프로젝트의 경우, 이러한 키를 앱의 Info.plist 파일에 설정하십시오. 자세한 내용은 Information Property List를 참조하십시오.
마지막으로, 다른 HealthKit 메소드를 호출하기 전에 현재 장치에서 Health 데이터를 사용할 수 있는지를 isHealthDataAvailable()를 호출하여 확인하십시오. 자세한 내용은 HealthKit 설정을 참조하십시오.
권한 요청하기
데이터를 읽거나 쓰기 위한 권한을 요청하려면 먼저 읽거나 쓰려는 HealthKit 데이터 유형을 생성합니다. 다음 예제는 활동 중에 소비된 에너지, 사이클링 거리, 걷기 또는 달리기 거리, 휠체어 이동 거리, 그리고 심박수를 위한 데이터 유형을 생성합니다.
// Create the HealthKit data types your app
// needs to read and write.
let allTypes: Set = [
HKQuantityType.workoutType(),
HKQuantityType(.activeEnergyBurned),
HKQuantityType(.distanceCycling),
HKQuantityType(.distanceWalkingRunning),
HKQuantityType(.distanceWheelchair),
HKQuantityType(.heartRate)
]
다음으로 그 데이터에 읽기, 쓰기 요청을 할 수 있습니다. HealthKit store에 접근을 요청하기 위해서는 requestAuthorization(toShare: read:)를 호출합니다.
do {
// Check that Health data is available on the device.
if HKHealthStore.isHealthDataAvailable() {
// Asynchronously request authorization to the data.
try await healthStore.requestAuthorization(toShare: allTypes, read: allTypes)
}
} catch {
// Typically, authorization requests only fail if you haven't set the
// usage and share descriptions in your app's Info.plist, or if
// Health data isn't available on the current device.
fatalError("*** An unexpected error occurred while requesting authorization: \(error.localizedDescription) ***")
}
SwiftUI에서 접근 요청을 하려면 healthDataAccessRequest(store:shareTypes:readTypes:trigger:completion:) modifier를 사용합니다. 이 modifier는 SwiftUI와 HealthKitUI를 동시에 import했을 경우에만 가능합니다.
import SwiftUI
import HealthKitUI
struct MyView: View {
@State var authenticated = false
@State var trigger = false
var body: some View {
Button("Access health data") {
// OK to read or write HealthKit data here.
}
.disabled(!authenticated)
// If HealthKit data is available, request authorization
// when this view appears.
.onAppear() {
// Check that Health data is available on the device.
if HKHealthStore.isHealthDataAvailable() {
// Modifying the trigger initiates the health data
// access request.
trigger.toggle()
}
}
// Requests access to share and read HealthKit data types
// when the trigger changes.
.healthDataAccessRequest(store: healthStore,
shareTypes: allTypes,
readTypes: allTypes,
trigger: trigger) { result in
switch result {
case .success(_):
authenticated = true
case .failure(let error):
// Handle the error here.
fatalError("*** An error occurred while requesting authentication: \(error) ***")
}
}
}
}
앱이 새로운 권한을 요청할 때마다, 시스템은 요청된 모든 데이터 유형이 표시된 양식을 표시합니다. 사람들은 개별 읽기 및 공유 권한을 켜고 끌 수 있습니다.
Check for authorization before saving data
누군가가 데이터 유형을 공유할 권한을 부여하면 해당 유형의 새로운 샘플을 만들고 HealthKit 저장소에 저장할 수 있습니다. 그러나 데이터를 저장하기 전에 해당 데이터 유형을 공유할 권한이 있는지 확인하려면 authorizationStatus(for:) 메소드를 호출하십시오. 아직 권한을 요청하지 않은 경우, 저장을 시도하면 HKError.Code.errorAuthorizationNotDetermined 오류가 발생합니다. 권한을 거부한 경우 저장 시도는 HKError.Code.errorAuthorizationDenied 오류로 실패합니다.
Specify required clinical record types
만약 앱이 정상적으로 작동하기 위해 특정 임상 기록 데이터에 접근해야 한다면, NSHealthRequiredReadAuthorizationTypeIdentifiers 키를 사용하여 앱의 Info.plist 파일에 필요한 임상 기록 유형을 지정하십시오. 이 키는 앱이 읽을 수 있는 권한이 필요한 데이터 유형을 정의합니다. 값은 필요한 유형의 타입 식별자를 포함하는 문자열 배열로 설정하십시오. 타입 식별자 목록은 HKClinicalTypeIdentifier를 참조하십시오.
개인 정보 보호를 위해, 세 개 이상의 필수 임상 기록 유형을 지정해야 합니다. 사용자가 타입 중 하나의 권한을 거부하면, 권한이 HKError.Code.errorRequiredAuthorizationDenied 오류와 함께 실패하며, 시스템은 사용자가 액세스를 거부한 레코드 유형을 알려주지 않습니다.
'SwiftUI' 카테고리의 다른 글
HKHealthStore (0) | 2024.03.11 |
---|---|
Alamofire (0) | 2024.03.11 |
HealthKit 을 사용하기 전에 세팅 (0) | 2024.03.11 |
HealthKit 소개 (0) | 2024.03.11 |
Core Bluetooth (0) | 2024.03.07 |