Как проверить, авторизован ли HealthKit
Я хочу проверить, авторизован ли мне 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 и включил значения enum, но у меня была та же проблема: я всегда авторизован.
2 ответа
Вы неправильно понимаете, что success
флаг означает в этом контексте. когда success
правда, все это означает, что iOS успешно спросила пользователя о доступе к аптечке. Это НЕ означает, что они ответили на этот вопрос "да".
Чтобы определить, сказали ли они "да" или "нет", вам нужно получить более конкретную информацию и спросить аптечку, если у вас есть разрешение на чтение / запись данных определенного типа, которые вас интересуют. Из документов Apple на HealthKit:
После запроса авторизации ваше приложение готово для доступа к магазину HealthKit. Если ваше приложение имеет разрешение на совместное использование типа данных, оно может создавать и сохранять образцы этого типа. Прежде чем пытаться сохранить какие-либо образцы, убедитесь, что у вашего приложения есть разрешение на обмен данными, вызвав authorizationStatusForType:
Замечания:
authorizationStatus
заключается в определении статуса доступа только для записи, но не для чтения. Нет никакой возможности узнать, имеет ли ваше приложение доступ для чтения. К вашему сведению, /questions/46331566/status-avtorizatsii-healthkit-vsegda-1/46331578#46331578
Вот пример запроса и проверки прав доступа в 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)
}
}
})
В настоящее время приложение не может определить, предоставил ли пользователь разрешение на чтение данных о состоянии здоровья.
Ниже приведено описание от Apple из authorizationStatus(для:):
Чтобы предотвратить возможные утечки конфиденциальной медицинской информации, ваше приложение не может определить, предоставил ли пользователь разрешение на чтение данных. Если у вас нет разрешения, это просто выглядит так, как будто в хранилище HealthKit нет данных запрошенного типа. Если вашему приложению предоставлено разрешение на общий доступ, но не на чтение, вы увидите только те данные, которые ваше приложение записало в магазин. Данные из других источников остаются скрытыми.