我想检查HeathKit是否已经授权我阅读用户的数据,如果我被授权进行锻炼,如果没有弹出警报。但requestAuthorizationToShareTypes似乎总是返回true?如何获得用户是否授权我的参考?
override func viewDidLoad() {
super.viewDidLoad()
//1. Set the types you want to read from HK Store
let healthKitTypesToRead: [AnyObject?] = [
HKObjectType.workoutType()
]
//2. If the store is not available (for instance, iPad) return an error and don't go on.
if !HKHealthStore.isHealthDataAvailable() {
let error = NSError(domain: "com.myndarc.myrunz", code: 2, userInfo: [NSLocalizedDescriptionKey: "HealthKit is not available in this Device"])
print(error)
let alertController = UIAlertController(title: "HealthKit Not Available", message: "It doesn't look like HealthKit is available on your device.", preferredStyle: .Alert)
presentViewController(alertController, animated: true, completion: nil)
let ok = UIAlertAction(title: "Ok", style: .Default, handler: { (action) -> Void in })
alertController.addAction(ok)
}
//3. Request Healthkit Authorization
let sampleTypes = Set(healthKitTypesToRead.flatMap { $0 as? HKSampleType })
healthKitStore.requestAuthorizationToShareTypes(sampleTypes, readTypes: nil) {
(success, error) -> Void in
if success {
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.performSegueWithIdentifier("segueToWorkouts", sender: nil)
});
} else {
print(error)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.showHKAuthRequestAlert()
});
}
}
}
或者,我已尝试使用authorizationStatusForType并打开其枚举值,但遇到了同样的问题,因为我总是被授权。
答案 0 :(得分:9)
您误解了success
标志在此上下文中的含义。
当success
为真时,这意味着iOS成功地向用户询问了健康工具包的访问权限。这并不意味着他们用“是”来回答这个问题。
要确定他们是否说是/否,您需要更具体,如果您有权阅读/写入您感兴趣的特定类型的数据,则需要提供健康工具包。 来自HealthKit上的苹果文档:
请求授权后,您的应用已准备好访问HealthKit商店。如果您的应用具有共享数据类型的权限,则可以创建并保存该类型的样本。在尝试保存任何样本之前,您应该通过调用authorizationStatusForType来验证您的应用是否有权共享数据。
答案 1 :(得分:8)
注意:
authorizationStatus
仅用于确定访问状态 写但不读。没有选项可以知道您的应用是否有 读取权限。仅供参考,https://stackoverflow.com/a/29128231/1996294
以下是HealthKitStore
// Present user with items we need permission for in HealthKit
healthKitStore.requestAuthorization(toShare: typesToShare, read: typesToRead, completion: { (userWasShownPermissionView, error) in
// Determine if the user saw the permission view
if (userWasShownPermissionView) {
print("User was shown permission view")
// ** IMPORTANT
// Check for access to your HealthKit Type(s). This is an example of using BodyMass.
if (self.healthKitStore.authorizationStatus(for: HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bodyMass)!) == .sharingAuthorized) {
print("Permission Granted to Access BodyMass")
} else {
print("Permission Denied to Access BodyMass")
}
} else {
print("User was not shown permission view")
// An error occurred
if let e = error {
print(e)
}
}
})
答案 2 :(得分:1)
当前,该应用无法确定用户是否已授予读取健康数据的权限。
以下是来自authorizationStatus(for:)的Apple的描述:
为帮助防止敏感健康信息的可能泄漏,您的 应用无法确定用户是否已授予 读取数据。如果未获得您的许可,它看起来就像 HealthKit存储中没有所请求类型的数据。如果你的 该应用已被授予共享权限,但没有读取权限,您只会看到 您的应用已写入商店的数据。来自其他的数据 来源仍然隐藏。