如何检查 HealthKit 是不是已被授权

Posted

技术标签:

【中文标题】如何检查 HealthKit 是不是已被授权【英文标题】:How to Check if HealthKit has been authorized如何检查 HealthKit 是否已被授权 【发布时间】:2015-10-08 14:18:53 【问题描述】:

我想检查 HeathKit 是否已被授权让我读取用户的数据,如果我被授权继续锻炼,如果没有弹出警报。但是 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()
                                    );
            

        
    

或者,我尝试了 authorizationStatusForType 并打开了它的枚举值,但遇到了同样的问题,因为我总是被授权。

【问题讨论】:

系统从来没有问过你的权限吗? 不会,但是即使你不授权,也会调用成功块 【参考方案1】:

您误解了success 标志在此上下文中的含义。 当success 为真时,这意味着ios 成功地询问了用户关于健康包的访问权限。这并不意味着他们对这个问题的回答是“是”。

要确定他们是否说是/否,您需要更加具体,并询问 health kit 您是否有权读取/写入您感兴趣的特定类型的数据。 来自 HealthKit 上的苹果文档:

请求授权后,您的应用就可以访问 HealthKit 商店了。如果您的应用有权共享数据类型,则它可以创建和保存该类型的示例。在尝试保存任何示例之前,您应该通过调用 authorizationStatusForType: 来验证您的应用是否有权共享数据。

【讨论】:

谢谢...我确实尝试了 authorizationStatusForType 但据我了解我无法阅读此内容:***.com/questions/25512320/… Apple 关心其用户的隐私,如果您未获得许可,则看起来好像 HealthKit 存储中没有请求类型的数据。如果您的应用被授予共享权限但没有读取权限,则您只能看到您的应用写入商店的数据。来自其他来源的数据仍然隐藏。【参考方案2】:

注意:authorizationStatus是判断访问状态只对 写但不读。没有选项可以知道您的应用程序是否有 读取权限。仅供参考,https://***.com/a/29128231/1996294

这里是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)
        
    
)

【讨论】:

requestAuthorization 呈现授权视图...这不是检查 我已经启用了读写权限,但是authorizationStatus总是返回false @SarathNagesh 你有没有找到任何运气让每次都出错?我这里也一样。如果有,请分享解决方案。我已经失去了我的一天。【参考方案3】:

目前,应用无法确定用户是否已授予读取健康数据的权限。

以下是来自苹果authorizationStatus(for:)的描述:

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

【讨论】:

以上是关于如何检查 HealthKit 是不是已被授权的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 HealthKit 中是不是允许读取步骤权限?

HealthKit 授权状态始终为 1

HealthKit 授权状态始终为 1

如何设置 HealthKit 请求授权 tableview 外观

如何设置 HealthKit 请求授权 tableview 外观

如何在 web api Authentication Failed 场景中获取详细错误而不是“消息”:“此请求的授权已被拒绝。”?