2017-09-10 4 views
0

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)) 
     } 

    }) 
} 

Antwort

1

Authorization ermöglichen ist erforderlich, um zu lesen Daten von HealthKit. Wenn Sie einen Fehler erhalten, der angibt, dass die Autorisierung nicht festgelegt wurde, weist dies darauf hin, dass der Benutzer nicht dazu aufgefordert wurde, Ihre App zu autorisieren, Muster des Typs, nach dem Sie suchen, zu lesen oder zu schreiben.

+0

Danke, Das war es, aus irgendeinem Grund mussten Benutzer nach einem Versionsupdate, die bereits hk-Berechtigungen genehmigt hatten, sie erneut genehmigen. –

Verwandte Themen