はじめに
タイトルの通りApple Watch アプリケーション開発を進めていきます。
今回はHealth Kitにアクセスして心拍の取得を行えるアプリケーションを作っていきます。
また、Xcode11から本格導入された、Swift UIを使って簡単なUIを作っていきます。
開発環境
- OSX Catalonia 10.15.2
- Xcode Version 11.3
目次
- プロジェクトの作成
- SwiftUIでUIを作成
- HealthKitで心拍を取得
プロジェクトの作成
新規プロジェクトを作成していきます。
インストール
App StoreよりXcode11をインストールしてください。
プロジェクトの作成
Xcodeを開いて、「File > New > Project…. 」とすると、以下のような画面が表示されると思います。
WatchOSのタブから “iOS App With Watch App”を選択し Nextボタンをクリックしてください。
次にプロジェクトの詳細を決めていきます。
Product Nameは、”HelloHealthWathApp”と入力。
User Interfaceは、”SwiftUI”に選択します。
その他のチェックボックスはデフォルトのままでOKです。
Nextを押すと、保存するフォルダの選択画面が表示されますので、任意のフォルダを選んでください。
※「Create Git~~~」のチェックボックスは、外しています。
無事にXcodeのプロジェクトが作成されると、画面左手に以下のようなフォルダ構造が確認できると思います。
プロジェクト名そのものがついた「HelloHealthWatchApp」フォルダには、
iOS関連のファイルがまとめれられています。
「~~~Tests」「~~~UITests」フォルダには、
テスト用のコードを書くためのファイルがまとめられています。
「~~~WatchKit App」と「~~~WatchKit Extension」には、
Watch OS開発のためのファイルがまとめれられているようです。
今回は、WatchOS用アプリケーションの開発がしたいので、こちらのフォルダの中に記述していきます。
いくつかのフォルダが入っています。
大きく分けて、各種Swiftファイル、StoryBoadファイル、info.plistが確認できます。
info.plistは、許可関連の項目を管理するファイルです。
「HelloHealthWatchApp WatchKit Extension/ContentView.swift」というSwiftファイルをみてください。
ソースを見ると、9行目にimport SwiftUIの記述があり、13行目にText(“Hello, World!”)とあります。
特にいじらず、右上にある「resume」ボタンをクリックして、プレビューを表示します。
Text関数の中に書かれた文字列が画面に表示されていると思います。
※デフォルトで右側にcanvas画面がない場合は、「Adjust Editor Options > Canvas」から追加するか、キーボードの「Opetion + CMD + Enter」で開くことができます。
SwiftUIでUIを作成
プロジェクトの作成が完了したところで、SwiftUIでUIを作っていきます。
とはいえ、今回はボタンを押したら心拍を取得して表示するという簡単なもののみの実装となります。
そのほかのSwift UIの基本的な記述方法に関しては、公式のチュートリアルが参考になります。
- WWDC2019のプレゼンテーション
WWDC2019 Introducing Swift UI - 公式チュートリアル
SwiftUI Tutorials
Swift UIのコーディング
「ContentView.swift」をみてください。タッチでメッセージが変わるコードをSwiftUIで書いてみました。
「STANBAY」がタップすると「OK」に変わるというシンプルなものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
import SwiftUI struct ContentView: View { @State private var msg = "STANBY" var body: some View { Text(msg) .onTapGesture{ self.msg = "OK" } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } |
コードを記述したら、
Apple Watchのプレビュー画面からLiveモードに切り替えるボタンをクリックして動作を確認してみてください。
「.onTapGesture{} 」を使うことで、波括弧の中の処理をタッチジェスチャが検出された時に実行してくれる。
このような処理の記述をモディファイアーと呼ぶようです。
HealthKitで心拍を取得
次に、HealthKitを使って心拍数を取得してみます。
HealthKitは、身体情報や医療データ・ワークアウトなどの情報を管理してくれるフレームワークで、日々Apple Watchから計測される心拍データやワークアウトの情報なども蓄積されていきます。
HealthKitからデータを取得するためには、
大きく「アクセス許可」と「データ読み出し」の2つのステップに分けられます。
アクセス許可とデータ読み出しの部分を関数に分けして記述してみました。
ContentView.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
import SwiftUI import HealthKit struct ContentView: View { @State private var msg = "STANBY" @State private var msg_max = "MaxValue" @State private var msg_min = "MinValue" let myHealthStore = HKHealthStore() // Healthデータへのアクセスを申請. private func requestAuthorization(){ let types = Set(arrayLiteral: HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)! ) // HealthStoreへのアクセス承認をおこなう. myHealthStore.requestAuthorization(toShare: types, read: types, completion: { (success, error) in if let e = error { print("Error: \(e.localizedDescription)") } print(success ? "Success" : "Failure") }) } // Healthデータの取得 private func readHeartRateData() { let typeOfHeartRate = HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate) let calendar = Calendar.init(identifier: Calendar.Identifier.gregorian) let now = Date() let startDate = calendar.startOfDay(for: now) let endDate = calendar.date(byAdding: Calendar.Component.day, value: 1, to: startDate) let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: []) let statsOptions: HKStatisticsOptions = [HKStatisticsOptions.discreteMax, HKStatisticsOptions.discreteMin] let staticsQuery = HKStatisticsQuery(quantityType: typeOfHeartRate!, quantitySamplePredicate: predicate, options: statsOptions) { (query, result, error) in if let e = error { print("Error:\(e.localizedDescription)") return } guard let max = result?.maximumQuantity() else { print("max is not found") return } guard let mim = result?.minimumQuantity() else { print("mini is not found") return } DispatchQueue.main.async { // 最大値のデータを取得. self.msg_max = "Max: \(max)" // 最小値のデータを取得. self.msg_min = "Min: \(mim)" } } self.myHealthStore.execute(staticsQuery) } var body: some View { VStack{ Text("許可?") .onTapGesture { self.requestAuthorization() } Text(msg) .onTapGesture { self.msg = "OK" self.readHeartRateData() } Text(msg_max) Text(msg_min) } } } struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } } |
まず「import HealthKit」でHealthKitをインポートします。
ヘルスデータは「HKHealthSore」が持っているので、こちらを使っていきます。
「.requestAuthorization()」というメソッドでアクセス権を申請しています。
次に「HKStatisticsQuery()」でデータを取得できます。
取得できたデータの最大・最小値をSwiftUIのText関数で画面上に表示しています。
続いて、ユーザーにヘルスケアを使って良いかの確認を求めるプロジェクトの設定をしていく必要があります。
データアクセス許可の設定
ヘルスケアデータへのアクセス許可の設定に関して、「Info.plist」への追記と「Capability」への追加が必要です。
「Info.plist」を開いていただいて以下の項目を追加します。
「Privacy – Health Records Usage ~~~」「Privacy – Health Share Usage ~~~ 」「Privacy – Health Update Usage ~~~」
右側の項目に「ヘルスケアの情報を使います」っと入れておきました。

「Signning & Capabilities」の「+Capability」をクリックしてHealthKitを追加します。
※青くなっているALLの左隣の項目をクリック
Health Kitが追加されるとSigningの下の項目にHealth Kitが表示されます。
以上でコーディングとセッティングは終わりになります。
ビルド
ビルドターゲットをApple Watch Kit App に、任意のApple Watchのシミュレーターを選択してビルドします。

ビルドが完了したら、「許可」をタップ!!
シミュレーター上でHealth Kitのアクセス許可を求める操作が表示されますので、ひたすら許可を出し続けます。

Health Kitへの許可操作が完了したら、「STANBY」と表示されているテキストをクリックすると処理が実行され、
表示が「OK」に変わると、心拍数の最大値と最小値が表示されます。
シミュレーター上ではヘルスケアに過去データが蓄積されていないので、「0 Count /s」と表示されてしまいますが、
ひとまず、これで完成とします!!
※アクセス権限でエラーになる場合は、「TARGTS」の項目が正しくWatch Appが選択されているかご確認ください。
まとめ
以上で、Apple Watch Appで心拍データを取得する(With Swift UI)は終了です。
お疲れさまでした。
ほんのちょっとしか触りませんでしたが、Swift UIはUIデザイン思想そのものを一新したフレームワークになっているのは伺えました。
また、スタンドアローンのApple Watchアプリケーションも開発できるようになったみたいなので、
アイディア次第でおもしろいアプリ開発が作れそうですね。
参考