我正在使用Xcode 8 beta 6,我正在请求访问健康应用程序。请求授权的方法requestAuthorization(toShare:read:completion:)
在完成处理程序返回时总是产生true
- success
在下面的代码中。即使我在模拟器中拒绝一切,我也会得到true
。这是我处理授权的代码。是我的代码出错了,还是这是一个Xcode bug?
import Foundation
import HealthKit
class HealthManager {
private let healthStore = HKHealthStore()
class var sharedInstance: HealthManager {
struct Singleton {
static let instance = HealthManager()
}
return Singleton.instance
}
private var isAuthorized: Bool? = false
func authorizeHealthKit(completion: ((_ success: Bool) -> Void)!) {
let writableTypes: Set<HKSampleType> = [HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)!, HKWorkoutType.workoutType(), HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!, HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.activeEnergyBurned)!, HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!]
let readableTypes: Set<HKSampleType> = [HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)!, HKWorkoutType.workoutType(), HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!, HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.activeEnergyBurned)!, HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!]
guard HKHealthStore.isHealthDataAvailable() else {
completion(false)
return
}
// Request Authorization
healthStore.requestAuthorization(toShare: writableTypes, read: readableTypes) { (success, error) in
if success {
completion(true)
self.isAuthorized = true
} else {
completion(false)
self.isAuthorized = false
print("error authorizating HealthStore. You're propably on iPad (error?.localizedDescription)")
}
}
}
}
谢谢你的帮助!
你误解了成功标志的含义。YES表示成功显示权限屏幕,NO表示显示权限屏幕出错。来自Apple的HealthKit文档:
指示请求是否被成功处理的布尔值。该值并不表示是否实际授予了权限。如果在处理请求时发生错误,则此参数为NO;否则,为YES。
如果你想检查你是否有写数据的访问权限,你需要使用authorizationStatus(for:)
,但注意你不能确定读数据的授权。
该方法检查保存数据的授权状态
为了防止可能的敏感健康信息泄露,您的应用程序无法确定用户是否授予了读取数据的权限。如果未授予权限,则会显示为HealthKit存储中没有请求类型的数据。如果你的应用程序被赋予了共享权限,但没有读权限,你只能看到你的应用程序已经写入到商店的数据。其他来源的数据仍然是隐藏的。
文档在这里:https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HKHealthStore_Class/index.html