如果用户不允许某些条目类型,HealthKit 无法编写具有多个条目的 HKSample

Posted

技术标签:

【中文标题】如果用户不允许某些条目类型,HealthKit 无法编写具有多个条目的 HKSample【英文标题】:HealthKit unable to write HKSample with multiple entries if some of the entry types are disallowed by user 【发布时间】:2017-06-05 00:03:45 【问题描述】:

假设一个应用请求授权将脂肪和碳水化合物写入 HealthKit:

func dataTypesToWrite() -> NSSet 
    return NSSet(objects:
        HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.dietaryCarbohydrates)!,
        HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.dietaryFatTotal)!
    )


healthStore.requestAuthorization(toShare: dataTypesToWrite() as? Set<HKSampleType>, read: nil, completion:  (success, error) -> Void in
    if success 
        print("completed")
    
)

这将提示用户允许应用写入 HealthKit。如果用户允许同时写入脂肪和碳水化合物,一切都很好。但是,如果他们只选择允许,并且将含有脂肪和碳水化合物的 HKSample 写入 HealthKit,则该条目将不会显示:

func foodCorrelationForFoodItem(foodNutrients: Dictionary<String, Double>, foodTitle: String) -> HKCorrelation 
    let nowDate: Date = Date()

    let consumedSamples: Set<HKSample> = [
        HKQuantitySample(
            type: HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.dietaryCarbohydrates)!,
            quantity: HKQuantity(unit: HKUnit.gram(), doubleValue: 5.0),
            start: nowDate,
            end: nowDate),
        HKQuantitySample(
            type: HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.dietaryFatTotal)!,
            quantity: HKQuantity(unit: HKUnit.gram(), doubleValue: 10.0),
            start: nowDate,
            end: nowDate)
    ]

    let foodType: HKCorrelationType = HKCorrelationType.correlationType(forIdentifier: HKCorrelationTypeIdentifier.food)!
    let foodCorrelationMetadata: [String: AnyObject] = [HKMetadataKeyFoodType: foodTitle as AnyObject]

    let foodCorrelation: HKCorrelation = HKCorrelation(type: foodType, start: nowDate, end: nowDate, objects: consumedSamples, metadata: foodCorrelationMetadata)

    return foodCorrelation



self.healthStore.save(foodCorrelationForFoodItem)  (success, error) in
    if let error = error 
        print(error)
    

由于 Apple 不允许应用程序查看哪些 HealthKit 项目是可写的,因此无法检测例如是否可以写入。应该只写胖。有针对这个的解决方法吗?谢谢。

【问题讨论】:

【参考方案1】:

Apple 不允许应用查询它可以写入哪些 HealthKit 类型的说法是不正确的。您可能正在考虑读取授权,这是不可查询的。您可以在HKHealthStore 到determine whether your app has write authorization 上使用authorizationStatus(for:)。如果它返回notDeterminedsharingDenied,则您的应用没有授权。

【讨论】:

以上是关于如果用户不允许某些条目类型,HealthKit 无法编写具有多个条目的 HKSample的主要内容,如果未能解决你的问题,请参考以下文章

HealthKit HKAuthorizationStatus 用于读取数据

HealthKit HKAuthorizationStatus 用于读取数据

HealthKit:不允许读取 HKCorrelationType

HealthKit:不允许读取 HKCorrelationType

配置安全性以仅允许某些用户更新条目,但允许在 Backand 中读取所有用户

如何从 HealthKit 数据中获取最新的体重条目