2

我正在尝试从 Health App 中获取数据。特别是用户自己没有输入的数据。例如,我有一部 iPhone 6+,它记录了我所走的步数。还有一个选项可以手动添加数据;如果您手动添加数据,健康应用会将数据标记为“用户添加”。

这就是让我感到困惑的地方。假设我添加了 22 步数。当我使用 HKStatisticsQuery 查询数据时,谓词为

HKQuery.predicateForObjectsWithMetadataKey(HKMetadataKeyWasUserEntered, allowedValues: [true])

我得到了 22 步的正确结果,因为我将 allowedValues 设置为 true 并且我自己添加了这个。但是,当我尝试将 allowedValues 设置为 false 时,我没有得到任何结果

HKQuery.predicateForObjectsWithMetadataKey(HKMetadataKeyWasUserEntered, allowedValues: [false])

我确实在健康应用程序中有步骤数据,但它没有返回任何结果。

4

2 回答 2

1

检查以下可能的区域以修复它:

  1. 您是否授权您的应用程序从 HealthKit 访问 Steps 数据?
  2. 如果您在未使用 HealthKit 授权的情况下从您的应用程序中查询步数,那么 HealthKit 将不会返回任何异常,它只会返回从您的应用程序输入的步数(仅在可用时),否则返回nil
  3. authorizationStatusForType:在查询健康数据之前,请使用HKHealthStore 类提供的方法检查步数的授权状态。

更新1:

我对 wasUserEntered 键的观察是:

  1. 如果用户从 HEALTH 应用程序输入步数数据,则各自HKQuantitySamplemetadata字典与HKWasUserEntered键一起自动存储为TRUE
  2. 如果用户从 Apple 的 HEALTH 应用程序以外的其他应用程序输入步数数据,则相应的健康/健身设备或我们的应用程序应发送metadata带有键的字典HKWasUserEntered以及TRUE/FALSE的值。否则,该metadata属性将包含nil对象。 因此,Apple 不会对没有元数据的数据应用谓词(谓词包含元数据键)。

要调试此元数据,请尝试打印您的HKQuantitySampleObject.metadata

Apple 在元数据 Vs NSPredicate 上的实现:

  1. 如果从健康/健身设备观察到健康数据,HealthKit 不会将metadata字典添加到相应的健康记录中。
  2. 对于 Apple 健康应用程序以外的健康应用程序,开发人员应手动添加metadata字典以记录其健康数据。
  3. 如果没有metadata特定的健康记录并且NSPredicate对其有限制metadata,HealthKit 将完全忽略对此类记录的验证。

最后,

  1. 建议使用

    • (instancetype)quantitySampleWithType:(HKQuantityType *)quantityType 数量:(HKQuantity *)quantity startDate:(NSDate *)startDate endDate:(NSDate *)endDate 元数据:(NSDictionary *)元数据;

代替

+ (instancetype)quantitySampleWithType:(HKQuantityType *)quantityType
                              quantity:(HKQuantity *)quantity
                             startDate:(NSDate *)startDate
                               endDate:(NSDate *)endDate;

添加元数据。

  1. 向 Apple 报告此错误,谓词(包含metadata键)应应用于所有数据,而不管检查是否metadata存在。
于 2015-03-24T12:24:22.723 回答
1

已经有一段时间了,您现在可能已经解决了这个问题,但我认为值得在这里发布,以防其他人遇到同样的问题。

就像Bhanu提到的,Apple 自己创建的数据似乎没有将HKWasUserEntered条目作为其元数据的一部分。

但是 Apple 从来没有在他们的文档中声称要这样做,因此正确的查询应该是过滤出HKWasUserEntered == true 是否设置了该键的项目,但也会返回没有关联元数据的所有其他内容。

想法是metadataa Dictionarynil如果键不存在,则返回该类型。所以有三种可能的情况:

  • HKMetadataKeyWasUserEntered == nil
  • HKMetadataKeyWasUserEntered == false
  • HKMetadataKeyWasUserEntered == true

其中,您只想过滤掉最后一个,因为它明确告诉您输入了数据,但输入了用户。

这可以使用 on 的+ predicateForObjectsWithMetadataKey:operatorType:value:便捷方法来完成HKQuery,如下所示:

HKQuery.predicateForObjects(withMetadataKey: HKMetadataKeyWasUserEntered, operatorType: .notEqualTo, value: true)

但是,当然,您最初的问题是:“HKMetadataKeyWasUserEntered 是否损坏?”。而且我不相信它是,因为,如前所述,Apple 从未声称为自己的价值观编写该密钥。:)

于 2016-10-15T00:28:29.237 回答