2015-10-08 16 views
8

Voglio verificare se HeathKit è stato autorizzato a leggere i dati dell'utente, se sono autorizzato a seguire gli allenamenti, se non inserire un avviso. Ma requestAuthorizationToShareTypes sembra sempre restituire vero? Come posso ottenere un riferimento se l'utente mi ha autorizzato o meno?Come verificare se HealthKit è stato autorizzato

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

     } 
    } 

In alternativa, ho provato authorizationStatusForType e acceso i suoi valori enum ma ha avuto lo stesso problema in che sto sempre autorizzato.

+0

il sistema non hai chiesto il permesso? –

+0

no, ma anche se non lo autorizzi, il blocco di successo si chiama – GarySabo

risposta

6

Si sta interpretando erroneamente il significato del flag success in questo contesto. Quando success è vero, tutto ciò significa che iOS ha chiesto correttamente all'utente l'accesso al kit di accesso. NON significa che abbiano risposto a questa domanda con un "sì".

Per determinare se hanno detto sì/no, è necessario ottenere informazioni più specifiche e chiedere il kit di assistenza sanitaria se si dispone dell'autorizzazione per leggere/scrivere il particolare tipo di dati a cui si è interessati. Dalla documentazione Apple su HealthKit :

Dopo aver richiesto l'autorizzazione, l'app è pronta per accedere allo store di HealthKit. Se la tua app ha il permesso di condividere un tipo di dati, può creare e salvare campioni di quel tipo. È necessario verificare che l'app disponga dell'autorizzazione per condividere i dati chiamando authorizationStatusForType: prima di tentare di salvare qualsiasi campione.

+3

Grazie ... Ho provato authorStatusForType ma da quello che ho capito non posso leggerlo: http://stackoverflow.com/ domande/25512320/healthkit-hkauthorizationstatus-for-reading-data – GarySabo

+2

Apple si prende cura della privacy degli utenti, se non viene data l'autorizzazione, appare semplicemente come se non ci fossero dati del tipo richiesto nell'archivio HealthKit. Se all'app viene assegnato il permesso di condivisione ma non il permesso di lettura, vengono visualizzati solo i dati che l'app ha scritto nel negozio. I dati di altre fonti rimangono nascosti. – Aks

5

Ecco un esempio di richiesta e controllando l'accesso autorizzazione 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) 
     } 
    } 
}) 
+0

'requestAuthorization' presenta la vista di autorizzazione ... non * verifica *. – Ixx

Problemi correlati