ios – Objective-C HealthKit可识别来自Apple iPhone或Apple Watch的来源

ios – Objective-C HealthKit可识别来自Apple iPhone或Apple Watch的来源,第1张

概述我有一个应用程序,我试图整合HealthKit并使用 HKStatisticsCollectionQuery提取白天汇总的步骤相关数据.要求是分别提取特定于iPhone和Apple Watch设备的步骤数据(无重复数据删除),这些数据有助于健康应用. HKSource类仅公开以下属性: >名称 – 无法使用,因为用户可以将此更改为“XXXX iPhone”中的任何内容 > bundleIdenti 我有一个应用程序,我试图整合HealthKit并使用 HKStatisticsCollectionQuery提取白天汇总的步骤相关数据.要求是分别提取特定于iPhone和Apple Watch设备的步骤数据(无重复数据删除),这些数据有助于健康应用.

HKSource类仅公开以下属性:

>名称 – 无法使用,因为用户可以将此更改为“XXXX iPhone”中的任何内容
> bundleIDentifIEr – 为我们提供设备的UUID(每个设备唯一,每个iPhone / Watch都不同),它看起来像com.apple.health.UUID,这是Apple文档所说的:“对于应用程序,此属性保留应用程序的软件包标识符.对于支持的蓝牙LE设备,此属性包含设备的UUID.“

我能够提取所有源码(使用HKSourcequery),其中bundleIDentifIEr前缀为“com.apple.health”,但我无法推断出哪个是Apple iPhone,哪个是Apple iWatch.

以前是否有人遇到类似的情况,有没有其他方法来确定哪个来源是iPhone或Apple Watch?

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

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

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

com.apple.health.DeviceUUID

请注意,在Health应用程序中手动输入的数据的包标识符为com.apple.Health(大写为“H”).

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

Nsstring *devicename = [[UIDevice currentDevice] name];

接下来,获取bundleIDentifIEr中前缀匹配为’com.apple.health’的所有源.这应该为您提供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应用程序中自动更新.

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

总结

以上是内存溢出为你收集整理的ios – Objective-C HealthKit可识别来自Apple iPhone或Apple Watch的来源全部内容,希望文章能够帮你解决ios – Objective-C HealthKit可识别来自Apple iPhone或Apple Watch的来源所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1075193.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存