Swift watchOS 簡単なアプリを作ってHealthKitに接続してみる

iOSとwatchOSとの連携を行ってwatchOSの概要をちょこっと調べたので、簡単なアプリを作成し、HealthKitに接続してみる。

1.画面構成

プロジェクトを作成すると、ストーリーボードに4画面表示されているのだが、ちょっと見た感じだと、メインアプリ、コンプリケーション、通知など、対応するソースコードの基底クラスを見るとアプリの形態ごとのイメージのよう。

今回は左上に表示されている、WKInterfaceController を継承したメインアプリに、Picker、ボタン、ラベル、テキストボックスを配置する

watchos_storyboard

2.ソース

Pickerで、体重を選択

ボタンで確定

ラベルに確定した体重を表示

テキストボックスに、HealthKitの状況を出力させる

import WatchKit
import Foundation
import HealthKit

class InterfaceController: WKInterfaceController {

    @IBOutlet weak var bodyMassPicker: WKInterfacePicker!
    var items:[WKPickerItem] = []
    @IBOutlet weak var selectedBodyMassLabel: WKInterfaceLabel!
    var selectedBodyMass:String?
    
    
    @IBOutlet weak var healthKitStatus: WKInterfaceTextField!
    
    var healthStore : HKHealthStore?
    
    override func awake(withContext context: Any?) {
        // Configure interface objects here.
        if HKHealthStore.isHealthDataAvailable() {
            self.healthStore = HKHealthStore()

            let allTypes = Set([
                HKQuantityType.quantityType(forIdentifier: .bodyMass)!
            ])

            self.healthStore?.requestAuthorization(toShare: allTypes, read: allTypes) { (success, error) in
                var result = ""
                if success {
                    result = "アクセス許可: \(String(describing: success))"
                } else {
                    result = "\(String(describing: error?.localizedDescription))"
                }
                DispatchQueue.main.async {
                    self.healthKitStatus.setText(result)
                }
            }
            
        } else {
            self.healthKitStatus.setText("ヘルスデータ利用不可")
        }
        
        self.items.removeAll()
        for num in stride(from: 60, through: 80, by: 0.1) {
            let item = WKPickerItem()
            item.title = "\(num)"
            items.append(item)
        }
        bodyMassPicker.setItems(items)
        bodyMassPicker.setSelectedItemIndex(100)
    }

    override func willActivate() {
        // This method is called when watch view controller is about to be visible to user
    }
    

    override func didDeactivate() {
        // This method is called when watch view controller is no longer visible
    }
    

    @IBAction func selectBodyMass() {
        selectedBodyMassLabel.setText(self.selectedBodyMass)
    }
    
    @IBAction func selectBodyMassPicker(_ value: Int) {
        self.selectedBodyMass = items[value].title
    }
}

3.トラブルシュート

とりあえず、実行したら結果のテキストボックスに、Missing com.apple.developer.healthkitentitlement. というエラー

healthkit_error

healthkit_error_detail

そういえば、iOSの時に、HealthKitの設定したときに色々設定したなと思って見直す。

Capabilities には、watchOSから設定できないようなので、

WatchKit Extension.entitlements に HealthKitを追加して、YESにする。

entitlement_add_healthkit

4.実行

ちゃんと、承認画面がApple Watchにも表示された。

権限を付与すると、

watchos_healthkit_ok

結果に、「アクセス許可:true」が想定通り表示された!OK

watchos_healthkit_ok2

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です