HealthKit을 통해 Apple Health에 성적 활동 추가하기

HealthKit을 통해 Apple Health에 심박수 또는 걸음 수를 추가하는 방법에 대한 많은 예가 있습니다. 성적 활동을 추적할 수 있는 app을 만들었습니다. 이제 HealthKit 지원을 추가하고 싶습니다.

전제 조건



Xcode에서 앱을 생성한 후 HealthKit 기능을 추가하고 문자열을 Info.plist에 추가합니다.

명확성과 더 나은 실습을 위해 HealthKit에 대한 연결을 처리할 클래스를 생성합니다. 보기에도 추가할 수 있습니다. 추악 할 것입니다.

샘플 대 객체



샘플은 HKHealthStore에 쓰여지는 것이고 객체는 HKHealthStore에서 읽히는 것입니다.

헬스커넥터



사용자 정의 HealthConnector 클래스는 HKHealthStore와의 상호 작용을 용이하게 합니다. 현재 두 세 가지 기능이 있습니다.
  • requestAuthorization
  • saveSample
  • deleteObject

  • 승인 요청


    HKHealthStore와 상호 작용하기 전에 허가를 받아야 합니다. 한 번 물어보는 것으로는 충분하지 않습니다. 사용자는 우리가 보지 않을 때 권한을 취소할 수 있습니다.

    읽고 쓰려는 샘플 유형을 구체적으로 요청해야 합니다. 내 앱은 샘플만 작성하고 아무 것도 검색하지 않으므로 requestAuthorizationread -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)
        }
    }
    


    샘플 수정



    이전 개체를 삭제하고 새 샘플을 저장해야 합니다.

    좋은 웹페이지 즐겨찾기