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

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

ただいまの
回答率

88.37%

HealthKitを使用したアプリの作成について

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 825

.koji

score 12

前提・実現したいこと

HealthKit HKStatisticsCollectionQuery を使って
collectionViewCellに歩数を毎日分表示したい

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

一通りHealthKitの設定をし
cellに現在の日にちまでのデータを取得したいのですがなかなかうまくいかず困ってます

エラーメッセージ

該当のソースコード

import UIKit
import HealthKit

class ViewController: UIViewController {


     let myHealthKitStore = HKHealthStore()

    @IBAction func ninsyou(_ sender: Any) {
        requestAuthorization()

    }


    @IBOutlet weak var collectionView: UICollectionView!


   struct HealthData {
        var date: Date
        var step: Int
        var distance: Int
        init(_ date: Date, _ step: Int, _ distance: Int) {
            self.date = date
            self.step = step
            self.distance = distance
        }
    }

    func requestAuthorization() {
        /*(toShare typesToShare: Set<HKSampleType>?,
                              read typesToRead: Set<HKObjectType>?,
                              completion: @escaping (Bool, Error?) -> Void)*/
        // 読み込みを許可する型. 誕生日と性別・血液型を読み込み、体重と体温を書き込めるようにしたい認証
        let typeOfRead = Set(arrayLiteral:
            // HKObjectType.characteristicType(forIdentifier: HKCharacteristicTypeIdentifier.dateOfBirth)!,//誕生日
            // HKObjectType.characteristicType(forIdentifier: HKCharacteristicTypeIdentifier.biologicalSex)!,//性別
            // HKObjectType.characteristicType(forIdentifier: HKCharacteristicTypeIdentifier.bloodType)!,//血液型
            HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!,//歩数
            HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)!//歩行または走行距離
        )

        // 書き込みを許可する型.
        let typeOfWrite = Set(arrayLiteral:
            // HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bodyMass)!,//体重
            // HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bodyTemperature)!,//体温
            HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!,//歩数
            HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)!//歩行または走行距離
        )



        // HealthStoreへのアクセス承認をおこなう.
        myHealthKitStore.requestAuthorization(toShare: typeOfWrite, read: typeOfRead, completion: { (success, error) in
            if let e = error {
                print("Error: \(e.localizedDescription)")
                return
            }
            print(success ? "success" : " Failure!")

        })
    }

    var dataSource: [HealthData] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        //cellのxibの読み込み
        collectionView.dataSource = self
        let nib = UINib(nibName: "CollectionViewCell", bundle: nil)
        self.collectionView.register(nib, forCellWithReuseIdentifier: "cell")

    }


    func requestStatisticsCollection(){
      let calender = Calendar.current
        let day = -7
        let now = NSDate()
        let today = calender.startOfDay(for: now as Date)
        let endDate = now
        let startDate = calender.date(byAdding: Calendar.Component.day, value: day, to: today)
        let anchorDate = today
        var interval = DateComponents()
        interval.hour = 1

        let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate as Date, options: [])
        let quantityType = HKSampleType.quantityType(forIdentifier: .stepCount)!
        let statsOptions: HKStatisticsOptions = [HKStatisticsOptions.separateBySource,HKStatisticsOptions.cumulativeSum]
        let query = HKStatisticsCollectionQuery(quantityType: quantityType, quantitySamplePredicate: predicate, options: statsOptions, anchorDate: anchorDate, intervalComponents: interval )

        print("\(String(describing: startDate))) - \(endDate)")
        print("anchorDate: \(anchorDate)")

        query.initialResultsHandler = { (query, results, error) in
            if let result = results {
            DispatchQueue.main.async {
                self.dataSource = []
                for item in result.statistics() {
                    let data = HealthData(item.startDate, Int(item.sumQuantity()!.doubleValue(for: HKUnit.count())), 0)

                    print("\(item.startDate) - \(item.endDate) \(item.sumQuantity()!.doubleValue(for: HKUnit.count()))")
                    self.dataSource.append(data)

                }
                self.collectionView.reloadData()
            }
        }
        self.myHealthKitStore.execute(query)
    }
    }
}







// cellの設定
 extension ViewController: UICollectionViewDataSource {

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
       return self.dataSource.count


    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let data = self.dataSource[indexPath.row]
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell
        let formatter: DateFormatter = DateFormatter()
            formatter.locale = NSLocale(localeIdentifier: NSLocale.Key.languageCode.rawValue) as Locale?
            formatter.dateStyle = .full
            formatter.doesRelativeDateFormatting = true
            formatter.locale = Locale(identifier: "ja_JP")
           cell.label.text = formatter.string(from: data.date )
           cell.hosuu.text = "\(data.step)"
         //  cell.kyori.text = "\(String(describing: Data.distance))"
        return cell
    }

}

試したこと

データの橋渡しがうまくいっていないのか
cellの自動生成までビルドできません

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

どなたかお力をいただければと思います

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • hameji

    2019/08/25 22:02

    コードは<code>というボタンを押して、
    その上下を```で囲むようにしてください。

    あと、まずは、dummyDataを用い、collectionViewへの表示がきちんとできるか、
    それができれば、HealthKitでデータを取得するの2つに切り分けた方がいいと思います。

    キャンセル

  • .koji

    2019/08/25 23:47

    回答ありがとうございます!
    もう一度切り分けてやってみます。
    ありがとうございます。

    キャンセル

まだ回答がついていません

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

  • ただいまの回答率 88.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る