如何解决HKCategorySample的`endDate`早于`startDate` 问题:我收集的无效数据:我用于睡眠数据查询的代码:一些注意事项:
问题:
最近,我观察到HKSampleQuery
中类别类型为sleepAnalysis
的异常行为。对于HKCategorySample
实例,根据Apple's Documentation
startDate <= endDate
如果样本表示某个持续时间内的数据,则开始时间必须早于结束时间。如果样本表示特定时刻的数据,则开始时间和结束时间可以相同。
因此Apple Doc还说开始时间必须早于结束时间。但就我而言,这种约束没有得到维持。
我收集的无效数据:
服务器端数据显示以下内容
{
"startTime": "2020-10-01T05:48:04Z","endTime": "2020-09-30T23:00:00Z","type": "inBed"
}
// Meta Data:
Source: User's iPhone
iOS Version: 14.0
iPhone 11
HKTimeZone: Asia/Ho_Chi_Minh
我用于睡眠数据查询的代码:
//MARK: Fetching HeathKit data
class func retrieveHKSleepTime() {
guard let quantityType = HKObjectType.categoryType(forIdentifier: .sleepAnalysis) else {
return
}
let endDate = Date()
let calendar = Calendar(identifier: .gregorian)
var startDate = calendar.date(byAdding: .day,value: -2,to: endDate)!
startDate = Calendar(identifier: .gregorian).startOfDay(for: startDate)
let predicate = HKQuery.predicateForSamples(withStart: startDate,end: endDate,options: [])
let query = HKSampleQuery(sampleType: quantityType,predicate: predicate,limit: 0,sortDescriptors: nil) { (query,samples,error) in
guard error == nil else { return }
if let samples = samples as? [HKCategorySample] {
let expectedSleepTypes: [HKCategoryValueSleepAnalysis] = [.asleep,.inBed]
let expectedSleepTypeValues: [Int] = expectedSleepTypes.map { $0.rawValue }
let data = samples.filter { expectedSleepTypeValues.contains($0.value) }
.map { [
"startDate": $0.startDate.getUnixEpochString(),"endDate": $0.endDate.getUnixEpochString(),"type": $0.value
]}
} else {
// Log error
}
}
HKHealthStore().execute(query)
}
/// Date string in ISOFormat
func getUnixEpochString() -> String {
return Date.isoFormatter.string(from: self)
}
/// ISO Formatter with current time zone
static var isoFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.timeZone = TimeZone.current
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
return formatter
}()
一些注意事项:
-
上述查询中存在一个已知问题,我们未使用
HKHealthStore
的单个实例。我们正在进行一系列HealthKit
查询,每个查询在执行查询时都使用HKHealthStore
的本地实例。这不应该是问题,我们之前没有看到过无效数据。 -
到目前为止,我们已经从运行iOS 14.0的单个用户那里观察到此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。