HEALTH_KIT
Workout App explaining Activities
- Swimming
- Walking/Runnig
- FLightsClimed
- Steps
- Swimming
- Walking/Runnig
- FLightsClimed
- Steps
import UIKit import HealthKit class HealthKitManager: NSObject { class var sharedInstance: HealthKitManager{ struct Singleton { static let instance = HealthKitManager() } return Singleton.instance } let healthStore: HKHealthStore? = { if HKHealthStore.isHealthDataAvailable(){ return HKHealthStore() }else{ return nil } }() let stepsCount = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount) let stepsUnit = HKUnit.count() let distanceWalkingRunning = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning) let distanceSwimming = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceSwimming) let distanceUnit = HKUnit.mile() let flightsClimbed = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.flightsClimbed) let flightClimbedUnit = HKUnit.count() }
import UIKit import HealthKit class DetailViewController: UIViewController { let healthKitManager = HealthKitManager.sharedInstance var workoutType: WorkoutTypes = .RunningWalking var steps = [HKQuantitySample]() var floors = [HKQuantitySample]() var distance: String! @IBOutlet weak var tableView: UITableView! let dateFormatter: DateFormatter = { let formatter = DateFormatter() formatter.dateStyle = .short return formatter }() override func viewDidLoad() { super.viewDidLoad() self.title = self.workoutType.rawValue requestForHealthKitAuthorization() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func requestForHealthKitAuthorization(){ let quantityObject = setHealthKitUnitType() let dataTypesToRead = NSSet(object:quantityObject!) as? Set<HKObjectType> healthKitManager.healthStore?.requestAuthorization(toShare: nil, read: dataTypesToRead, completion: { [unowned self] (success, error) in if success{ self.getHealthKitValues() }else{ print(error.debugDescription) } }) } func setHealthKitUnitType() -> Any?{ switch self.workoutType { case .Steps: return healthKitManager.stepsCount case .RunningWalking: return healthKitManager.distanceWalkingRunning case .FlightsClimbed: return healthKitManager.flightsClimbed case .Swimming: return healthKitManager.distanceSwimming } } func getHealthKitValues(){ switch self.workoutType { case .Steps: self.queryTodaysStepsSum() self.querySteps() break case .RunningWalking: self.readDistanceWalkingRunningData() case .FlightsClimbed: self.totalFlightsClimbed() self.readFloors() break case .Swimming: self.readSwimmingData() break } } } extension DetailViewController:UITableViewDataSource,UITableViewDelegate{ func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { switch self.workoutType { case .Steps: return self.steps.count case .FlightsClimbed: return self.floors.count case .RunningWalking ,.Swimming: return 1 } } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "stepsCellId")! as UITableViewCell switch self.workoutType { case .Steps: let step = steps[indexPath.row] let numberOfSteps = Int(step.quantity.doubleValue(for: healthKitManager.stepsUnit)) cell.textLabel?.text = "\(numberOfSteps) steps" cell.detailTextLabel?.text = dateFormatter.string(from: step.startDate) break case .FlightsClimbed: let step = floors[indexPath.row] let numberOfSteps = Int(step.quantity.doubleValue(for: healthKitManager.flightClimbedUnit)) cell.textLabel?.text = "\(numberOfSteps) floors" cell.detailTextLabel?.text = dateFormatter.string(from: step.startDate) break case .RunningWalking ,.Swimming: cell.textLabel?.text = distance cell.detailTextLabel?.text = "" break } return cell } }
func queryTodaysStepsSum(){ let now = Date() let startOfDay = Calendar.current.startOfDay(for: now) let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate) let sumOption = HKStatisticsOptions.cumulativeSum let statisticsSumQuery = HKStatisticsQuery(quantityType: healthKitManager.stepsCount!, quantitySamplePredicate: predicate, options: sumOption) { (query, result, error) in if let sumQuantity = result?.sumQuantity(){ DispatchQueue.main.async { let headerView = self.tableView.dequeueReusableCell(withIdentifier: "totalStepsCell")! as UITableViewCell let numberOfSteps = Int(sumQuantity.doubleValue(for: self.healthKitManager.stepsUnit)) headerView.textLabel?.text = " \(numberOfSteps) STEPS" self.tableView.tableHeaderView = headerView } } } healthKitManager.healthStore?.execute(statisticsSumQuery) } func querySteps(){ let now = Date() let startOfDay = Calendar.current.startOfDay(for: now) let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate) let sampleQuery = HKSampleQuery(sampleType: healthKitManager.stepsCount!, predicate: predicate, limit: 20, sortDescriptors: nil) { [weak self](query,results, error) in if let results = results as? [HKQuantitySample]{ self?.steps = results DispatchQueue.main.async { self?.tableView.reloadData() } } } healthKitManager.healthStore?.execute(sampleQuery) }
func readDistanceWalkingRunningData() { var walkingAVG = 0.0; let now = Date() let startOfDay = Calendar.current.startOfDay(for: now) let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate) let sampleQuery = HKSampleQuery(sampleType: healthKitManager.distanceWalkingRunning!, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { [weak self](query,results, error) in if let results = results as? [HKQuantitySample]{ for samples in results{ walkingAVG += samples.quantity.doubleValue(for: (self?.healthKitManager.distanceUnit)!) } DispatchQueue.main.async { self?.distance = String(format:"%f miles",walkingAVG) self?.tableView.reloadData() } } } healthKitManager.healthStore?.execute(sampleQuery) }
func readSwimmingData() { var walkingAVG = 0.0; let now = Date() let startOfDay = Calendar.current.startOfDay(for: now) let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate) let sampleQuery = HKSampleQuery(sampleType: healthKitManager.distanceSwimming!, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: nil) { [weak self](query,results, error) in if let results = results as? [HKQuantitySample]{ for samples in results{ walkingAVG += samples.quantity.doubleValue(for: (self?.healthKitManager.distanceUnit)!) } DispatchQueue.main.async { self?.distance = String(format:"%f miles",walkingAVG) self?.tableView.reloadData() } } } healthKitManager.healthStore?.execute(sampleQuery) }
func totalFlightsClimbed() { let now = Date() let startOfDay = Calendar.current.startOfDay(for: now) let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate) let sumOption = HKStatisticsOptions.cumulativeSum let statisticsSumQuery = HKStatisticsQuery(quantityType: healthKitManager.flightsClimbed!, quantitySamplePredicate: predicate, options: sumOption) { (query, result, error) in if let sumQuantity = result?.sumQuantity(){ DispatchQueue.main.async { let headerView = self.tableView.dequeueReusableCell(withIdentifier: "totalStepsCell")! as UITableViewCell let numberOfSteps = Int(sumQuantity.doubleValue(for: self.healthKitManager.flightClimbedUnit)) headerView.textLabel?.text = " \(numberOfSteps) FLOORS" self.tableView.tableHeaderView = headerView } } } healthKitManager.healthStore?.execute(statisticsSumQuery) } func readFloors(){ let now = Date() let startOfDay = Calendar.current.startOfDay(for: now) let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate) let sampleQuery = HKSampleQuery(sampleType: healthKitManager.flightsClimbed!, predicate: predicate, limit: 20, sortDescriptors: nil) { [weak self](query,results, error) in if let results = results as? [HKQuantitySample]{ self?.floors = results DispatchQueue.main.async { self?.tableView.reloadData() } } } healthKitManager.healthStore?.execute(sampleQuery) }
Comments
Post a Comment