HealthKit을 통해 Apple Health에 성적 활동 추가하기
전제 조건
Xcode에서 앱을 생성한 후 HealthKit 기능을 추가하고 문자열을 Info.plist에 추가합니다.
명확성과 더 나은 실습을 위해 HealthKit에 대한 연결을 처리할 클래스를 생성합니다. 보기에도 추가할 수 있습니다. 추악 할 것입니다.
샘플 대 객체
샘플은
HKHealthStore
에 쓰여지는 것이고 객체는 HKHealthStore
에서 읽히는 것입니다.헬스커넥터
사용자 정의
HealthConnector
클래스는 HKHealthStore
와의 상호 작용을 용이하게 합니다. 현재 두 세 가지 기능이 있습니다.requestAuthorization
saveSample
deleteObject
승인 요청
HKHealthStore
와 상호 작용하기 전에 허가를 받아야 합니다. 한 번 물어보는 것으로는 충분하지 않습니다. 사용자는 우리가 보지 않을 때 권한을 취소할 수 있습니다.읽고 쓰려는 샘플 유형을 구체적으로 요청해야 합니다. 내 앱은 샘플만 작성하고 아무 것도 검색하지 않으므로
requestAuthorization
의 read
-parameter는 nil
입니다./// This function requests permission to read and/or write to a specific
/// `HKObjectType`.
/// - Parameter completion: Completion handler must be able to handle boolean return.
func requestAuthorization(completion: @escaping (Bool) -> Void) {
// Check if `HKHealthStore` is available to the user of the app.
guard HKHealthStore.isHealthDataAvailable() else {
completion(false)
return
}
// Check if category type `.sexualActivity` is available to the user.
guard let sexualActivityType = HKObjectType.categoryType(forIdentifier: .sexualActivity) else {
completion(false)
return
}
// Create a set containing the category types we'd like to access.
let writeTypes: Set = [
sexualActivityType
]
// Finally request authorization.
HKHealthStore().requestAuthorization(toShare: writeTypes, read: nil) {
(success, _) in
completion(success)
}
}
샘플 저장
/// This function saves a new sample to `HKHealthStore`. It adds all neccessary meta date.
/// - Parameters:
/// - protection: Was protection used?
/// - date: When was the date of sexual acitivty?
/// - identifier: A UUID that allows to delete the sample later.
/// - completion: Completion handler must be able to handle boolean return.
func saveSample(with protection: Bool, date: Date, identifier: UUID, completion: @escaping (Bool) -> Void) {
// Check if category type `.sexualActivity` is available to the user.
guard let sexualActivityType = HKObjectType.categoryType(forIdentifier: .sexualActivity) else {
completion(false)
return
}
/**
Create the sample.
`value` must be 0. Otherwise the app will crash.
`metadata` must contain all three keys. `HKMetadataKeySyncIdentifier` requires `HKMetadataKeySyncVersion`. Version number is
*/
let sample = HKCategorySample(
type: sexualActivityType,
value: 0,
start: date,
end: date,
metadata: [
HKMetadataKeySexualActivityProtectionUsed: protectionUsed,
HKMetadataKeySyncIdentifier: identifier.uuidString,
HKMetadataKeySyncVersion: 1
]
)
HKHealthStore().save(sample) { (success, error) in
completion(success)
}
}
개체 삭제
/// Deletes the sample with the specified identifier.
/// - Parameters:
/// - identifier: The UUID used to save the sample.
/// - completion: Completion handler must be able to handle boolean return.
func deleteObject(identifier: UUID, completion: @escaping (Bool) -> Void) {
// Narrow down the possible results.
let predicate = HKQuery.predicateForObjects(
withMetadataKey: HKMetadataKeySyncIdentifier,
allowedValues: [identifier.uuidString]
)
// Delete all the objects that match the predicate, which should only be one.
HKHealthStore().deleteObjects(of: HKCategoryType(.sexualActivity), predicate: predicate) { success, _, error in
completion(success)
}
}
샘플 수정
이전 개체를 삭제하고 새 샘플을 저장해야 합니다.
Reference
이 문제에 관하여(HealthKit을 통해 Apple Health에 성적 활동 추가하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/nitricware/adding-sexual-activity-to-apple-health-via-healthkit-356k텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)