質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

1回答

291閲覧

swiftで取得した心拍をdocumentsに保存したい

Koudai1018

総合スコア10

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/01/15 09:21

前提・実現したいこと

取得した心拍数をローカルに保存したいのですがうまくいかないです。
書き込みは成功となりますが保存されません。
回答よろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージは特にありません。

該当のソースコード

swift

1// 2// InterfaceController.swift 3// HeartRateKit Extension 4// 5// 6// 7// 8 9import WatchKit 10import UIKit 11import Foundation 12import HealthKit 13import WatchConnectivity 14import AVFoundation 15import CoreMotion 16 17 18class InterfaceController2: WKInterfaceController { 19 20 21 @IBOutlet var label: WKInterfaceLabel! 22 23 24 //HealthKitで扱うデータを管理するクラス 25 let healthStore = HKHealthStore() 26 //取得したいデータの識別子、今回は心拍数 27 let heartRateType = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)! 28 //取得したデータの単位、今回はBPM 29 let heartRateUnit = HKUnit(from: "count/min") 30 31 //HealthStoreへのクエリ(問い合わせ) 32 var heartRateQuery: HKQuery? 33 34 var isFirst = true // 最初の処理かどうか 35 36 override func awake(withContext context: Any?) { 37 super.awake(withContext: context) 38 } 39 40 override func willActivate() { 41 42 super.willActivate() 43 44 45 // 最初の処理だったら実行して、フラグ用の変数はfalseに落とす 46 if isFirst { 47 isFirst = false 48 // 一度だけ実行したい処理 49 self.requestAuthorization() 50 } 51 52 53 /**HealthKitがデバイス上で利用できるか確認**/ 54 guard HKHealthStore.isHealthDataAvailable() else { 55 self.label.setText("利用できません") 56 return 57 } 58 59 60 61 62 63 } 64 override func didDeactivate() { 65 // This method is called when watch view controller is no longer visible 66 super.didDeactivate() 67 68 } 69 /**アクセス許可をユーザに求める**/ 70 private func requestAuthorization() { 71 72 // 読み込みを許可する型. 73 let dataTypes = Set([ 74 HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)! 75 ]) 76 77 // 書き込みを許可する型. 78 let write = Set([ 79 HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)! 80 ]) 81 82 healthStore.requestAuthorization(toShare: write, read: dataTypes, completion: { success, error in 83 if success { 84 self.label.setText("Success") 85 self.getHeartRate() 86 } else { 87 self.label.setText("not allowed") 88 } 89 }) 90 91 } 92 93 94 95 96 97 /**:healthStoreへのクエリ(問い合わせ)生成**/ 98 func createStreamingQuery() -> HKQuery{ 99 100 let predicate = HKQuery.predicateForSamples(withStart: NSDate() as Date, end: nil, options: []) 101 102 // HKAnchoredObjectQueryだと他のアプリケーションによる更新を検知することができる 103 104 let query = HKAnchoredObjectQuery(type: heartRateType, predicate: predicate, anchor: nil, limit: Int(HKObjectQueryNoLimit)) { (query, samples, deletedObjects, anchor, error) -> Void in 105 106 self.addSamples(samples: samples) 107 108 } 109 110 111 query.updateHandler = { (query, samples, deletedObjects, anchor, error) -> Void in 112 113 self.addSamples(samples: samples) 114 115 } 116 117 return query 118 119 } 120 121 122 123 /**取得したデータをLabelに表示**/ 124 func addSamples(samples: [HKSample]?){ 125 126 guard let samples = samples as? [HKQuantitySample] else { 127 128 return 129 130 } 131 132 guard let quantity = samples.last?.quantity else { 133 134 return 135 136 } 137 138 let hartrate = (quantity.doubleValue(for: heartRateUnit)) 139 140 label.setText("(hartrate)") 141 print("(getToday())","(hartrate)") 142 143 //writeData(heart: hartrate) 144 145 var count = 0 146 if(hartrate > 73){ 147 148 count += 1 149 if(count > 5){ 150 151 player.play() 152 count = 0 153 } 154 155 } 156 else { 157 player.stop() 158 159 } 160 161 162 let file_name = "data.text" 163 let text = "(hartrate)" 164 165 166 if let documentDirectoryFileURL = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last { 167 168 // 書き込むファイルのパス 169 let targetTextFilePath = documentDirectoryFileURL + "/" + file_name 170 171 do { 172 try text.write(toFile: targetTextFilePath, atomically: true, encoding: String.Encoding.utf8) 173 print("書き込み成功") 174 } catch let error as NSError { 175 print("failed to write: (error)") 176 } 177 } 178 179 } 180 181 182 183 /*現在の日時を取得する*/ 184 func getToday(format:String = "yyyy/MM/dd HH:mm:ss") -> String{ 185 let now = Date() 186 let formatter = DateFormatter() 187 formatter.dateFormat = format 188 return formatter.string(from: now as Date) 189 } 190 191 192 193 func getHeartRate(){ 194 // start 195 // クエリ生成 196 self.heartRateQuery = self.createStreamingQuery() 197 //クエリ実行 198 self.healthStore.execute(self.heartRateQuery!) 199 } 200 201 func stopHeartRate(){ 202 203 self.healthStore.stop(self.heartRateQuery!) 204 self.heartRateQuery = nil 205 } 206 207 208 209} 210 211

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/01/16 01:44

「保存されません。」というのは何をどうやって確認して、判断されたのでしょうか?
Koudai1018

2019/01/16 13:07

xcodeからwindows→device&simulatorでHeartRateの内容をダウンロードし、そこにあるdocumentsディレクトリに値を保存できていないので判断しました。
guest

回答1

0

回答ではないですが、解決に向けた調査の仕方を載せます。

おそらくprint("書き込み成功")のコードには到達しているのだと思われますが、
print(text)
print(targetTextFilePath)
も実行してみて、期待する内容になっているかを確認してください。

あと、関係無いかもしれませんが
NSSearchPathForDirectoriesInDomains(...).lastより.firstの方が一般的だった気がします。

投稿2019/01/16 01:43

takabosoft

総合スコア8356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問