我已经编写了一个基本的iPhone应用程序,可以成功读取HealthKit的重量,但我相应的WatchOS应用程序只返回空结果。我在两个平台上使用相同的HealthKit代码。我知道授权适用于Watch,因为授权请求返回isEnabled = success。
模拟器和硬件设备上的行为相同,并且Phone返回正确的权重,但是watch会返回带有0个样本(results?.count=0
)的结果集。为同一项目中的监视和电话目标启用了HealthKit功能。我使用的是WatchOS 2和Xcode 7.0.1。
你能帮我理解为什么手表没有结果吗?
iPhone的ViewController代码
@IBAction func btnReadWeight(sender: AnyObject) {
HealthKit().recentWeight() { weight, error in
dispatch_async( dispatch_get_main_queue(), { () -> Void in
self.txtWeight.text=String(format:"%.1f",weight)
})
}
}
Watch上的InterfaceController代码
@IBAction func btnReadWeight() {
HealthKit().recentWeight() { weight, error in
dispatch_async( dispatch_get_main_queue(), { () -> Void in
self.myLabel.setText(String(format:"%.1f",weight))
})
}
}
Healthkit代码(在iPhone和Watch上相同)
func recentWeight(completion: (Double, NSError?) -> () )
{
let type = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierBodyMass)
let today = NSDate()
let querystart = NSCalendar.currentCalendar().dateByAddingUnit(
.Day,
value: -365, // since a year ago
toDate: today,
options: NSCalendarOptions(rawValue:0))
let predicate = HKQuery.predicateForSamplesWithStartDate(querystart , endDate: NSDate(), options: .None)
let query = HKSampleQuery(sampleType: type!, predicate: predicate, limit: 0, sortDescriptors: nil) { query, results, error in
var recentweight: Double = 0
print(results?.count )
if results?.count > 0
{
for result in results as! [HKQuantitySample]
{
recentweight = result.quantity.doubleValueForUnit(HKUnit.gramUnit())/1000.0
}
}
completion(recentweight, error)
}
healthKitStore.executeQuery(query)
}
答案 0 :(得分:1)
有两种行为可以解释您所看到的内容:
(1)手表上保存的所有样本都会同步到手机进行永久记录。但是保存在手机上的样本却不是这样。手表的存储容量有限,并且速度不如手机快,因此在手表上存储所有样品的完整数据库是不可行的。如果重量样本来自手机,那么它将不会出现在手表上。
(2)要限制手表上HealthKit数据库的总体大小,手表上保存的样本将在大约一周后过期,并且将无法再访问。请参阅the HKHealthStore documentation。