🩺

【iOS18】メンタルヘルスを管理する

2024/06/19に公開

メンタルヘルスの新しいHealthKitAPI

メンタルヘルスをサポートするため、HealthKitに追加された新しいAPIが追加されました。自分の気分を振り返り、心の状態を記録して精神の健康状態を追跡できます。また、AppleWatchからも記録できるため、1日のどの時点でも簡単にチェックできます。

追加された評価シート

精神状態を詳しく評価するために、Healthアプリで不安やうつ病に関する標準化されたアンケートに回答することができます。GAD-7およびPHQ-9は質問票であり、世界中の医療従事者がメンタルヘルスのスクリーニングに使用しています。GAD-7(不安症)とPHQ-9(うつ病)に関する評価結果の読み書きが可能になりました。

State of Mind API

State of Mindは、個人の気分や感情を表現する方法です。感情は短期間の感情ですが、気分は長期的な感情です。自分の感情状態を特定することには、多くのメリットがあります。

State of Mindのパラメータ

State of Mindには4つのパラメータがあります。

  • Kind(心の状態)
  • Valence(感情を示す値)
  • Labels(心の状態を表現するラベル)
  • Associations(心の状態に関連する事柄)

これらを使用して、誰かの精神状態を表すことができます。

プロパティ名 説明
kind HKStateOfMind.Kind 心の状態の種類
valence Double 感情を示す値
labels [HKStateOfMind.Label] 心の状態を表現するラベル
associations [HKStateOfMind.Association] 心の状態に関連する事柄

Kind:心の状態の種類

ケース名 説明
dailyMood 日々の気分を示す
momentaryEmotion 一時的な感情を示す

Valence:感情を示す値

Labels:感情を表現する

ケース名 説明
amazed 驚いた
amused 面白がった
angry 怒った
annoyed イライラした
anxious 不安
ashamed 恥じる
brave 勇敢
calm 落ち着いた
confident 自信がある
content 満足
disappointed 失望した
discouraged 落胆した
disgusted 嫌悪した
drained 疲れ果てた
embarrassed 恥ずかしい
excited 興奮した
frustrated 不満を感じた
grateful 感謝している
guilty 罪悪感を感じた
happy 幸せ
hopeful 希望に満ちた
hopeless 絶望的
indifferent 無関心
irritated イライラした
jealous 嫉妬した
joyful 喜び
lonely 孤独
overwhelmed 圧倒された
passionate 情熱的
peaceful 平和
proud 誇りに思う
relieved 安堵した
sad 悲しい
satisfied 満足した
scared 怖い
stressed ストレスを感じた
surprised 驚いた
worried 心配した

Associations:心の状態に関連する事柄

ケース名 説明
community コミュニティ
currentEvents 現在の出来事
dating デート
education 教育
family 家族
fitness フィットネス
friends 友人
health 健康
hobbies 趣味
identity アイデンティティ
money お金
partner パートナー
selfCare セルフケア
spirituality スピリチュアリティ
tasks タスク
travel 旅行
weather 天気
work 仕事

HKStateOfMindサンプルの保存方法(実装例)

新しいAPIを使用して、絵文字を使用して気分を記録し、それをHealthKitに保存できます。まずは記録したい感情を定義します。呼び出しやすいように絵文字をプロパティで定義します。

enum EmojiType: CaseIterable {
    case angry
    case sad
    case indifferent
    case satisfied
    case happy
    
    var emoji: String {
        switch self {
        case .angry: return "😡"
        case .sad: return "😢"
        case .indifferent: return "😐"
        case .satisfied: return "😌"
        case .happy: return "😊"
        }
    }
}

サンプルを作成するためのメソッドを作成します。感情を記録するためには、HKStateOfMindサンプルを作成します。

/// イベントと絵文字の選択に基づいたState of Mindサンプルを作成
func createSample(for event: EventModel, emojiType: EmojiType) ->
HKStateOfMind {
    let kind: HKStateOfMind.Kind = .momentaryEmotion
    let valence: Double = emojiType.valence
    let label = emojiType.label
    let association = event.association
    return HKStateOfMind(date: event.endDate,
                         kind: kind,
                         valence: valence,
                         labels: [label],
                         associations: [association])
}

HKStateOfMindサンプルをHealthKitStoreに保存します。

// 絵文字の選択からState of Mindサンプルを保存
func save(sample: HKSample, healthStore: HKHealthStore) async {
    do {
        try await healthStore.save(sample)
    } catch {
        // エラー処理をここに記述
    }
}

新しい条件検索

HealthKitでサンプルを検索するための4つの新しい条件指定(Predicate)を導入します。KindValenceLabelsAssociationsを指定してクエリを実行できます。これにより、必要な情報を簡単に取得できます。

Predicateのメソッド紹介

Kind

Valence

Labels

Associations

HKStateOfMindサンプルの呼び出し(実装例)

StateofMindサンプルを呼び出す実装例です。

// 日付の条件指定を行うためのNSPredicateを定義
let datePredicate: NSPredicate = { ... }

// associationsの各要素に対して、対応するHKQueryの状態を取得するためのpredicateを作成
let associationsPredicate = NSCompoundPredicate(
    orPredicateWithSubpredicates: associations.map {
        // HKQueryの状態を取得するためのpredicateを作成
        HKQuery.predicateForStatesOfMind(with: $0)
    }
)

// 複合条件のpredicateを作成
let compoundPredicate = NSCompoundPredicate(
    andPredicateWithSubpredicates: [datePredicate, associationsPredicate]
)

// 条件指定を行うためのpredicateを作成
let stateOfMindPredicate = HKSamplePredicate.stateOfMind(compoundPredicate)

// サンプルクエリを実行するためのdescriptorを定義
let descriptor = HKSampleQueryDescriptor(predicates: [stateOfMindPredicate],
                                         sortDescriptors: [])

// クエリの結果を格納する配列を定義
var results: [HKStateOfMind] = []

do {
    // クエリを実行して結果を非同期で待つ
    results = try await descriptor.result(for: healthStore)
} catch {
    // クエリ実行中にエラーが発生した場合の処理をここに記述
    print("エラーが発生しました: \(error)")
}

特定のラベルを持つStateofMindサンプルを取得するには、以下の実装が参考になります。

// 指定するラベルを定義
let label: HKStateOfMind.Label = .happy

// ラベル条件のpredicateを作成
let labelPredicate = HKQuery.predicateForStatesOfMind(with: label)

Valence(感情を示す値)の表現方法

Valenceの値は-11であるため、どのように表現するかはアプリによって変更する必要があります。

// 各valence値を0.0から2.0の範囲に調整
let adjustedValenceResults = results.map { $0.valence + 1.0 }
// 平均値を計算
let totalAdjustedValence = adjustedValenceResults.reduce(0.0, +)
let averageAdjustedValence = totalAdjustedValence / Double(results.count)
// パーセンテージに変換
let adjustedValenceAsPercent = Int(100.0 * (averageAdjustedValence / 2.0))

まとめ

新しいHealthKitAPIを活用することで、メンタルヘルスの管理ができるようになりました。個人の気分や感情を記録し、詳細な評価することで、精神状態を振り返ることができます。今後、メンタルヘルスの管理をiOSで行う場合は導入すべきと感じました。

最後に

間違い・気になる部分がありましたら、コメントいただけると大変うれしいです。
良かったと思ったら記事へのいいねXのフォローをよろしくお願いいたします。

https://sites.google.com/view/muranakar

個人でアプリを作成しています。良かったら覗いてみてください。

参考資料

https://developer.apple.com/documentation/healthkit/hkstateofmind

https://developer.apple.com/videos/play/wwdc2024/10109/

Discussion