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)
}
}
ソースの説明
まずHKHealthStoreオブジェクトを作成し、その後、環境音レベルのHKObjectTypeとHKUnitオブジェクトを作成
まずHKHealthStoreオブジェクトを作成し、その後、環境音レベルのHKObjectTypeとHKUnitオブジェクトを作成
getLatestAudioExposureメソッドを使用して、最新の環境音レベルのサンプルを取得し、その値をログに出力
Timer.scheduledTimerメソッドを使用して、5分ごとにgetLatestAudioExposureメソッドを実行
以上