Objective-C HealthKit 识别来源是来自 Apple iPhone 还是 Apple Watch

Posted

技术标签:

【中文标题】Objective-C HealthKit 识别来源是来自 Apple iPhone 还是 Apple Watch【英文标题】:Objective-C HealthKit identify if source is from Apple iPhone or Apple Watch 【发布时间】:2015-07-21 15:08:23 【问题描述】:

我有一个应用程序,我正在尝试集成 HealthKit 并使用 HKStatisticsCollectionQuery 提取按天汇总的步骤相关数据。要求是单独提取特定于 iPhone 和 Apple Watch 设备的步骤数据(无重复数据删除),这些数据对健康应用程序有贡献。

HKSource 类仅公开以下属性:

name - 不能使用,因为用户可以将其更改为任何内容,例如“XXXX iPhone” bundleIdentifier - 为我们提供设备的 UUID(每个设备唯一,每个 iPhone/Watch 都不同),它看起来像 com.apple.health.UUID,这是 Apple 文档所说的:“ 对于应用,此属性保存应用的捆绑标识符。对于支持的蓝牙 LE 设备,此属性保存设备的 UUID。"

我能够提取具有“com.apple.health”的 bundleIdentifier 前缀的所有源(使用 HKSourceQuery),但无法推断出哪个是 Apple iPhone 而哪个是 Apple iWatch。

之前有没有人遇到过类似的情况,有没有其他方法可以识别哪个来源是 iPhone 或 Apple Watch?

任何帮助都会很棒!谢谢!

【问题讨论】:

同样的情况。类似parentDevice 静态方法返回 iPhone,这对 Apple 会有所帮助。 您好 Wilmar,请在下面查看我的回答。我现在找到了解决方法。如果答案满足您的需要,请接受。谢谢。 【参考方案1】:

不是最好的解决方案,但我想出了一种方法来区分手表和手机,使用以下过程:

我注意到来自 iPhone/Watch 的所有步数数据都具有以下 bundleIdentifier 格式:

com.apple.health.DeviceUUID

请注意,手动输入到 Health 应用程序的数据具有 com.apple.Health 的捆绑标识符(带有大写的“H”)。

所以,首先,使用以下方法获取手机的设备名称:

NSString *deviceName = [[UIDevice currentDevice] name];

接下来,获取 bundleIdentifier 中前缀匹配“com.apple.health”的所有源。这应该为您提供 iPhone 和 Apple watch 作为有效来源,并忽略手动输入和所有其他应用程序。

接下来,检查源中设备的名称是否相同,然后是你的 iPhone,另一个源应该是你的 Apple Watch。

这是获取源的示例源查询:

- (void)fetchSources 

    NSString *deviceName = [[UIDevice currentDevice] name];
    NSMutableArray *dataSources = [[NSMutableArray alloc] init];
    HKQuantityType *stepsCount = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
    HKSourceQuery *sourceQuery = [[HKSourceQuery alloc] initWithSampleType:stepsCount
                                                           samplePredicate:nil
                                                         completionHandler:^(HKSourceQuery *query, NSSet *sources, NSError *error)
                                                         
                                                             for (HKSource *source in sources)
                                                             
                                                                  if ([source.bundleIdentifier hasPrefix:sourceIdentifier])
                                                                 

                                                                     if ([source.name isEqualToString:deviceName])
                                                                        // Iphone
                                                                     else
                                                                       // Apple Watch
                                                                     [dataSources addObject:source];
                                                                 
                                                             
                                                         ];
    [self.healthStore executeQuery:sourceQuery];

您现在可以使用 NSPredicate 类为您的数据拉取的每个源创建一个谓词:

NSPredicate *sourcesPredicate = [HKQuery predicateForObjectsFromSource:source];

请注意,我的第一个想法是匹配 UUID,但是当我使用 NSUUID 类生成 UUID 时,它与提取的源中的包标识符中存在的 UUID 不匹配。

此外,您可以将手机名称更改为您想要的任何名称,它也会在“健康”应用中自动更新。

正如我所说,这不是最好的解决方案,但对我有用,这是我能找到的唯一方法。如果您能找到更好的解决方案,请告诉我。谢谢。

【讨论】:

你的回答可以得到一个设备。在 Health 应用中列出设备(如 Sources 选项卡项)怎么样?你有什么解决办法吗? @SiNguyen 不幸的是,当时我无法弄清楚这一点。但我知道如果我没记错的话,有计划在 ios 9 中提供更多设备特定信息。您是否查看了官方文档以查看是否添加了任何新床?干杯。 @SiNguyen 这个怎么样:developer.apple.com/documentation/healthkit/hkobject/… 我找到了,但我不知道查询是什么:( 另一种使用来源的方法是添加 .separateBySource HKStatisticsOptions,然后读取该特定来源的 sumQuantity。有关详细信息,请参阅devfright.com/how-to-use-the-hkstatisticscollectionquery。

以上是关于Objective-C HealthKit 识别来源是来自 Apple iPhone 还是 Apple Watch的主要内容,如果未能解决你的问题,请参考以下文章

Apple watch HealthKit - 无法识别的选择器 HKHealthStore startWorkoutSession:completion:

Apple watch HealthKit - 无法识别的选择器 HKHealthStore startWorkoutSession:completion:

用简单的图像识别来实现自动玩微信 “跳一跳” 小游戏

Span 抽取和元学习能碰撞出怎样的新火花,小样本实体识别来告诉你!

调用本机模块会引发“无法识别的 objc 方法”错误

调用本机模块会引发“无法识别的 objc 方法”错误