Upgrade to Pro — share decks privately, control downloads, hide ads and more …

「1⽇の睡眠」のはかり⽅(HealthKit編)

Avatar for p0dee p0dee
July 23, 2025
200

 「1⽇の睡眠」のはかり⽅(HealthKit編)

Avatar for p0dee

p0dee

July 23, 2025
Tweet

Transcript

  1. © 2025 RIZAP TECHNOLOGIES,Inc. アプリで⼊館から⽇々の健康管理まで、 すべてのことがアプリで可能! QRコードによる⼊退館 スターターキット (体組成計・ヘルスウォッチ) chocoZAP

    TV 「簡単」「便利」「楽しい」を コンセプトとしたコンビニジム ライザップが作ったコンビニジム ※QRコードは株式会社デンソーウェーブの登録商標です。
  2. © 2025 RIZAP TECHNOLOGIES,Inc. .bodyMass .bodyMassIndex .leanBodyMass .bodyFatPercentage .heartRate .heartRateVariabilitySDNN

    .bloodPressureDiastolic .bloodPressureSystolic .bodyTemperature .activeEnergyBurned .basalEnergyBurned .sleepAnalysis
  3. © 2025 RIZAP TECHNOLOGIES,Inc. HKCategorySample startDate: 2025-07-16 00:53:31, endDate: 2025-07-16

    01:05:31, category: asleepCore HKCategorySample startDate: 2025-07-16 01:05:31, endDate: 2025-07-16 01:20:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 01:20:01, endDate: 2025-07-16 01:21:01, category: asleepCore HKCategorySample startDate: 2025-07-16 01:21:01, endDate: 2025-07-16 01:22:01, category: awake HKCategorySample startDate: 2025-07-16 01:22:01, endDate: 2025-07-16 01:44:01, category: asleepCore HKCategorySample startDate: 2025-07-16 01:44:01, endDate: 2025-07-16 01:47:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 01:47:01, endDate: 2025-07-16 01:47:31, category: asleepCore HKCategorySample startDate: 2025-07-16 01:47:31, endDate: 2025-07-16 01:48:01, category: awake HKCategorySample startDate: 2025-07-16 01:48:01, endDate: 2025-07-16 01:54:01, category: asleepCore HKCategorySample startDate: 2025-07-16 01:54:01, endDate: 2025-07-16 02:19:01, category: asleepREM HKCategorySample startDate: 2025-07-16 02:19:01, endDate: 2025-07-16 02:29:01, category: asleepCore HKCategorySample startDate: 2025-07-16 02:29:01, endDate: 2025-07-16 02:44:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 02:44:01, endDate: 2025-07-16 03:03:31, category: asleepCore HKCategorySample startDate: 2025-07-16 03:03:31, endDate: 2025-07-16 03:15:31, category: asleepDeep HKCategorySample startDate: 2025-07-16 03:15:31, endDate: 2025-07-16 03:24:31, category: asleepCore HKCategorySample startDate: 2025-07-16 03:24:31, endDate: 2025-07-16 03:27:31, category: asleepDeep HKCategorySample startDate: 2025-07-16 03:27:31, endDate: 2025-07-16 03:29:01, category: asleepCore HKCategorySample startDate: 2025-07-16 03:29:01, endDate: 2025-07-16 03:35:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 03:35:01, endDate: 2025-07-16 03:41:01, category: asleepCore HKCategorySample startDate: 2025-07-16 03:41:01, endDate: 2025-07-16 03:48:31, category: asleepREM HKCategorySample startDate: 2025-07-16 03:48:31, endDate: 2025-07-16 03:50:01, category: awake HKCategorySample startDate: 2025-07-16 03:50:01, endDate: 2025-07-16 03:54:01, category: asleepCore HKCategorySample startDate: 2025-07-16 03:54:01, endDate: 2025-07-16 04:00:01, category: asleepREM HKCategorySample startDate: 2025-07-16 04:00:01, endDate: 2025-07-16 04:01:31, category: asleepCore HKCategorySample startDate: 2025-07-16 04:01:31, endDate: 2025-07-16 04:04:01, category: asleepREM HKCategorySample startDate: 2025-07-16 04:04:01, endDate: 2025-07-16 04:26:31, category: asleepCore HKCategorySample startDate: 2025-07-16 04:26:31, endDate: 2025-07-16 04:34:31, category: asleepDeep HKCategorySample startDate: 2025-07-16 04:34:31, endDate: 2025-07-16 04:35:01, category: asleepCore HKCategorySample startDate: 2025-07-16 04:35:01, endDate: 2025-07-16 04:36:31, category: awake HKCategorySample startDate: 2025-07-16 04:36:31, endDate: 2025-07-16 05:06:31, category: asleepCore HKCategorySample startDate: 2025-07-16 05:06:31, endDate: 2025-07-16 05:23:01, category: asleepREM HKCategorySample startDate: 2025-07-16 05:23:01, endDate: 2025-07-16 06:03:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:03:01, endDate: 2025-07-16 06:03:31, category: awake HKCategorySample startDate: 2025-07-16 06:03:31, endDate: 2025-07-16 06:17:31, category: asleepCore HKCategorySample startDate: 2025-07-16 06:17:31, endDate: 2025-07-16 06:32:01, category: asleepREM HKCategorySample startDate: 2025-07-16 06:32:01, endDate: 2025-07-16 06:33:31, category: awake HKCategorySample startDate: 2025-07-16 06:33:31, endDate: 2025-07-16 06:35:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:35:01, endDate: 2025-07-16 06:36:01, category: awake HKCategorySample startDate: 2025-07-16 06:36:01, endDate: 2025-07-16 06:38:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:38:01, endDate: 2025-07-16 06:40:01, category: awake HKCategorySample startDate: 2025-07-16 06:40:01, endDate: 2025-07-16 06:43:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:43:01, endDate: 2025-07-16 06:44:31, category: awake HKCategorySample startDate: 2025-07-16 06:44:31, endDate: 2025-07-16 06:49:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:49:01, endDate: 2025-07-16 06:51:01, category: awake HKCategorySample startDate: 2025-07-16 06:51:01, endDate: 2025-07-16 07:15:31, category: asleepCore
  4. © 2025 RIZAP TECHNOLOGIES,Inc. HKCategorySample startDate: 2025-07-16 00:53:31, endDate: 2025-07-16

    01:05:31, category: asleepCore HKCategorySample startDate: 2025-07-16 01:05:31, endDate: 2025-07-16 01:20:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 01:20:01, endDate: 2025-07-16 01:21:01, category: asleepCore HKCategorySample startDate: 2025-07-16 01:21:01, endDate: 2025-07-16 01:22:01, category: awake HKCategorySample startDate: 2025-07-16 01:22:01, endDate: 2025-07-16 01:44:01, category: asleepCore HKCategorySample startDate: 2025-07-16 01:44:01, endDate: 2025-07-16 01:47:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 01:47:01, endDate: 2025-07-16 01:47:31, category: asleepCore HKCategorySample startDate: 2025-07-16 01:47:31, endDate: 2025-07-16 01:48:01, category: awake HKCategorySample startDate: 2025-07-16 01:48:01, endDate: 2025-07-16 01:54:01, category: asleepCore HKCategorySample startDate: 2025-07-16 01:54:01, endDate: 2025-07-16 02:19:01, category: asleepREM HKCategorySample startDate: 2025-07-16 02:19:01, endDate: 2025-07-16 02:29:01, category: asleepCore HKCategorySample startDate: 2025-07-16 02:29:01, endDate: 2025-07-16 02:44:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 02:44:01, endDate: 2025-07-16 03:03:31, category: asleepCore HKCategorySample startDate: 2025-07-16 03:03:31, endDate: 2025-07-16 03:15:31, category: asleepDeep HKCategorySample startDate: 2025-07-16 03:15:31, endDate: 2025-07-16 03:24:31, category: asleepCore HKCategorySample startDate: 2025-07-16 03:24:31, endDate: 2025-07-16 03:27:31, category: asleepDeep HKCategorySample startDate: 2025-07-16 03:27:31, endDate: 2025-07-16 03:29:01, category: asleepCore HKCategorySample startDate: 2025-07-16 03:29:01, endDate: 2025-07-16 03:35:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 03:35:01, endDate: 2025-07-16 03:41:01, category: asleepCore HKCategorySample startDate: 2025-07-16 03:41:01, endDate: 2025-07-16 03:48:31, category: asleepREM HKCategorySample startDate: 2025-07-16 03:48:31, endDate: 2025-07-16 03:50:01, category: awake HKCategorySample startDate: 2025-07-16 03:50:01, endDate: 2025-07-16 03:54:01, category: asleepCore HKCategorySample startDate: 2025-07-16 03:54:01, endDate: 2025-07-16 04:00:01, category: asleepREM HKCategorySample startDate: 2025-07-16 04:00:01, endDate: 2025-07-16 04:01:31, category: asleepCore HKCategorySample startDate: 2025-07-16 04:01:31, endDate: 2025-07-16 04:04:01, category: asleepREM HKCategorySample startDate: 2025-07-16 04:04:01, endDate: 2025-07-16 04:26:31, category: asleepCore HKCategorySample startDate: 2025-07-16 04:26:31, endDate: 2025-07-16 04:34:31, category: asleepDeep HKCategorySample startDate: 2025-07-16 04:34:31, endDate: 2025-07-16 04:35:01, category: asleepCore HKCategorySample startDate: 2025-07-16 04:35:01, endDate: 2025-07-16 04:36:31, category: awake HKCategorySample startDate: 2025-07-16 04:36:31, endDate: 2025-07-16 05:06:31, category: asleepCore HKCategorySample startDate: 2025-07-16 05:06:31, endDate: 2025-07-16 05:23:01, category: asleepREM HKCategorySample startDate: 2025-07-16 05:23:01, endDate: 2025-07-16 06:03:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:03:01, endDate: 2025-07-16 06:03:31, category: awake HKCategorySample startDate: 2025-07-16 06:03:31, endDate: 2025-07-16 06:17:31, category: asleepCore HKCategorySample startDate: 2025-07-16 06:17:31, endDate: 2025-07-16 06:32:01, category: asleepREM HKCategorySample startDate: 2025-07-16 06:32:01, endDate: 2025-07-16 06:33:31, category: awake HKCategorySample startDate: 2025-07-16 06:33:31, endDate: 2025-07-16 06:35:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:35:01, endDate: 2025-07-16 06:36:01, category: awake HKCategorySample startDate: 2025-07-16 06:36:01, endDate: 2025-07-16 06:38:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:38:01, endDate: 2025-07-16 06:40:01, category: awake HKCategorySample startDate: 2025-07-16 06:40:01, endDate: 2025-07-16 06:43:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:43:01, endDate: 2025-07-16 06:44:31, category: awake HKCategorySample startDate: 2025-07-16 06:44:31, endDate: 2025-07-16 06:49:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:49:01, endDate: 2025-07-16 06:51:01, category: awake HKCategorySample startDate: 2025-07-16 06:51:01, endDate: 2025-07-16 07:15:31, category: asleepCore startDate: 2025-07-16 03:29:01, endDate: 2025-07-16 03:35:01, category: asleepDeep
  5. © 2025 RIZAP TECHNOLOGIES,Inc. HKCategorySample startDate: 2025-07-16 00:53:31, endDate: 2025-07-16

    01:05:31, category: asleepCore HKCategorySample startDate: 2025-07-16 01:05:31, endDate: 2025-07-16 01:20:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 01:20:01, endDate: 2025-07-16 01:21:01, category: asleepCore HKCategorySample startDate: 2025-07-16 01:21:01, endDate: 2025-07-16 01:22:01, category: awake HKCategorySample startDate: 2025-07-16 01:22:01, endDate: 2025-07-16 01:44:01, category: asleepCore HKCategorySample startDate: 2025-07-16 01:44:01, endDate: 2025-07-16 01:47:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 01:47:01, endDate: 2025-07-16 01:47:31, category: asleepCore HKCategorySample startDate: 2025-07-16 01:47:31, endDate: 2025-07-16 01:48:01, category: awake HKCategorySample startDate: 2025-07-16 01:48:01, endDate: 2025-07-16 01:54:01, category: asleepCore HKCategorySample startDate: 2025-07-16 01:54:01, endDate: 2025-07-16 02:19:01, category: asleepREM HKCategorySample startDate: 2025-07-16 02:19:01, endDate: 2025-07-16 02:29:01, category: asleepCore HKCategorySample startDate: 2025-07-16 02:29:01, endDate: 2025-07-16 02:44:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 02:44:01, endDate: 2025-07-16 03:03:31, category: asleepCore HKCategorySample startDate: 2025-07-16 03:03:31, endDate: 2025-07-16 03:15:31, category: asleepDeep HKCategorySample startDate: 2025-07-16 03:15:31, endDate: 2025-07-16 03:24:31, category: asleepCore HKCategorySample startDate: 2025-07-16 03:24:31, endDate: 2025-07-16 03:27:31, category: asleepDeep HKCategorySample startDate: 2025-07-16 03:27:31, endDate: 2025-07-16 03:29:01, category: asleepCore HKCategorySample startDate: 2025-07-16 03:29:01, endDate: 2025-07-16 03:35:01, category: asleepDeep HKCategorySample startDate: 2025-07-16 03:35:01, endDate: 2025-07-16 03:41:01, category: asleepCore HKCategorySample startDate: 2025-07-16 03:41:01, endDate: 2025-07-16 03:48:31, category: asleepREM HKCategorySample startDate: 2025-07-16 03:48:31, endDate: 2025-07-16 03:50:01, category: awake HKCategorySample startDate: 2025-07-16 03:50:01, endDate: 2025-07-16 03:54:01, category: asleepCore HKCategorySample startDate: 2025-07-16 03:54:01, endDate: 2025-07-16 04:00:01, category: asleepREM HKCategorySample startDate: 2025-07-16 04:00:01, endDate: 2025-07-16 04:01:31, category: asleepCore HKCategorySample startDate: 2025-07-16 04:01:31, endDate: 2025-07-16 04:04:01, category: asleepREM HKCategorySample startDate: 2025-07-16 04:04:01, endDate: 2025-07-16 04:26:31, category: asleepCore HKCategorySample startDate: 2025-07-16 04:26:31, endDate: 2025-07-16 04:34:31, category: asleepDeep HKCategorySample startDate: 2025-07-16 04:34:31, endDate: 2025-07-16 04:35:01, category: asleepCore HKCategorySample startDate: 2025-07-16 04:35:01, endDate: 2025-07-16 04:36:31, category: awake HKCategorySample startDate: 2025-07-16 04:36:31, endDate: 2025-07-16 05:06:31, category: asleepCore HKCategorySample startDate: 2025-07-16 05:06:31, endDate: 2025-07-16 05:23:01, category: asleepREM HKCategorySample startDate: 2025-07-16 05:23:01, endDate: 2025-07-16 06:03:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:03:01, endDate: 2025-07-16 06:03:31, category: awake HKCategorySample startDate: 2025-07-16 06:03:31, endDate: 2025-07-16 06:17:31, category: asleepCore HKCategorySample startDate: 2025-07-16 06:17:31, endDate: 2025-07-16 06:32:01, category: asleepREM HKCategorySample startDate: 2025-07-16 06:32:01, endDate: 2025-07-16 06:33:31, category: awake HKCategorySample startDate: 2025-07-16 06:33:31, endDate: 2025-07-16 06:35:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:35:01, endDate: 2025-07-16 06:36:01, category: awake HKCategorySample startDate: 2025-07-16 06:36:01, endDate: 2025-07-16 06:38:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:38:01, endDate: 2025-07-16 06:40:01, category: awake HKCategorySample startDate: 2025-07-16 06:40:01, endDate: 2025-07-16 06:43:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:43:01, endDate: 2025-07-16 06:44:31, category: awake HKCategorySample startDate: 2025-07-16 06:44:31, endDate: 2025-07-16 06:49:01, category: asleepCore HKCategorySample startDate: 2025-07-16 06:49:01, endDate: 2025-07-16 06:51:01, category: awake HKCategorySample startDate: 2025-07-16 06:51:01, endDate: 2025-07-16 07:15:31, category: asleepCore あらゆる睡眠パターンを網羅した計算アルゴリズムを考える必要がある
  6. © 2025 RIZAP TECHNOLOGIES,Inc. 00 02 04 06 08 10

    12 14 16 18 20 22 24 22 02 DIVOL DIVOL DIVOL
  7. © 2025 RIZAP TECHNOLOGIES,Inc. 00 02 04 06 08 10

    12 14 16 18 20 22 24 22 02 DIVOL DIVOL DIVOL
  8. © 2025 RIZAP TECHNOLOGIES,Inc. 00 02 04 06 08 10

    12 14 16 18 20 22 24 22 02 
  9. // ひとつながりの睡眠をひとつの塊 chunk とするため、ログを chunk に分類する var chunks: [[HKCategorySample]] =

    [] var chunk: [HKCategorySample] = [samples[0]] for (i, sample) in samples.enumerated().dropFirst() { let before = samples[i - 1] let diff = abs(sample.startDate.timeIntervalSince1970 - before.endDate.timeIntervalSince1970) if diff < 60 * 10 { // 10分までの空きは許容してひと続きとみなす chunk.append(sample) } else { chunks.append(chunk) chunk = [sample] } } chunks.append(chunk)
  10. // 時間が重複している chunk が⽣じることがあるため、組み合わせる(Asleep系とInBed系) // たとえば、 // Chunk1: 22:57-23:13 asleep

    // Chunk2: 22:57-00:49 in bed // Chunk3: 23:13-02:37 asleep // が存在したとき、⼊眠時刻は 22:57 としたいが、Chunk1は⽇を跨いでおらず、 // asleep かつ ⽇跨ぎの Chunk3 の 23:13 が⼊眠時刻となってしまう var targetChunks: [[HKCategorySample]] = [] for chunk in chunks { let chunkRange = chunk.first!.startDate ... chunk.last!.endDate let lastRange = last.first!.startDate ... last.last!.endDate if chunkRange.overlaps(lastRange) { let index = targetChunks.count - 1 targetChunks[index] = last + chunk } else { targetChunks.append(chunk) } }
  11. var removeIndices: [Int] = [] for (i, chunk) in targetChunks.enumerated()

    { let periodRange = period.lowerBound ... period.upperBound let chunkRange = chunk.first!.startDate ... chunk.last!.endDate // 計測対象⽇(period)にかぶっている chunk 以外は除外する if !periodRange.overlaps(chunkRange) { removeIndices.append(i) } // chunk の期間が翌⽇の0:00を跨いでいる場合は除外する if chunkRange.contains(period.upperBound) { if !removeIndices.contains(i) { removeIndices.append(i) } } } targetChunks.remove(atOffsets: .init(removeIndices))
  12. // 計測対象のログを集計 samples.forEach { sample in guard let category =

    HKCategoryValueSleepAnalysis(rawValue: sample.value) else { return } if sleepStart == nil, category.isKindOfAsleep { sleepStart = sample.startDate } if category.isKindOfAsleep { sleepEnd = sample.endDate } let duration = sample.endDate.timeIntervalSince(sample.startDate) switch category { case .inBed: inBed += duration case .asleepUnspecified: asleep += duration case .asleep: asleep += duration case .awake: awake += duration case .asleepCore: core += duration case .asleepDeep: deep += duration case .asleepREM: rem += duration @unknown default: return } }