我有一个应用程序,我正在尝试整合HealthKit并使用HKStatisticsCollectionQuery提取白天汇总的步骤相关数据。要求是单独提取特定于iPhone和Apple Watch设备的步骤数据(无重复数据删除),这些数据对健康应用程序有所贡献。
HKSource 类仅公开以下属性:
我能够提取所有源码(使用HKSourceQuery),其中bundleIdentifier前缀为“com.apple.health”,但我无法推断哪一个是Apple iPhone,哪一个是Apple iWatch。
之前有没有人遇到类似的情况,有没有其他方法可以确定哪个来源是iPhone或Apple Watch?
任何帮助都会很棒!谢谢!
答案 0 :(得分:7)
不是最好的解决方案,但我已经找到了一种方法,可以使用以下过程来区分手表和手机:
我注意到来自iPhone / Watch的所有步骤数据都具有以下bundleIdentifier格式:
<强> com.apple.health.DeviceUUID 强>
请注意,在Health应用程序中手动输入的数据的包标识符为com.apple.Health(使用大写&#39; H&#39;)。
首先,请使用以下方法获取手机的设备名称:
NSString *deviceName = [[UIDevice currentDevice] name];
接下来,获取所有与&#39; com.apple.health&#39;前缀匹配的来源。在bundleIdentifier中。这应该为您提供iPhone和Apple手表作为有效来源,并忽略手动条目和所有其他应用程序。
接下来,检查设备的名称是否与源中的相同,然后是您的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应用程序中自动更新。
正如我所说,不是最好的解决方案,但对我有用,而且这是我能找到的唯一方法。如果您能找到更好的解决方案,请告诉我。感谢。