Как проверить, разрешено ли HealthKit

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

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

        }
    }

В качестве альтернативы я попробовал авторизациюStatusForType и включил его значения перечисления, но имел ту же проблему, что и я всегда разрешен.

Ответ 1

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

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

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

Ответ 2

Примечание: authorizationStatus предназначен для определения статуса доступа только для записи, но не для чтения. Нет никакой возможности узнать, имеет ли ваше приложение доступ для чтения. К вашему сведению, fooobar.com/questions/9850008/...

Вот пример запроса и проверки прав доступа в 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)
        }
    }
})

Ответ 3

В настоящее время приложение никак не может определить, предоставил ли пользователь разрешение на чтение данных о работоспособности.

Ниже приведено описание от Apple от authorizationStatus (для :):

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