Swift와 HealthKit로 영양 정보 축적

10010 단어 SwiftHealthKit
안녕하세요, 여기는 오사카의 오코노미야오점입니다.오코노미야키가 최고지만 스위프트도 최고예요.이에 따라 며칠 전 발표된잡채의 영양분을 건강식품(Health.app)에 전달하는 앱은 이름도 리노미(Renomy)라고 한다.에는 스위프트의 헬스키트가 사용됐다.

HealthKit


iOS 8의 HealthKit가 새로 추가되었습니다.고조된 기분은 느껴지지 않지만, 일단 데이터를 저장해두면 나중에 무슨 좋은 일이 생길지... 따라서 iOS 9에 첨가된HKCorrelationTypeIdentifierFood을 사용해 다양한 영양소를 한곳에 모아'아이템 메뉴'헬스로 활용한다.앱으로 보내기로 했어요.이곳에서 우리가 자랑하는 오징어 옥을 샘플로 사용한다.
샘플 코드 및 참조 캡처

주요 등장 Class


HealthKit
HKUnit
유닛
HKQuantity
재다
HKQuantityType
양의 유형
HKQuantitySample
물품.
'물'이라는 단어는 잘 모르지만 우선 목표를 이것으로 삼으세요.

HKUnit, HKQuantity


순서는 앞뒤이고 먼저 HKQunatity의 초기화 방법이다
init(unit unit: HKUnit!, doubleValue value: Double)
Unit은 단위이고 Quantity는 양입니다.unit 주어진 단위doubleValue의 값이 양이다.100.0이라는 숫자Double를 단위로 보고하면 바로'100그램'의 양이다.
유닛의 초기화에는 여러 가지 방법이 있다
HKUnit.percentUnit()
HKUnit(fromString: "cm")
HKUnit.gramUnitWithMetricPrefix(.Kilo)
첫 번째는 이른바 Convenience Constructor의 물건으로 여기는'%'입니다. 다른 것도 많이 준비되어 있습니다.
두 번째는 문자열로 단위를 표시하는 방법(여기는 센티미터)m/s^2"(가속도|$m/s^2달러)일 수도 있습니다.
세 번째는 읽은 것처럼 그램 단위로.이렇게 하면 킬로그램이다.
let kcalUnit = HKUnit.kilocalorieUnit()
let quantity = HKQuantity(unit: kcalUnit, doubleValue: 347)

HKQuantityType, HKQuantitySample


다음은 양 타입.모두 칼로리라고 하지만 섭취하는 칼로리HKUnit냐, 운동으로 소모되는 칼로리HKQuantityTypeIdentifierDietaryEnergyConsumed냐, 기초에너지 소모HKQuantityTypeIdentifierActiveEnergyBurned냐, 잘 지정HKQuantityTypeIdentifierBasalEnergyBurned해야 한다.
이렇게 해서 마침내 필요한 요소를 통일해 HKQuantity Sample의 실례화를 이뤘다.
let type = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDietaryEnergyConsumed)!
let date = NSDate()
let ikatamaEnergySample = HKQuantitySample(type: type, quantity: quantity, startDate: date, endDate: date)
이렇게 하면 오징어 공의 칼로리가 완성된다.그리고 같은 절차에 따라 다른 필요한 영양소 단위를 주의하면서 실례화한다.
예를 들면 단백질은 이런 거예요.
let gramUnit = HKUnit.gramUnit()
let proteinQuantity = HKQuantity(unit: gramUnit, doubleValue: 18.9)
let proteinType = HKQuantityType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDietaryProtein)!
let ikatamaProteinSample = HKQuantitySample(type: proteinType, quantity: proteinQuantity, startDate: date, endDate: date)

HKCorrelation


코드를 보면 일목요연하다.
var itemSet = Set<HKQuantitySample>() 
itemSet.insert(ikatamaEnergySample)
//// 必要な栄養のサンプルを`insert(_)`していく
let foodType = HKCorrelationType.correlationTypeForIdentifier(HKCorrelationTypeIdentifierFood)!
let ikatama = HKCorrelation(type: foodType, startDate: date, endDate: date, objects: itemSet, metadata: metadata)

HKHealthStore


이후에 나는 상점의 상업성을 검사하여 당신에게 상점을 방문해 달라고 요청할 것입니다.틀이 너에게 폐를 끼칠 것이다.
guard HKHealthStore.isHealthDataAvailable() else { return }
let healthStore = HKHealthStore()

let typeSet: Set<HKSampleType> = [energyType, proteinType]
healthStore.requestAuthorizationToShareTypes(typeSet, readTypes: nil) { success, error -> Void in
  // if request is approved
  healthStore.saveObject(ikatama) { success, error in
    if success { print("DONE!!") }
  }
}
순조롭게 발송되고 있습니다.

최후


허둥지둥 썼기 때문에 스위프트 같은 말은 할 수 없었지만 레코드 제작사HKQuantityType에서 쓰느라 신나게 썼다.기회가 된다면 엔um+protocol을 쓸 수 있었으면 좋겠어요.감사합니다.

좋은 웹페이지 즐겨찾기