WWDC Quick Look 💓 By SwiftGGTeam
Measure health with motion

Measure health with motion

元の動画を見る

ハイライト

Apple は、iOS 15 と watchOS の HealthKit に歩行持久力、歩行の安定性、転倒リスクを公開し、開発者が 6 分間の歩行の再調整と歩行の安定性を使用して、遠隔リハビリテーション、理学療法、健康監視機能を構築できるようにします。

主要内容

ジェイミーは膝の手術を受けたばかりだ。医師らは彼女が手術後かろうじて歩けるようになることを知っていたが、Apple Watch の 6 分間歩行の推定値ではわずかな低下しか示されなかった。問題はデータ ウィンドウにあります。この推定では、一定期間の過去の活動および運動データが使用されており、ウィンドウには術前の状態も含まれているため、実際の術後の変化が薄められています。

(02:13) iOS 15 は、HealthKit 推定再調整 API を提供します。アプリが手術日を知ると、その日以降の 6 分間の歩行の推定値を再設定するように要求できます。こうすることで、いくつかの術後の推定値に持久力の低下がより迅速に反映され、ケアチームは回復が順調に進んでいるかどうかを早期に判断できるようになります。

歩行能力には別の問題も含まれます。患者がどのくらいの距離を歩けるかは持久力を示すだけです。患者が安定して歩くかどうかは、転倒のリスクに関係します。遠隔理学療法では、医師が患者の本当の歩き方を毎週確認することは困難です。患者は時間通りに出勤し、トレーニングを行っているかもしれませんが、安定性は低下しています。

(06:24) Apple Walking Steadiness は、iPhone を使用した歩行の質を測定します。 HealthKit は週に 1 回スコアを保存し、スコアを OK、低、または非常に低に分類します。ユーザーがヘルスケア App でそれを開き、安定性が「低」または「非常に低」に低下すると、システムは通知イベントを書き込みます。アプリケーションはこれらのイベントを監視し、患者に次回の予約をスケジュールするよう促すことができます。

これら 2 つの能力の共通点は明らかです。それは、臨床での段階的な評価を日常生活における継続的な信号に変えることです。開発者は追加のハードウェアを必要とせず、またユーザーが毎日特別なテストを完了する必要もありません。前提として、ユーザーは HealthKit を認証し、十分なサンプルを生成するために iPhone または Apple Watch を持参する必要があります。

詳細

1. 6 分間の散歩: 最初に読み取りおよび書き込みの許可を取得します

(03:39) 再調整に合格しましたHKHealthStore.recalibrateEstimates仕上げる。 Apple はプレゼンテーションで 3 つの要件を説明しました。サンプル タイプは再調整をサポートする必要があること、アプリは新しい資格 (承認機能) を必要とすること、そしてタイプの読み取りと書き込みの両方に HealthKit 承認を取得する必要があることです。 iOS 15 で利用できる再調整の種類は次のとおりです。sixMinuteWalkTestDistance

import HealthKit

let healthStore = HKHealthStore()
let types: Set = [
    HKObjectType.quantityType(forIdentifier: .sixMinuteWalkTestDistance)!
]

healthStore.requestAuthorization(toShare: types, read: types) { success, error in
    if let error = error {
        print(error.localizedDescription)
        return
    }

    print("Six-Minute Walk authorization: \(success)")
}

キーポイント:

  • import HealthKit: HealthKit タイプと認可 API を使用します。
  • HKHealthStore():HealthKit データベースにエントリを作成します。
  • HKObjectType.quantityType(forIdentifier: .sixMinuteWalkTestDistance)!:6分間の歩行距離に応じた数量タイプを取り出します。
  • toShare: types: 再キャリブレーションに必要な書き込み許可を要求します。
  • read: types: 読み取り許可をリクエストすると、アプリケーションは推定結果を読み取る必要があります。
  • success: ユーザーが認証プロセスを完了したかどうかを示します。
  • error: 認可リクエストの処理に失敗しました。

2. 徒歩 6 分: 手術日を考慮して見積もりを再調整する

(04:27) アプリケーションは、ジェイミーの手術日を知った後、呼び出します。recalibrateEstimates(sampleType:date:)。システムは、この操作が健康データに影響を与えるかどうかをユーザーに確認するプロンプトを表示します。再キャリブレーションでは、HealthKit にすでに存在する推定値は上書きされません。それはその後に生成される推定値に影響します。プレゼンテーションでは、再調整後に十分な活動履歴が再蓄積されるまでに最大 14 日かかる可能性があり、日付が遠ざかるにつれて効果が徐々に終了することも説明されています。

import HealthKit

let healthStore = HKHealthStore()
let sixMinuteWalkType = HKSampleType.quantityType(forIdentifier: .sixMinuteWalkTestDistance)!
let surgeryDate = Date()

if sixMinuteWalkType.allowsRecalibrationForEstimates {
    healthStore.recalibrateEstimates(sampleType: sixMinuteWalkType, date: surgeryDate) {
        success, error in

        if let error = error {
            print(error.localizedDescription)
            return
        }

        print("Recalibration requested: \(success)")
    }
}

キーポイント:

  • HKSampleType.quantityType(forIdentifier:): 再キャリブレーション メソッドに渡すことができるサンプル タイプを取得します。
  • surgeryDate: 手術や怪我の日など、緊急事態の日付を表します。
  • allowsRecalibrationForEstimates: このサンプル タイプが推定の再調整をサポートしているかどうかを確認します。
  • recalibrateEstimates(sampleType:date:): 指定された日付からの推定値を再作成するように HealthKit に要求します。
  • success: リクエストが正常に送信されたかどうかを示します。
  • error: 資格、認可、またはシステム コールの処理に失敗しました。

3. 歩行の安定性: 最新のスコアを読む

(11:22) 歩行安定性スコアは、という名前の HealthKit 数量タイプです。appleWalkingSteadiness。これは、Apple によって定義された読み取り専用の指標です。単位はパーセントで、範囲は 0 ~ 1 です。スコアは毎週書き込まれます。データが不十分な場合、推定が遅れる場合があります。

import HealthKit

let healthKitStore = HKHealthStore()
let types: Set = [
    HKObjectType.quantityType(forIdentifier: .walkingSteadiness)!
]

healthKitStore.requestAuthorization(toShare: nil, read: types) { success, error in
    if let error = error {
        print(error.localizedDescription)
        return
    }

    print("Walking Steadiness authorization: \(success)")
}

キーポイント:

  • HKHealthStore():HealthKit アクセス ポータルを作成します。
  • .walkingSteadiness:歩行安定性スコアタイプを取り出します。
  • toShare: nil: このインジケーターは読み取り専用であり、アプリケーションによって書き込まれません。
  • read: types: 歩行安定性スコアの読み取りをリクエストします。
  • success: 認証結果を記録します。
  • error: 認可エラーを処理します。

認証を取得したら、最新のスコアを確認してください。

import HealthKit

let healthStore = HKHealthStore()
let steadinessType = HKObjectType.quantityType(forIdentifier: .walkingSteadiness)!
let sortByEndDate = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)

let query = HKSampleQuery(sampleType: steadinessType,
                          predicate: nil,
                          limit: 1,
                          sortDescriptors: [sortByEndDate]) { query, samples, error in

    if let error = error {
        print(error.localizedDescription)
        return
    }

    if let sample = samples?.first as? HKQuantitySample {
        let recentScore = sample.quantity.doubleValue(for: .percent())
        updateStatus(score: recentScore)
    }
}

healthStore.execute(query)

キーポイント:

  • steadinessType: HealthKit の歩行安定性量タイプ。
  • sortByEndDate: 最新のサンプルが最初にランクされるように、サンプルの終了時間によって逆順に並べ替えます。
  • HKSampleQuery: HealthKit からサンプルを読み取ります。
  • predicate: nil:時間制限は必要なく、すべてのサンプルを直接確認できます。
  • limit: 1:最新のものだけです。
  • samples?.first as? HKQuantitySample: 返送されたサンプルを定量サンプルに変換します。
  • .percent(): スコアをパーセント単位で読み取ります。
  • updateStatus(score:): アプリケーションインターフェイスまたは状態モデルにスコアを表示します。

4. 歩行の安定性: スコアをカテゴリに変換する

(12:21) 個々の値を解釈するのは簡単ではありません。 HealthKit が提供するものHKAppleWalkingSteadinessClassification列挙、分数をに変換.ok.low.veryLow。プレゼンテーションのシナリオは理学療法アプリケーションでした。患者の体力が低下している場合、アプリケーションは医療チームに転倒の危険性を警告できます。

import HealthKit

let healthStore = HKHealthStore()
let steadinessType = HKObjectType.quantityType(forIdentifier: .walkingSteadiness)!
let sortByEndDate = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)

let query = HKSampleQuery(sampleType: steadinessType,
                          predicate: nil,
                          limit: 1,
                          sortDescriptors: [sortByEndDate]) { query, samples, error in

    if let error = error {
        print(error.localizedDescription)
        return
    }

    if let sample = samples?.first as? HKQuantitySample {
        let recentScore = sample.quantity.doubleValue(for: .percent())
        let recentClassification = HKAppleWalkingSteadinessClassification(for: sample.quantity)

        updateStatus(classification: recentClassification, score: recentScore)
    }
}

healthStore.execute(query)

キーポイント:

  • HKSampleQuery:最新のスコアを読み取るクエリを再利用します。
  • recentScore: 元のスコアを保持し、トレンド チャートの描画に適しています。
  • HKAppleWalkingSteadinessClassification(for:): HealthKit API を使用してサンプル値をカテゴリに変換します。
  • recentClassification: OK、Low、または Very Low を取得します。
  • updateStatus(classification:score:):カテゴリーとスコアを同時に表示し、患者の理解を容易にします。

5. 歩行安定性イベント: システム通知イベントをリッスンします。

(13:15) Walking Steadiness 通知は、次の名前の HealthKit カテゴリ タイプのサンプルとして書き込まれます。appleWalkingSteadinessEvent。イベントには 4 つのカテゴリがあります。.initialLow.initialVeryLow.repeatLow.repeatVeryLow。最初の 2 つのカテゴリは、ユーザーが「低」または「非常に低」に入ってから約 1 か月後にトリガーされます。後者の 2 つのカテゴリは、ユーザーが同じカテゴリに属している間、約 3 か月ごとにトリガーされます。

import HealthKit

let healthKitStore = HKHealthStore()
let types: Set = [
    HKObjectType.categoryType(forIdentifier: .walkingSteadinessEvent)!
]

healthKitStore.requestAuthorization(toShare: nil, read: types) { success, error in
    if let error = error {
        print(error.localizedDescription)
        return
    }

    print("Walking Steadiness Event authorization: \(success)")
}

キーポイント:

  • categoryType(forIdentifier:): 分類タイプを使用して歩行安定性イベントを読み取ります。
  • .walkingSteadinessEvent: システムによって書き込まれた安定性通知イベントに対応します。
  • toShare: nil: イベントはシステムによって書き込まれ、アプリケーションによってのみ読み取られます。
  • read: types:イベントサンプルの読み込みをリクエストします。
  • success: ユーザーに読み取り権限があるかどうかを確認します。

認証後、使用しますHKObserverQuery新しいイベントを聞きます。

import HealthKit

let healthStore = HKHealthStore()
let notificationType = HKCategoryType.categoryType(forIdentifier: .appleWalkingSteadinessEvent)!

let query = HKObserverQuery(sampleType: notificationType, predicate: nil) {
    query, completionHandler, errorOrNil in

    if let error = errorOrNil {
        print(error.localizedDescription)
        return
    }

    promptCheckupForNotification()

    completionHandler()
}

healthStore.execute(query)

キーポイント:

  • HKCategoryType.categoryType(forIdentifier:): 歩行安定性通知イベント タイプを取得します。
  • HKObserverQuery: HealthKit で新しく書き込まれたサンプルをリッスンします。
  • sampleType: notificationType: 歩行安定性通知イベントのみをリッスンします。
  • predicate: nil: このタイプのすべての新しいイベントをリッスンします。
  • errorOrNil: リスニング コールバックのエラーを処理します。
  • promptCheckupForNotification(): アプリでユーザーにオンライン フォローアップ コンサルテーションのスケジュールを設定するように促します。
  • completionHandler(): イベント処理が完了したことを HealthKit に通知します。
  • healthStore.execute(query): 監視クエリの実行を開始します。

6. 6 週間のデータをクエリし、下降傾向を自分で判断します

(15:12) システム通知は、「低」と「非常に低」のみを対象としています。理学療法クリニックは、別のタイプの患者、つまり分類は悪化していないがスコアが低下し続けている患者についても懸念している可能性があります。講演でのアプローチは、過去 6 週間の歩行安定性サンプルをクエリし、最適な傾き (最適な傾き) を計算し、週平均が 5 ポイント以上減少した場合にレビューを促すというものです。

import HealthKit

let healthStore = HKHealthStore()
let end = Date()
let start = Calendar.current.date(byAdding: .weekOfYear, value: -6, to: end)
let datePredicate = HKQuery.predicateForSamples(withStart: start, end: end, options: [])

let steadinessType = HKObjectType.quantityType(forIdentifier: .walkingSteadiness)!
let sortByEndDate = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)

let query = HKSampleQuery(sampleType: steadinessType,
                          predicate: datePredicate,
                          limit: HKObjectQueryNoLimit,
                          sortDescriptors: [sortByEndDate]) { query, samples, error in

    if let error = error {
        print(error.localizedDescription)
        return
    }

    detectTrends(samples)
}

healthStore.execute(query)

キーポイント:

  • end = Date(): クエリ ウィンドウは現在の時刻で終了します。
  • Calendar.current.date(byAdding:):開始時刻を6週間前に設定します。
  • HKQuery.predicateForSamples(withStart:end:options:): HealthKit クエリの時間範囲を制限します。
  • steadinessType: ターゲット サンプルは依然として歩行安定性スコアです。
  • limit: HKObjectQueryNoLimit: ウィンドウ内のすべてのサンプルを取得します。
  • sortDescriptors: 終了時刻の逆順に並べ替えます。
  • detectTrends(samples):サンプルをカスタムトレンド判定機能に渡します。

トレンド機能はアプリケーション自体によって実装されます。次の例は、スピーチ内の判定エントリのみを示しています。傾きを計算します。-5レビューのプロンプトを表示します。

import HealthKit

func detectTrends(_ samples: [HKSample]?) {
    let quantitySamples = samples as? [HKQuantitySample] ?? []
    let slope = bestFitSlope(for: quantitySamples)

    if slope < -5 {
        promptCheckupForNotification()
    }
}

キーポイント:

  • samples as? [HKQuantitySample]: HealthKit サンプルを定量的サンプルの配列に変換します。
  • bestFitSlope(for:): カスタム関数を適用して、6 週間のサンプルに最適な傾きを計算します。
  • slope < -5: 発話の閾値に相当し、週平均で 5 ポイントを超える低下を示します。
  • promptCheckupForNotification(): 通知シーンでフォローアップ コンサルテーション プロンプトを再利用します。

7. ユーザーが引き続き Walking Steadiness サンプルを生成できるようにする

(16:21) アプリケーションが安定性を監視できるかどうかは、HealthKit にサンプルがあるかどうかによって決まります。 Apple は 4 つの実践的な提案をしています。まず、ユーザーはヘルスケア アプリで身長を設定する必要があります。体重と年齢も推奨されます。次に、ユーザーは Apple Walking Steadiness 通知をオンにするように求められます。第三に、ユーザーは、ズボンのポケット、ジャケットのポケット、または体に近いバッグのいずれに入れても、歩くときは iPhone を持ち歩くように注意されます。 4 番目に、歩行速度のサンプルを使用して、ユーザーがデバイスを十分に安定して運んでいるかどうかを判断します。 2 週間連続して歩行速度のサンプルがあることは、良い兆候です。

import HealthKit

let healthStore = HKHealthStore()
let walkingSpeedType = HKObjectType.quantityType(forIdentifier: .walkingSpeed)!
let end = Date()
let start = Calendar.current.date(byAdding: .weekOfYear, value: -2, to: end)
let predicate = HKQuery.predicateForSamples(withStart: start, end: end, options: [])

let query = HKSampleQuery(sampleType: walkingSpeedType,
                          predicate: predicate,
                          limit: HKObjectQueryNoLimit,
                          sortDescriptors: nil) { query, samples, error in

    if let error = error {
        print(error.localizedDescription)
        return
    }

    if samples?.isEmpty == true {
        promptUserToCarryPhoneWhileWalking()
    }
}

healthStore.execute(query)

キーポイント:

  • .walkingSpeed:講演では、ユーザーがiPhoneを持ち歩くための条件を満たしているかどうかを判断するために、歩行速度のサンプルを使用することが提案されました。
  • startそしてend: 過去 2 週間をクエリします。
  • predicateForSamples: クエリウィンドウを制限します。
  • HKObjectQueryNoLimit: 2 週間以内にすべての Walking Speed サンプルを読みます。
  • samples?.isEmpty == true: サンプルがない場合は、ユーザーが要求どおりに iPhone を持参していない可能性があります。
  • promptUserToCarryPhoneWhileWalking(): 歩行時に携帯電話を持ち歩くようにユーザーに促します。

重要ポイント

  1. やるべきこと: 術後患者向けに 6 分間のウォーキング回復ボードを作成します。 実行する価値がある理由: API を再調整すると、術後の推定値に急性の変化をより迅速に反映できるようになり、術前データの希薄化や術後の低下を回避できます。 開始方法: リクエストsixMinuteWalkTestDistance読み取りおよび書き込み権限、手術日を取得した後に電話するHKHealthStore.recalibrateEstimates(sampleType:date:)、その後のサンプルを読み取って回復曲線を描きます。

  2. やるべきこと: 理学療法クリニック向けに転倒リスクのリマインダーを作成します。 実行する価値がある理由: 歩行安定性では、OK、低、および非常に低の分類が行われており、看護チームに階層的なビューを与えるのに適しています。 開始方法: 読む.walkingSteadiness最新のサンプルを使用してくださいHKAppleWalkingSteadinessClassification(for:)分類を変換し、低レベルおよび超低レベルの患者をフォローアップ キューに入れます。

  3. やるべきこと: 遠隔リハビリテーション アプリに下降傾向の警告を追加します。 実行する価値がある理由: システム イベントは高リスクのカテゴリーをカバーしていますが、スコアの低下により、トレーニングが適切でない、ユーザーが継続力を発揮していない、または怪我の状態が変化していることが早期に判明する可能性があります。 開始方法: 過去 6 週間にわたって毎週クエリを実行します.walkingSteadinessサンプリングして傾向の傾きを計算し、しきい値より低い場合はオンライン レビューを促します。

  4. やるべきこと: 家族介護現場での高齢者の歩行の質に関する週報を作成します。 実行する価値がある理由: Walking Steadiness は週に 1 回スコアを生成します。これは、低頻度の要約で変化を表示し、健康データを毎日確認する負担を軽減するのに適しています。 開始方法: ユーザー認証後、最近の週のスコアを読み取り、分類の変更を表示し、.appleWalkingSteadinessEventこのメッセージが表示されると、ユーザーは家族に積極的に連絡するよう求められます。

  5. やるべきこと: フィットネス アプリまたはハイキング アプリにトレイルの難易度を推奨します。 価値がある理由: プレゼンテーションでは、安定性を利用して、個人の転倒リスクに合わせたワークアウトやハイキングを推奨できると述べました。 開始方法: トレーニングを開始する前に、歩行安定性の分類を読み、低レベルまたは非常に低レベルのユーザーを穏やかなルートまたは低衝撃のトレーニングに誘導し、高リスクの指示を入れます。

関連セッション

コメント

GitHub Issues · utterances