HKMetadataKeyWasUserEntered损坏了吗?当健康应用程序中有数据时,我会一直变为零

时间:2015-03-22 16:50:56

标签: ios health-kit

我正在尝试从Health App获取数据。特别是用户没有自己输入的数据。例如,我有一个iPhone 6+记录了我采取的步骤数量。还可以手动添加数据;如果手动添加数据,运行状况应用程序会将数据标记为“添加用户”。

这让我感到困惑。假设我添加了22的步数。当我使用带有谓词

的HKStatisticsQuery查询数据时
HKQuery.predicateForObjectsWithMetadataKey(HKMetadataKeyWasUserEntered, allowedValues: [true])

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

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

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

2 个答案:

答案 0 :(得分:1)

检查以下可能的区域以进​​行修复:

  1. 您是否授权您的应用程序访问HealthKit的步骤数据?
  2. 如果您的应用程序的查询计数没有使用HealthKit进行授权,那么HealthKit将不会返回任何异常,只会返回从您的应用程序输入的步数(如果可用),否则返回nil。< / LI>
  3. 在查询健康数据之前,请使用HKHealthStore类提供的authorizationStatusForType:方法检查步骤计数的授权状态。
  4. 更新1:

    我对wasUserEntered键的观察是:

    1. 如果用户从HEALTH应用程序输入步骤数据,则相应的HKQuantitySample存储metadata字典以及HKWasUserEntered键自动 TRUE
    2. 如果用户从Apple的健康应用程序以外的地方输入步骤数据,相应的健康/健身设备或我们的应用程序应发送带有密钥metadata的{​​{1}}字典以及的值TRUE / FALSE 。否则,HKWasUserEntered属性将包含metadata对象。 因此,Apple没有对没有元数据的数据应用谓词(谓词包含元数据键)。
    3. 要调试此元数据,请尝试打印nil

      Apple在元数据方面的实施与NSPredicate相关:

      1. 如果从健康/健身设备观察到健康数据,HealthKit不会将HKQuantitySampleObject.metadata字典添加到相应的健康记录中。
      2. 如果使用Apple的Health应用程序以外的Health应用程序,开发人员应手动添加metadata字典作为其健康数据记录。
      3. 如果特定健康记录没有metadatametadataNSPredicate有约束,那么HealthKit完全无法验证此类记录。
      4. 最后,

        1. 建议使用

          • (instancetype)quantitySampleWithType:(HKQuantityType *)quantityType                           数量:(HKQuantity *)数量                          startDate:(NSDate *)startDate                            endDate:(NSDate *)endDate                           元数据:(NSDictionary *)元数据;
        2. 而不是

          metadata

          添加元数据。

          1. 报告Apple有关此错误的信息,谓词(包含+ (instancetype)quantitySampleWithType:(HKQuantityType *)quantityType quantity:(HKQuantity *)quantity startDate:(NSDate *)startDate endDate:(NSDate *)endDate; 密钥)应适用于所有数据,无论是否存在metadata检查。

答案 1 :(得分:1)

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

Bh​​anu 一样,Apple自己创建的数据似乎没有HKWasUserEntered条目作为其元数据的一部分。

但苹果从未声称在他们的文档中也是这样做的,所以正确的查询将过滤掉HKWasUserEntered == true 的项目,如果该键已设置,但也会回馈所有内容没有元数据关联的其他。

ideia是metadataDictionary,如果密钥不存在,该类型将返回nil。所以有三种可能的情况:

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

除此之外,您只想过滤掉最后一个,因为它明确告诉您输入的数据只是用户。

可以使用+ predicateForObjectsWithMetadataKey:operatorType:value:上的HKQuery便捷方法完成此操作,如下所示:

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

但当然,您最初的问题是:“HKMetadataKeyWasUserEntered是否已损坏?”。而且我不相信它,因为,就像提到的那样,Apple从未声称为自己的价值观写下这个关键。 :)