健康包(HK)读取数据的HKAuthorizationStatus状态

20

我正在使用HealthKit读取特定类型的信息,但我明确不要求写入功能。问题在于尝试检测用户是否允许读取某个健康类型。

我相信预期的解决方法是使用HKHealthStore的authorizationStatusForType方法,但它只返回被拒绝或未知状态。它仅对写入类型返回已授权状态。有人找到了一种使用此方法进行读取或其他解决方法吗?

HKQuantityType *stepsType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeight];
HKAuthorizationStatus status = [self.healthStore authorizationStatusForType:stepsType];
2个回答

24

由于隐私保护原因,您无法查看特定类型应用程序的读取授权状态。


3
有文件记录这个吗?我知道数据本身是敏感的,但授权本身不应该是。 - Sean
1
这个在 HealthKit 讲座的结尾有解释。 - jrushing
1
API文档(2014年9月8日)已经支持jrushing的说法:“为了帮助防止敏感健康信息的泄露,您的应用程序无法确定用户是否授予权限来读取数据。”https://developer.apple.com/library/prerelease/iOS/documentation/HealthKit/Reference/HKHealthStore_Class/index.html - RobLabs
9
我不明白它将如何有所帮助。如果您获取不到数据,可能是数据不存在或已被禁用 - 这有什么区别吗?我只需要告诉用户我无法获取这些数据,因此要么给我权限,要么不使用我的应用程序。 - superarts.org
2
@superarts.org 用户的偏好可能会通过代理方式表明健康信息。例如,您可以对已知医疗条件的用户的响应使用机器学习,然后输入未知用户的偏好并将其与最接近的条件匹配。 - dmur
好的,那么如果用户拒绝了读取某些数据的权限,我无法理解,但是我至少可以知道是否根本没有请求该权限吗?如果权限为UNDEFINED(用于读取类型)。 - superpuccio

1
        NSArray *quantityTypesUsedInApp = @[HKQuantityTypeIdentifierBodyMass,
                                             HKQuantityTypeIdentifierHeight,
                                             HKQuantityTypeIdentifierBodyMassIndex,
                                             HKQuantityTypeIdentifierBodyFatPercentage,
                                             HKQuantityTypeIdentifierLeanBodyMass];

    for (NSString *identifier in quantityTypesUsedInApp) {

        HKQuantityType *sampleType = [HKQuantityType quantityTypeForIdentifier:identifier];
        NSSet *requestSampleUnit = [NSSet setWithObject:sampleType];

        [self.healthKitStore preferredUnitsForQuantityTypes:requestSampleUnit completion:^(NSDictionary *preferredUnits, NSError *error) {

            if (!error) {

                HKUnit *unit = [preferredUnits objectForKey:sampleType];
                NSLog(@"%@ : %@", sampleType.identifier, unit.unitString);
                //sampleType enabled for read

            } else {

                switch (error.code) {
                    case 5:

                        NSLog(@"%@ access denied", sampleType.identifier);
                       //sampleType denied for read
                        break;

                    default:
                        NSLog(@"request preffered quantity types error: %@", error);
                        break;
                }


            }

        }];

    }

1
遗憾的是,在iOS 10中这个技巧不再起作用了。即使对于给定的数量类型被拒绝了权限,它也会返回一个正确的HKUnit而不是错误。 - sobri
只有在读取的关键信息从未请求授权时,此方法才有效。但是,如果已经请求了读取授权,无论是否被允许,都不会出现错误代码5。 - Sayalee Pote

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接