AppleWatchでHealthKitから環境音を取得する方法

この記事でわかること

  • AppleWatchアプリからHealthKitを活用し環境音データを取得する方法

背景

  • 家族からいびきがうるさいとクレームを受けた

  • いびき対策を試したが効果がなかった

  • AppleWatchを使って、いびきを軽減するアプリを作ることにした

  • 自身のいびきを検知する方法として環境音を取得する必要があった。

  • AppleWatchアプリからHealthKitを使って環境音を取得する記事が少なく手こずったので、まとめることにした。

やりたいこと

  • AppleWatch用のいびき改善アプリをSwiftUIにて開発する。

  • いびき改善アプリは、5分周期にHealthKitにアクセスし、現在の環境音のデータを取得する。

  • 取得した環境音のデータは画面に表示する。

サンプルソース

import WatchKit
import Foundation
import HealthKit

class InterfaceController: WKInterfaceController {

    let healthStore = HKHealthStore()
    let audioExposureType = HKObjectType.quantityType(forIdentifier: .environmentalAudioExposure)!
    let audioExposureUnit = HKUnit(from: "decibelAWeighted")

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
class Inter face Controller : WkInterface COntroller {


        // HealthKitへのアクセスをリクエスト
        healthStore.requestAuthorization(toShare: nil, read: [audioExposureType]) { (success, error) in
            if let error = error {
                print("Error requesting authorization for audio exposure: \(error.localizedDescription)")
            }
        }
        
        // 最新の環境音レベルの取得
        getLatestAudioExposure()
        
        // 5分ごとに最新の環境音レベルを取得
        Timer.scheduledTimer(withTimeInterval: 300, repeats: true) { _ in
            self.getLatestAudioExposure()
        }
    }
    
    // 最新の環境音レベルを取得するメソッド
    func getLatestAudioExposure() {
        let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
        let query = HKSampleQuery(sampleType: audioExposureType, predicate: nil, limit: 1, sortDescriptors: [sortDescriptor]) { (query, results, error) in
            if let error = error {
                print("Error fetching audio exposure: \(error.localizedDescription)")
                return
            }
            
            if let sample = results?.first as? HKQuantitySample {
                let value = sample.quantity.doubleValue(for: self.audioExposureUnit)
                print("Latest audio exposure: \(value) decibels")
            } else {
                print("No audio exposure data available")
            }
        }
        
        healthStore.execute(query)
    }
}

ソースの説明

  1. まずHKHealthStoreオブジェクトを作成し、その後、環境音レベルのHKObjectTypeとHKUnitオブジェクトを作成

  2. まずHKHealthStoreオブジェクトを作成し、その後、環境音レベルのHKObjectTypeとHKUnitオブジェクトを作成

  3. getLatestAudioExposureメソッドを使用して、最新の環境音レベルのサンプルを取得し、その値をログに出力

  4. Timer.scheduledTimerメソッドを使用して、5分ごとにgetLatestAudioExposureメソッドを実行

以上


いいなと思ったら応援しよう!