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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

2回答

2171閲覧

HealthKitで取得した歩数を表示する

an.fu

総合スコア5

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/01/22 07:43

初めまして。現在、万歩計のiOSアプリを作っています。
HealthKitで歩数を取得するコードを書き、エラーは出ていないのですが、コンソールに歩数が表示されません。

また、取得した歩数をLabelに表示させたいのですが、やり方がよくわかりません。
ぜひご回答お願いします。

import UIKit import HealthKit class HealthViewController: UIViewController { let saveData: UserDefaults = UserDefaults.standard @IBOutlet var startButton: UIButton! @IBOutlet var todayLabel: UILabel! @IBOutlet var monthLabel: UILabel! var numberArray: [Int] = [] @IBOutlet var hour2Label: UILabel! @IBOutlet var hour1Label: UILabel! @IBOutlet var minuts2Label: UILabel! @IBOutlet var minuts1Label: UILabel! @IBOutlet var second2Label: UILabel! @IBOutlet var second1Label: UILabel! override func viewDidLoad() { super.viewDidLoad() let saveState = saveData.object(forKey: "walkStart") if saveState != nil { startButton.setTitle("walkStop", for: .normal) } if let array = saveData.array(forKey: "steps") { numberArray = array as! [Int] } let timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(time), userInfo: nil, repeats: true) timer.fire() } @objc func time(){ let date: Date = Date() let calender: Calendar = Calendar(identifier: .gregorian) let components: DateComponents = calender.dateComponents([.hour, .minute, .second], from: date) let hour:Int = components.hour! let minute:Int = components.minute! let second:Int = components.second! hour2Label.text = String(hour / 10) hour1Label.text = String(hour % 10) minuts2Label.text = String(minute / 10) minuts1Label.text = String(minute % 10) second2Label.text = String(second / 10) second1Label.text = String(second % 10) } @IBAction func walkStart() { self.todayLabel.text = "歩数が表示されます" if startButton.titleLabel?.text == "start" { saveData.set(Date(), forKey: "walkStart") startButton.setTitle("walkStop", for: .normal) } else { _ = saveData.object(forKey: "walkStart") as! Date print("startTime") _ = Date() startButton.setTitle("start", for: .normal) saveData.removeObject(forKey: "walkStart") } } func loadWalkCount() { let start = Calendar.current.date(byAdding: .month, value: -1, to: Date()) let end = Date() let store = HKHealthStore() let types: Set<HKSampleType> = [ HKSampleType.quantityType(forIdentifier: .stepCount)! ] store.requestAuthorization(toShare: types, read: types) { success, error in if success { print("認証成功") } } let predicate = HKQuery.predicateForSamples(withStart: start, end: end) if let type = types.first { _ = HKStatisticsQuery(quantityType: type as! HKQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (query, statistics, error) in if let walkCount = statistics?.sumQuantity()?.description { print("歩数は" + walkCount + "歩") } else { print("読み込めませんでした") } DispatchQueue.main.async { if let walkCount = statistics?.sumQuantity()?.description { let count = walkCount.replacingOccurrences(of: " count", with: "") self.numberArray.append(Int(count)!) self.monthLabel.text = self.culiculate(walkCount: Int(count)!) self.saveData.set(self.numberArray, forKey: "steps") self.todayLabel.text = count } else { print("--1--") self.todayLabel.text = "読み込めませんでした" } } store.execute(query) } } } // @IBAction func walkStart() { // self.todayLabel.text = "歩数が表示されます" // // if startButton.titleLabel?.text == "start" { // saveData.set(Date(), forKey: "walkStart") // startButton.setTitle("walkStop", for: .normal) // } else { // let startTime = saveData.object(forKey: "walkStart") as! Date // print("startTime") // let currentTime = Date() // startButton.setTitle("start", for: .normal) // saveData.removeObject(forKey: "walkStart") // } // } func culiculate(walkCount: Int) -> String { let steps = Int(walkCount) if steps >= 1000 { return String(steps) } else { return String(steps) } } }

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

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

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

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

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

guest

回答2

0

回答がすでにでているので、単なる余談ですが、もう少しマニュアルをご覧になるとよろしいかと思います。

https://developer.apple.com/documentation/healthkit/hkstatisticsquery

You create a sample query by calling the init(quantityType:quantitySamplePredicate:options:completionHandler:) initializer. After the query is instantiated, you run it by calling the HealthKit store’s execute(_:) method.

executeをしないと実行されません。

さらに余談ですが、

swift

1 2store.requestAuthorization(toShare: types, read: types) { success, error in 3 if success { 4 print("認証成功") 5 } 6 } 7let predicate = HKQuery.predicateForSamples(withStart: start, end: end) 8if let type = types.first { 9。。。

このままだと、ユーザーが許可をしなくても、以降の処理を進めてしまいます。
例えば、アプリの初回起動だけ失敗し、2回目からはうまくいくといった現象が起こると思われます。

投稿2020/01/22 09:27

t_obara

総合スコア5488

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

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

0

ベストアンサー

store.execute(query)の記述位置が誤っています。

Swift

1let statisticsQuery = HKStatisticsQuery(...) { (query, statistics, error) in 2 //ココは、execute実行後に、実行結果の通知として呼ばれます。 3 ... 4 //× store.execute(query) 5} 6store.execute(statisticsQuery)

投稿2020/01/22 08:26

dsuzuki

総合スコア1682

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

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

an.fu

2020/01/23 02:18

ありがとうございます。これで取得した一ヶ月間の歩数をストーリーボード上にあるlabelに表示させたいのですが、どうしたら良いのでしょうか? startTimeとしかコンソールに表示されません…
dsuzuki

2020/01/23 03:30

そのまえに、実行結果としてprint("歩数は" + walkCount + "歩")は表示されて(データは取得できて)いますか。 また、t_obaraさんの指摘(認証について)は確認されていますか。 どこまで処理が進んでいて、何が出来ていないのか、整理した方が良いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問