HealthKit - requestAuthorization(toShare:read:completion :)总是成功

时间:2016-08-30 17:06:24

标签: ios swift xcode health-kit xcode8-beta6

我正在使用Xcode 8 beta 6而我正在请求访问Health App。当完成处理程序在我的代码中返回requestAuthorization(toShare:read:completion:)时,请求授权的方法true始终生成success。即使我拒绝模拟器中的所有内容,我也会获得true。 这是我处理授权的代码。我的代码中的某些内容是错的还是这是一个Xcode错误?

import Foundation
import HealthKit

class HealthManager {
    private let healthStore = HKHealthStore()

    class var sharedInstance: HealthManager {
        struct Singleton {
            static let instance = HealthManager()
        }
        return Singleton.instance
    }

    private var isAuthorized: Bool? = false

    func authorizeHealthKit(completion: ((_ success: Bool) -> Void)!) {
        let writableTypes: Set<HKSampleType> = [HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)!, HKWorkoutType.workoutType(), HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!, HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.activeEnergyBurned)!, HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!]
        let readableTypes: Set<HKSampleType> = [HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.distanceWalkingRunning)!, HKWorkoutType.workoutType(), HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!, HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.activeEnergyBurned)!, HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.heartRate)!]

        guard HKHealthStore.isHealthDataAvailable() else {
            completion(false)
            return
        }

        // Request Authorization
        healthStore.requestAuthorization(toShare: writableTypes, read: readableTypes) { (success, error) in

            if success {
                completion(true)
                self.isAuthorized = true
            } else {
                completion(false)
                self.isAuthorized = false
                print("error authorizating HealthStore. You're propably on iPad \(error?.localizedDescription)")
            }
        }
    }
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:7)

您误解了成功标志的含义。 YES表示权限屏幕已成功显示,NO表示显示权限屏幕时出错。来自Apple的HealthKit文档:

  

一个布尔值,指示请求是否已成功处理。此值不表示是否实际授予了权限。如果在处理请求时发生错误,则此参数为NO;否则,是的。

如果您想检查是否有权写入数据,则需要使用authorizationStatus(for:),但请注意,您无法确定读取数据的授权。

  

此方法检查授权状态以保存数据。

     

为了帮助防止敏感健康信息可能泄漏,您的应用无法确定用户是否已授予读取数据的权限。如果您未获得许可,则看起来好像HealthKit商店中没有所请求类型的数据。如果您的应用获得了共享权限但未获得读取权限,则只会看到应用已写入商店的数据。来自其他来源的数据仍然是隐藏的。

文档在这里:https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HKHealthStore_Class/index.html