Skip to content

Instantly share code, notes, and snippets.

@anirudhamahale
Created October 30, 2020 12:03
Show Gist options
  • Save anirudhamahale/fa20ec8104852c7b9e66453aba688468 to your computer and use it in GitHub Desktop.
Save anirudhamahale/fa20ec8104852c7b9e66453aba688468 to your computer and use it in GitHub Desktop.
Wrapper for HKHealthStore written in RxSwift to return steps count, distance(walking & running) & active energy burned.
import Foundation
import HealthKit
import RxSwift
class HealthKitManager {
private let healthStore = HKHealthStore()
func requestPermission() -> Observable<Bool> {
return .create { [weak self] (observer) -> Disposable in
let healthKitTypes: Set = [ HKObjectType.quantityType(forIdentifier: .stepCount)!, HKObjectType.quantityType(forIdentifier: .distanceWalkingRunning)! ]
self?.healthStore.requestAuthorization(toShare: healthKitTypes, read: healthKitTypes, completion: { (success, error) in
if let error = error {
observer.onError(error)
}
observer.onNext(success)
observer.onCompleted()
})
return Disposables.create()
}
}
func getSteps(for date: Date, interval: DateComponents) -> Observable<Double> {
return .create { [weak self] (observer) -> Disposable in
let stepsCount = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let query = HKStatisticsCollectionQuery(quantityType: stepsCount, quantitySamplePredicate: nil, options: [.cumulativeSum], anchorDate: date, intervalComponents: interval)
query.initialResultsHandler = { _, result, error in
if let error = error {
observer.onError(error)
}
if let result = result {
var resultCount = 0.0
result.enumerateStatistics(from: date, to: Date()) { statistics, _ in
if let sum = statistics.sumQuantity() {
// Get steps (they are of double type)
resultCount = sum.doubleValue(for: HKUnit.count())
} // end if
observer.onNext(resultCount)
}
}
observer.onCompleted()
}
self?.healthStore.execute(query)
return Disposables.create()
}
}
func getDistance(for date: Date, interval: DateComponents) -> Observable<Double> {
return .create { [weak self] (observer) -> Disposable in
let distanceWalkingRunning = HKQuantityType.quantityType(forIdentifier: .distanceWalkingRunning)!
let query = HKStatisticsCollectionQuery(quantityType: distanceWalkingRunning, quantitySamplePredicate: nil, options: [.cumulativeSum], anchorDate: date, intervalComponents: interval)
query.initialResultsHandler = { _, result, error in
if let error = error {
observer.onError(error)
}
if let result = result {
var resultCount = 0.0
result.enumerateStatistics(from: date, to: Date()) { statistics, _ in
if let sum = statistics.sumQuantity() {
// Get steps (they are of double type)
resultCount = sum.doubleValue(for: HKUnit.meter())
} // end if
}
observer.onNext(resultCount)
}
observer.onCompleted()
}
self?.healthStore.execute(query)
return Disposables.create()
}
}
func getCaloriesCount(for date: Date, interval: DateComponents) -> Observable<Double> {
return .create { [weak self] (observer) -> Disposable in
let activeEnergyBurned = HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned)!
let query = HKStatisticsCollectionQuery(quantityType: activeEnergyBurned, quantitySamplePredicate: nil, options: [.cumulativeSum], anchorDate: date, intervalComponents: interval)
query.initialResultsHandler = { _, result, error in
if let error = error {
observer.onError(error)
}
if let result = result {
var resultCount = 0.0
result.enumerateStatistics(from: date, to: Date()) { statistics, _ in
if let sum = statistics.sumQuantity() {
// Get steps (they are of double type)
resultCount = sum.doubleValue(for: HKUnit.kilocalorie())
} // end if
observer.onNext(resultCount)
}
}
observer.onCompleted()
}
self?.healthStore.execute(query)
return Disposables.create()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment