即使Apple Watch屏幕关闭,也可以访问运动数据

3
我成功地在Apple Watch OS 2上获取了实时心率数据,但当Apple Watch屏幕关闭时,我的完成块不再被调用。我希望能够继续管理这些实时数据,并在心率过低时让我的手机响起来。 也许我可以让iPhone上的应用程序一直打开,并且在此期间可以访问HealthKit数据? 你认为这可能有用吗?或者你有其他想法吗?
敬礼

请问您是如何在没有运动会话的情况下获取实时心率数据的?您是将代码放置在手表套件扩展或视图控制器中吗?提前致谢。 - Dhaval H. Nena
我的Apple Watch未能将心率数据存储在健康应用程序中。你可以帮我解决这个问题吗? - Dhaval H. Nena
你需要创建一个HKWorkOutSession并使用HKAnchoredObjectQuery来获取由此训练会话生成的数据。 你可以在这里看到我的接口控制器。我在我的iPhone应用程序上几乎使用相同的HKAnchoredObjectQuery来从iPhone获取这些数据。 尝试关闭健康应用程序并重新打开它,您应该能够看到您的心率数据,但是正如我所说,您需要关闭而不是重新打开此应用程序才能实时访问心率数据。 - Arsene Huot
嗨,Arsene,我确实尝试过那个,但每次都会出现“未确定授权”的错误。如果我放一个requestAuthorization块,那么我就永远不会得到成功的回调。你有遇到过这种问题吗? - Dhaval H. Nena
你需要在你的 iPhone 应用程序的 appDelegate 中实现 applicationShouldRequestHealthAuthorization。你可以在这里找到我的和我的接口控制器: https://www.dropbox.com/sh/rmd83xfiv3dxi94/AAAmuAoJfn49HOaTOkrLp_WBa?dl=0 - Arsene Huot
显示剩余8条评论
2个回答

3

嘿,我找到了一个解决方案:

我使用以下方法将 iPhone 应用程序保持在前台:

[UIApplication sharedApplication].idleTimerDisabled = YES

使用与Apple Watch相同的查询(HKAnchoredObjectQuery),我可以访问最新的健康数据。即使我的Apple Watch关闭了(在运动会话期间),我也可以获取实时心率数据。

  • 我的查询

HKQuantityType *type = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];

HKAnchoredObjectQuery *heartRateQuery = [[HKAnchoredObjectQuery alloc]
                                     initWithType:type
                                     predicate:nil
                                     anchor:self.anchor
                                     limit:HKObjectQueryNoLimit
                                     resultsHandler:^(HKAnchoredObjectQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable sampleObjects, NSArray<HKDeletedObject *> * _Nullable deletedObjects, HKQueryAnchor * _Nullable newAnchor, NSError * _Nullable error) {
                                         if (error) {

                                             // Perform proper error handling here...
                                             NSLog(@"*** An error occured while performing the anchored object query. %@ ***",
                                                   error.localizedDescription);

                                         }

                                         self.anchor = newAnchor;

                                         HKQuantitySample *sample = (HKQuantitySample *)[sampleObjects firstObject];
                                         if (sample) {
                                             double value = [sample.quantity doubleValueForUnit:[HKUnit unitFromString:@"count/min"]];

                                             dispatch_async(dispatch_get_main_queue(), ^(void){
                                                 self.heartrateLabel.text = [NSString stringWithFormat:@"%0.0f",value];
                                             });
                                             NSLog([NSString stringWithFormat:@"%0.0f",value]);
                                             [self.hkStore stopQuery:heartRateQuery];


                                         }
                                     }];

[self.hkStore executeQuery:heartRateQuery];


1
你在iOS端有多频繁地收到回调?因为对我来说,大约每30分钟左右才会收到一次(包括在此期间发生的所有样本)。我可能漏掉了什么吗? - Georg
@Arsene,使用这种方法你能实时读取心率吗? - Licx
@Licx 我可以每5秒获取一次心率。 - Arsene Huot
@ArseneHuot 即使手表屏幕关闭了,也能收到吗? - Licx
是的,只需尝试上面的查询。将其放入一个函数中,该函数将由循环中的NSTimer调用 ;) 即使您的Apple Watch屏幕关闭(这是我的一个问题),它也可以在您停止锻炼会话之前工作。 但是,您需要保持iPhone应用程序处于打开状态,并且可以使用[UIApplication sharedApplication].idleTimerDisabled = YES轻松完成。 - Arsene Huot
@Arsene Huot,您能否在这里发布WorkOut会话的代码? - yaali

0
根据设计,watchOS 2 应用程序在手表屏幕关闭时不允许运行。您无法更改此行为。

好的,那正是我所想的。 你认为我可以保持iPhone应用程序打开,并从我的iPhone访问健康包数据(在锻炼期间)吗? - Arsene Huot
在锻炼期间,用户的手机很可能会被锁定,在设备被密码锁定时无法使用HealthKit数据。另外需要注意的是,来自手表的HealthKit数据只会定期同步到手机上,因此无论如何都无法实时获取数据。 - Allan
是的,但是当我打开iPhone应用程序并使用HKAnchoredObjectQuery时,我成功地在我的iPhone上实时获取心率数据(即使Apple Watch应用程序关闭)。 我遇到了同步问题,但是当我调用[self.hkStore startQuery:heartRateQuery];时,它可以正常工作,我不太清楚为什么,但它似乎强制导入数据...更多细节请参见我的答案;) - Arsene Huot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接