2015-10-08 2 views
8

Я хочу проверить, разрешено ли HeathKit для чтения данных пользователя, если я разрешаю выполнять тренировки, если не всплывает предупреждение. Но requestAuthorizationToShareTypes всегда, кажется, возвращает true? Как я могу получить ссылку на то, разрешил ли мне пользователь или нет?Как проверить, разрешено ли HealthKit

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 и включил его перечисляемых значений, но была такая же проблема в том, что я всегда авторизован.

+0

система никогда не просил вас о разрешении? –

+0

нет, но даже если вы его не разрешаете, блок успеха называется – GarySabo

ответ

6

Вы неправильно интерпретируете флаг success в этом контексте. Когда success истинно, все это означает, что iOS успешно попросил пользователя получить доступ к набору работоспособности. Это НЕ означает, что они ответили на этот вопрос «да».

Чтобы определить, были ли они даны/нет, вам нужно получить более конкретную информацию и спросить комплект здоровья, если у вас есть разрешение на чтение/запись определенного типа данных, которые вас интересуют. Из документов яблока на HealthKit :

После получения вашего разрешения ваше приложение готово получить доступ к магазину HealthKit. Если ваше приложение имеет разрешение на совместное использование типа данных, оно может создавать и сохранять образцы этого типа. Вы должны убедиться, что ваше приложение имеет разрешение на совместное использование данных, вызывая authorizationStatusForType: перед тем, как сохранить все образцы.

+3

Спасибо ... Я попробовал authorizationStatusForType, но из того, что понимаю, я не могу прочитать это: http://stackoverflow.com/ Вопросы/25512320/healthkit-hkauthorizationstatus-for-reading-data – GarySabo

+2

Apple заботится о конфиденциальности своих пользователей, если вам не дано разрешение, оно просто выглядит так, как будто в хранилище HealthKit нет данных запрашиваемого типа. Если вашему приложению предоставляется разрешение общего доступа, но не разрешено чтение, вы видите только данные, которые ваше приложение записало в хранилище. Данные из других источников остаются скрытыми. – Aks

5

Вот пример запроса и проверки разрешения на доступ в 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' представляет вид авторизации ... это не * проверка *. – Ixx

 Смежные вопросы

  • Нет связанных вопросов^_^