Сбой HKObserverQuery с авторизацией не определена
При попытке установить запрос наблюдателя для Healthkit для многих пользователей я получаю сообщение об ошибке Authorization not Determined
,
После небольшого исследования я понял, что подобная ошибка должна возникать только при попытке записать (поделиться) данные в Healthkit. В соответствии с документацией Apple HK - при попытке прочитать данные, на которые пользователь не предоставил разрешения, я не должен получать никаких данных вообще (без каких-либо ошибок), как если бы не было новых данных.
Вот код, который я использую для установки запросов наблюдателя:
class func setObserver(healthKitManager manager: HealthKitManager, forType type: HKSampleType?, withPredicateAfterFetching predicate: NSPredicate?) {
guard type != nil && manager.healthStore != nil else {
return
}
let query = HKObserverQuery.init(sampleType: type!, predicate: nil) { (query, completionHandler, error) in
guard error == nil else {
SimpleEvent(name: "HKObserverQuery failed", param: "type:\(type!.identifier), error: \(error!.localizedDescription)").fire()
return
}
let anchoredQuery = HKAnchoredObjectQuery.init(type: type!, predicate: predicate, anchor: manager.getHealthDataAnchor(forType: type!), limit: HKObjectQueryNoLimit, resultsHandler: { (query, results, deletedObjects, newAnchor, error) in
guard error == nil else {
SimpleEvent(name: "HKAnchoredQuery failed", param: "type:\(type!.identifier), error: \(error!.localizedDescription)").fire()
return
}
\\ Code that saves the HK Data
completionHandler()
})
manager.healthStore!.execute(anchoredQuery)
}
manager.healthStore!.execute(query)
manager.observerQueries.append(query)
}
Ошибка ловится на HKObserverQuery failed
событие.
Как я уже говорил, запрос на разрешение не должен влиять на чтение данных, но в любом случае вот этот код:
func requestAuthorizationToShareTypesAndReadTypes(withSuccess successBlock: @escaping () -> Void, failure failureBlock: @escaping () -> Void) {
self.healthStore?.requestAuthorization(toShare: writeDataTypes as! Set<HKSampleType>, read: readDataTypes as! Set<HKObjectType>, completion: { (success, error) in
if !success || error != nil {
SimpleEvent.init(name: "HK-requestAuthorization", param: error!.localizedDescription)
NSLog("You didn't allow HealthKit to access these read/write data types. The error was: %@.", error as! NSError);
failureBlock()
return;
}
self.userHaveBeenPromptWithPermissionsScreenAtLeastOnce = true
self.enableBackgroundDelivery()
successBlock()
})
}
И вот часть, где я включаю фоновую доставку
func enableBackgroundDelivery() {
for type in self.readDataTypes! {
if let type = type as? HKSampleType {
self.enableBackgroundDelivery(forSampleType: type)
}
}
}
func enableBackgroundDelivery(forSampleType type:HKSampleType) {
self.healthStore?.enableBackgroundDelivery(for: type, frequency: HKUpdateFrequency.immediate, withCompletion: { (success, error) in
if error != nil {
print(String.init(format: "HK-BackgoundError: error:%@, user: %@, type: %@", error!.localizedDescription, NRManager.shared().username, type.identifier))
}
})
}
2 ответа
Требуется авторизация для чтения данных из HealthKit. Если вы получаете сообщение об ошибке, указывающее, что авторизация не определена, это означает, что пользователю не было предложено авторизовать ваше приложение для чтения или записи образцов того типа, к которому вы обращаетесь.
Я решил это, добавив:
HKObjectType.activitySummaryType()
к типам чтения моего HKHealthStore requestAuthorization()