从 HealthKit (HKStatistics) 获取最新(最近)的 Step 值
Get the latest (most recent) Step value from HealthKit (HKStatistics)
我想获取 Health(Kit) 应用程序条目的最后(又名最近)值。
例如最新 HKSource 条目中的步长值。
我认为这将与查询构建中的 HKStatisticsOptions.discreteMostRecent
属性一起使用。
当前结果
代码运行良好,没有错误。我的统计数据具有正确的开始和结束日期(如果只有一个值可用,则开始和结束日期相同)。
问题是 statistics.sources
列表总是 nil 就像 statistics.mostRecentQuantity()
returns 也是 nil。
所有与 HKSource 无关的求和运算 sumQuantity()
都可以正常工作。
其他 Whosebug 帖子
我会尝试使用限制为 1 的查询和排序描述 的想法,但我也需要在详细视图中显示其他历史值。这就是为什么我想,我可以只请求一个数量的日期框架,使用最新的作为我的 "last" 而所有其他的作为我的历史 table 视图。
代码
func requestMeasurements(completion: @escaping (HKStatistics?, AppError?) -> Void)
{
let healthStore = HKHealthStore()
// Check if HK is available.
guard HKHealthStore.isHealthDataAvailable() else
{
completion(nil, AppError.healthInformationNotAvailable)
return
}
// Check if HK information is available
guard let quantitiyType = HKQuantityType.quantityType(forIdentifier: .stepCount) else
{
completion(nil, AppError.requestedHealthDataTypeNotAvailable)
return
}
let typeSet: Set = [quantitiyType]
// Request user access to HK and especially this type
healthStore.requestAuthorization(toShare: nil, read: typeSet)
{ success, error in
// Ensure that the app has the required access
if success == false
{
print(error?.localizedDescription ?? "<no error description>")
completion(nil, AppError.noAccessToRequestedInformation)
return
}
// Build query
let now = Date()
let lastSync = Calendar.current.startOfDay(for: now)
let prediction = HKQuery.predicateForSamples(withStart: lastSync, end: now, options: .strictStartDate)
let query = HKStatisticsQuery(quantityType: quantitiyType, quantitySamplePredicate: prediction, options: HKStatisticsOptions.discreteMostRecent)
{ _, statistics, error in
// Check for error.
if let _error = error
{
print("An error occured: \(_error.localizedDescription)")
completion(nil, AppError.requestingFailed)
return
}
// Check if statistics are available.
guard let _statistics = statistics else
{
completion(nil, AppError.requestingFailed)
return
}
completion(_statistics, nil)
}
// Execure query
healthStore.execute(query)
}
如果您只想使用数量等。只需使用 HKSampleQuery
而不是 HKStatisticsQuery
。
之后,您只需将 HKSample
的结果列表转换为 [HKQuantitySample]
。
现在您有了开始日期和结束日期,还有 quantity
。
我想获取 Health(Kit) 应用程序条目的最后(又名最近)值。 例如最新 HKSource 条目中的步长值。
我认为这将与查询构建中的 HKStatisticsOptions.discreteMostRecent
属性一起使用。
当前结果
代码运行良好,没有错误。我的统计数据具有正确的开始和结束日期(如果只有一个值可用,则开始和结束日期相同)。
问题是 statistics.sources
列表总是 nil 就像 statistics.mostRecentQuantity()
returns 也是 nil。
所有与 HKSource 无关的求和运算 sumQuantity()
都可以正常工作。
其他 Whosebug 帖子
我会尝试使用限制为 1 的查询和排序描述
代码
func requestMeasurements(completion: @escaping (HKStatistics?, AppError?) -> Void)
{
let healthStore = HKHealthStore()
// Check if HK is available.
guard HKHealthStore.isHealthDataAvailable() else
{
completion(nil, AppError.healthInformationNotAvailable)
return
}
// Check if HK information is available
guard let quantitiyType = HKQuantityType.quantityType(forIdentifier: .stepCount) else
{
completion(nil, AppError.requestedHealthDataTypeNotAvailable)
return
}
let typeSet: Set = [quantitiyType]
// Request user access to HK and especially this type
healthStore.requestAuthorization(toShare: nil, read: typeSet)
{ success, error in
// Ensure that the app has the required access
if success == false
{
print(error?.localizedDescription ?? "<no error description>")
completion(nil, AppError.noAccessToRequestedInformation)
return
}
// Build query
let now = Date()
let lastSync = Calendar.current.startOfDay(for: now)
let prediction = HKQuery.predicateForSamples(withStart: lastSync, end: now, options: .strictStartDate)
let query = HKStatisticsQuery(quantityType: quantitiyType, quantitySamplePredicate: prediction, options: HKStatisticsOptions.discreteMostRecent)
{ _, statistics, error in
// Check for error.
if let _error = error
{
print("An error occured: \(_error.localizedDescription)")
completion(nil, AppError.requestingFailed)
return
}
// Check if statistics are available.
guard let _statistics = statistics else
{
completion(nil, AppError.requestingFailed)
return
}
completion(_statistics, nil)
}
// Execure query
healthStore.execute(query)
}
如果您只想使用数量等。只需使用 HKSampleQuery
而不是 HKStatisticsQuery
。
之后,您只需将 HKSample
的结果列表转换为 [HKQuantitySample]
。
现在您有了开始日期和结束日期,还有 quantity
。