即使 Apple Watch 屏幕关闭,也能访问锻炼数据
Posted
技术标签:
【中文标题】即使 Apple Watch 屏幕关闭,也能访问锻炼数据【英文标题】:Access workout data even when apple watch screen turn off 【发布时间】:2015-08-30 19:19:42 【问题描述】:我在 Apple Watch os 2 上成功地在没有锻炼会话的情况下实时获取心率数据。但是当 Apple Watch 屏幕关闭时,我的完成块不再被调用。我想继续实时管理这些数据,并在心率过低时让我的手机响铃。 也许我可以让 iphone perma 上的应用程序打开,也许它可以在锻炼期间访问 healthkit 数据? 你认为这行得通吗?还是你有别的想法?
问候
【问题讨论】:
您能否告诉我们您是如何在不进行锻炼的情况下实时获取心率数据的?您是否将代码放在手表套件扩展或视图控制器中?提前致谢。 我在下面的答案中解释了所有内容;)。在 iphone 应用程序(视图控制器)中,我执行了 HKAnchoredObjectQuery。我创建了一个 nstimer 来每 5 秒调用一次我的请求。 ios 9 有一个错误,当健康 iphone 应用程序打开时,请求不允许您获取最新的心率数据。在您的应用中请求这些数据之前,您需要先终止健康原生应用。 非常感谢您的回复。是否可以使用 HKWorkOutSession 获取心率? HKAnchoredObjectQuery 和 HKWorkOutSession 哪个更好连续获取心率? 心率数据未从我的 Apple Watch 存储在“健康”应用程序中。你能帮我解决这个问题吗? 您需要创建一个 HKWorkOutSession 并进行 HKAnchoredObjectQuery 以获取此锻炼会话生成的数据。你可以在这里看到我的接口控制器。我在我的 iphone 应用程序上使用几乎相同的 HKAnchoredObjectQuery 从 iphone 获取这些数据。尝试杀死健康应用并重新打开它,您应该会看到您的心率数据,但正如我所说,您需要杀死而不是重新打开此应用才能实时访问心率数据。 【参考方案1】:嘿,我找到了解决方案:
我将 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];
【讨论】:
iOS 端多久收到一次回调?因为对我来说,大约每 30 分钟左右一次……(所有样本都是在那段时间发生的)。有什么我可能会丢失的吗? @Arsene 你能用这种方法实时读取心率吗? @Licx 我可以每 5 秒获取一次心率。 @ArseneHuot 即使手表屏幕熄灭? 是的,只需尝试上面的查询。把它放在一个函数中,该函数将由循环中的 NSTimer 调用;)它可以工作,直到你停止锻炼,即使你的苹果手表屏幕熄灭(这是我提到的问题之一)但你需要保留你的 iPhone应用程序打开,您可以使用 [UIApplication sharedApplication].idleTimerDisabled = YES 轻松完成【参考方案2】:根据设计,手表屏幕关闭时不允许运行 watchOS 2 应用。您无法更改此行为。
【讨论】:
好吧,我就是这么想的。你认为我可以保持 iphone 应用程序打开并从我的 iphone 访问健康包数据吗(在锻炼期间)? 用户的手机可能在锻炼过程中被锁定,当设备被密码锁定时,HealthKit数据不可用。另请注意,手表中的 HealthKit 数据只会定期同步到手机,因此无论如何它都不能实时使用。 是的,但是打开 iphone 应用程序和 HKAnchoredObjectQuery 我成功地在我的 iphone 上实时获取心率数据(即使 Apple Watch 应用程序已关闭)。我遇到了同步问题,但是当我调用 [self.hkStore startQuery:heartRateQuery];它工作正常,我不知道为什么,但它似乎强制导入数据......我的答案中有更多细节;)以上是关于即使 Apple Watch 屏幕关闭,也能访问锻炼数据的主要内容,如果未能解决你的问题,请参考以下文章
尝试在屏幕关闭时让 Apple Watch 计时器应用程序在后台运行