Created
October 30, 2020 12:03
-
-
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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