Wenn Sie versuchen, eine Observer-Abfrage für Healthkit festzulegen, erhalte ich für viele Benutzer einen Fehler von Authorization not Determined
.HKObserverQuery schlägt mit Autorisierung nicht bestimmt
Nach einer Recherche für ein bisschen sah ich, dass ein solcher Fehler nur passieren sollte, wenn Sie versuchen, Daten zu Healthkit zu schreiben (teilen). Laut Apple HK Documentation - Beim Versuch, Daten zu lesen, denen der Benutzer keine Berechtigungen erteilt habe, sollte ich keinerlei Daten (ohne Fehler) erhalten, als ob keine neuen Daten vorhanden wären.
Hier ist der Code, den ich verwende, um die Beobachter-Abfragen zu setzen:
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)
}
Der Fehler auf dem HKObserverQuery failed
Ereignis abgefangen wird.
Wie ich bereits erwähnt die Erlaubnisanfrage sollte nicht die Datenlese beeinflussen, aber hier ist der Code trotzdem:
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()
})
}
Und Hier ist der Teil, wo ich Hintergrund Lieferung
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))
}
})
}
Danke, Das war es, aus irgendeinem Grund mussten Benutzer nach einem Versionsupdate, die bereits hk-Berechtigungen genehmigt hatten, sie erneut genehmigen. –