已授予 HealthKit 授权并在模拟器上工作,但不在实际设备上工作
HealthKit authorization granted and working on simulator but not on actual device
我正在为 Apple Watch 开发一个锻炼应用程序,运行 解决了在我的实际手表上使用 HealthKit 的一些问题。
请求授权在模拟器和我的设备上都有效,并且在每次启动时都显示成功。然而,在我的设备上查询和读取示例失败,但在模拟器上却没有。
启动后,授权成功,当需要查询或保存锻炼时,提示"Authorization is not determined"。
两项权利均已将 HealthKit 设置为 YES,HealthKit 和后台功能已打开,NSHealthShareUsageDescription 和 NSHealthUpdateUsageDescription 键在 iOS Info.plist.
中提供
授权码
// Configure write values
let writeTypes: Set<HKSampleType> = [.workoutType(),
HKSampleType.quantityType(forIdentifier: .heartRate)!,
HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKSampleType.quantityType(forIdentifier: .stepCount)!,
HKSampleType.quantityType(forIdentifier: .distanceCycling)!,
HKSampleType.quantityType(forIdentifier: .distanceSwimming)!,
HKSampleType.quantityType(forIdentifier: .distanceWalkingRunning)!,
HKSampleType.quantityType(forIdentifier: .swimmingStrokeCount)!]
// Configure read values
let readTypes: Set<HKObjectType> = [.activitySummaryType(), .workoutType(),
HKObjectType.quantityType(forIdentifier: .heartRate)!,
HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKObjectType.quantityType(forIdentifier: .stepCount)!,
HKObjectType.quantityType(forIdentifier: .distanceCycling)!,
HKObjectType.quantityType(forIdentifier: .distanceSwimming)!,
HKObjectType.quantityType(forIdentifier: .distanceWalkingRunning)!,
HKObjectType.quantityType(forIdentifier: .swimmingStrokeCount)!]
// Create health store
let healthStore = HKHealthStore()
// Use it to request authorization for our types
healthStore.requestAuthorization(toShare: writeTypes, read: readTypes) { (success, error) in
if success {
print("Success: authorization granted")
} else {
print("Error: \(error?.localizedDescription ?? "")")
}
}
查询代码(Udemy课程)
func startQuery(_ quantityTypeIdentifier: HKQuantityTypeIdentifier) {
// We only want data points after our workout start date
let datePredicate = HKQuery.predicateForSamples(withStart: workoutStartDate, end: nil, options: .strictStartDate)
// And from our current device
let devicePredicate = HKQuery.predicateForObjects(from: [HKDevice.local()])
// Combine them
let queryPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [datePredicate, devicePredicate])
// Write code to receive results from our query
let updateHandler: (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> Void = { query, samples, deletedObjects, queryAnchor, error in
//safely typecast to a quantity sample so we can read values
guard let samples = samples as? [HKQuantitySample] else { return }
//process the samples
print("Start processing samples")
self.process(samples, type: quantityTypeIdentifier)
}
// Create the query out of our type (e.g. heart rate), predicate and result handling code
let quantityType = HKObjectType.quantityType(forIdentifier: quantityTypeIdentifier)!
let query = HKAnchoredObjectQuery(type: quantityType, predicate: queryPredicate, anchor: nil, limit: HKObjectQueryNoLimit, resultsHandler: updateHandler)
// Tell HealthKit to re-run the code every time new data is available
query.updateHandler = updateHandler
// Start the query running
healthStore.execute(query)
// Stach it away so we can stop it later
activeDataQueries.append(query)
}
我将授权代码放在我的 ExtensionDelegate 中,而不是我正在查询的同一个文件中,它开始工作了。
奇怪的是它在模拟器上运行但之前在实际设备上运行不正常。
我正在为 Apple Watch 开发一个锻炼应用程序,运行 解决了在我的实际手表上使用 HealthKit 的一些问题。
请求授权在模拟器和我的设备上都有效,并且在每次启动时都显示成功。然而,在我的设备上查询和读取示例失败,但在模拟器上却没有。
启动后,授权成功,当需要查询或保存锻炼时,提示"Authorization is not determined"。
两项权利均已将 HealthKit 设置为 YES,HealthKit 和后台功能已打开,NSHealthShareUsageDescription 和 NSHealthUpdateUsageDescription 键在 iOS Info.plist.
中提供授权码
// Configure write values
let writeTypes: Set<HKSampleType> = [.workoutType(),
HKSampleType.quantityType(forIdentifier: .heartRate)!,
HKSampleType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKSampleType.quantityType(forIdentifier: .stepCount)!,
HKSampleType.quantityType(forIdentifier: .distanceCycling)!,
HKSampleType.quantityType(forIdentifier: .distanceSwimming)!,
HKSampleType.quantityType(forIdentifier: .distanceWalkingRunning)!,
HKSampleType.quantityType(forIdentifier: .swimmingStrokeCount)!]
// Configure read values
let readTypes: Set<HKObjectType> = [.activitySummaryType(), .workoutType(),
HKObjectType.quantityType(forIdentifier: .heartRate)!,
HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!,
HKObjectType.quantityType(forIdentifier: .stepCount)!,
HKObjectType.quantityType(forIdentifier: .distanceCycling)!,
HKObjectType.quantityType(forIdentifier: .distanceSwimming)!,
HKObjectType.quantityType(forIdentifier: .distanceWalkingRunning)!,
HKObjectType.quantityType(forIdentifier: .swimmingStrokeCount)!]
// Create health store
let healthStore = HKHealthStore()
// Use it to request authorization for our types
healthStore.requestAuthorization(toShare: writeTypes, read: readTypes) { (success, error) in
if success {
print("Success: authorization granted")
} else {
print("Error: \(error?.localizedDescription ?? "")")
}
}
查询代码(Udemy课程)
func startQuery(_ quantityTypeIdentifier: HKQuantityTypeIdentifier) {
// We only want data points after our workout start date
let datePredicate = HKQuery.predicateForSamples(withStart: workoutStartDate, end: nil, options: .strictStartDate)
// And from our current device
let devicePredicate = HKQuery.predicateForObjects(from: [HKDevice.local()])
// Combine them
let queryPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [datePredicate, devicePredicate])
// Write code to receive results from our query
let updateHandler: (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, Error?) -> Void = { query, samples, deletedObjects, queryAnchor, error in
//safely typecast to a quantity sample so we can read values
guard let samples = samples as? [HKQuantitySample] else { return }
//process the samples
print("Start processing samples")
self.process(samples, type: quantityTypeIdentifier)
}
// Create the query out of our type (e.g. heart rate), predicate and result handling code
let quantityType = HKObjectType.quantityType(forIdentifier: quantityTypeIdentifier)!
let query = HKAnchoredObjectQuery(type: quantityType, predicate: queryPredicate, anchor: nil, limit: HKObjectQueryNoLimit, resultsHandler: updateHandler)
// Tell HealthKit to re-run the code every time new data is available
query.updateHandler = updateHandler
// Start the query running
healthStore.execute(query)
// Stach it away so we can stop it later
activeDataQueries.append(query)
}
我将授权代码放在我的 ExtensionDelegate 中,而不是我正在查询的同一个文件中,它开始工作了。
奇怪的是它在模拟器上运行但之前在实际设备上运行不正常。