아이폰의 건강 앱에서 수면 정보를 연동해온다.
사용자가 권한을 변경할 가능성이 있으므로 정보 조회시 마다 해당 정보에 대한 권한을 항상 요청한다.
*healthkit pod를 추가해야함
Sleep Analysis는 HKSampleType중 CategoryType으로 특정 시작일자와 끝일자를 기준으로 Sleep Analysis 타입을 HKSampleType을 조회하면 해당 기간동안 등록된 수면 유형에 대한 데이터를 배열로 넘겨 받는다.
조회 결과 : 측정 기기, 수면 유형, 시작시간, 끝시간을 조회 할 수 있음.
예시 :
[ 3E92DB26-A2B8-425B-B018-1F73C4****BF 3 3E92DB26-A2B8-425B-B018-1F73C4****BF "Apple Watch" (9.3.1), "Watch5,2" (9.3.1)metadata: {
HKTimeZone = "Asia/Seoul";
} (2023-02-21 00:30:31 +0900 - 2023-02-21 00:49:31 +0900)]
HKCategoryValueSleepAnalysis(수면 분석) 유형
0 : in Bed (취침 시간)
1 : asleepUnspecified ()
2 : awake (비수면)
3 : asleepCore (코어수면)
4 : asleepDeep (깊은수면)
5 : asleepREM (REM수면)
조회시 넘겨 받은 데이터들이 모두 수면 시간에 대한건 아니고 위의 그림과 같이 누워 있는 시간대비 깨어 있는 시간이나 수면 유형에 대한 데이터가 같이 오므로 필요한 유형으로 구분지어 데이터를 처리할 필요가 있다.
HKSampleType중 QuantityType은 HKStatisticsQuery를 조회시 해당 기간동안 데이터의 합산 값을 조회할 수 있지만, CategoryType은 합산 결과를 제공하지 않으므로 데이터 배열을 조회하여 별도로 합산하여야 한다.
전체 코드 :
//import HealthKit
let healthStore = HKHealthStore()
let sleepSampleType = HKObjectType.categoryType(forIdentifier: .sleepAnalysis)!
self.healthStore.requestAuthorization(toShare: Set([sleepSampleType]), read: Set([sleepSampleType]))
{ sucess, error in
if !sucess {
print(error)
} else {
if self.healthStore.authorizationStatus(for: sleepSampleType) == .sharingDenied {
print("permission denied")
return
}
let date = Date.now //조회기준 끝일자
var startDate: Date? = Calendar.current.startOfDay(for: date) //조회기준 시작일자
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: date, options: .strictStartDate)
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)
let query = HKSampleQuery(sampleType: sleepSampleType , predicate: predicate, limit: .zero, sortDescriptors: [sortDescriptor]) {
(_, result, err) in
guard let result = result as? [HKCategorySample] else {
print("sleep Record Query", err?.localizedDescription ?? result)
return
}
print("result", result)
var sum = 0; //해당 기간 동안 데이터 합산 (sec)
var sleepDataByDate = [String: [HKCategorySample]]() //날짜별 데이터 분류
var sleepSumByDate = [String: Double]() //날짜별 데이터 합산
for sample in result {
if sample.value != HKCategoryValueSleepAnalysis.awake.rawValue
&& sample.value != HKCategoryValueSleepAnalysis.inBed.rawValue {
let time = sample.endDate.timeIntervalSinceReferenceDate - sample.startDate.timeIntervalSinceReferenceDate
sum = sum + time
let date = sample.startDate
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "yyyy-MM-dd"
let dateString = dateFormatter.string(from: date)
if sleepDataByDate[dateString] != nil {
sleepDataByDate[dateString]!.append(sample)
sleepSumByDate[dateString] = sleepSumByDate[dateString] ?? 0.0 + time
} else {
sleepDataByDate[dateString] = [sample]
sleepSumByDate[dateString] = time
}
}
}
var minute = Int(sum / 60.0)
let hour = Int(minute / 60)
minute = minute - (hour * 60)
print("전체 수면 시간",String(format: "sum %02d:%02d", hour, minute))
}
self.healthStore.execute(query)
}
참고글 :
HealthKit에서 제공하는 데이터 타입
1. Characteristic Identifiers ActivityMoveMode biologicalSex : 생물학적 성별 bloodType : 혈액형 dateOfBirth : 생일 fitzpatrickSkinType : 피츠패트릭피부타입 wheelchairUse
velog.io
Apple Developer Documentation
developer.apple.com
'iOS > Swift' 카테고리의 다른 글
[ios - swift] 화면 터치시UITextField 키보드 내리기 및 스크롤 처리 (0) | 2023.04.11 |
---|---|
[ios - swift] coremotion을 이용한 걸음수 조회 (0) | 2023.02.22 |
[ios - swift] keychain (0) | 2023.02.08 |
[ios - swift] 이미지 공유하기 (0) | 2023.01.04 |
[ios - swift] 버튼 클릭시 이미지 프린트하기 (0) | 2023.01.04 |