如何将Apple Watch的传感器数据传输到iPhone?

时间:2015-04-06 02:21:56

标签: ios watchkit health-kit

有没有办法从Apple Watch获取传感器数据?例如,如何从Apple Watch连接并获取心率到我的应用程序?这些是我在我的应用中需要执行的步骤:

  1. 定义代表以从Apple Watch接收心率信息。
  2. 向Apple Watch请求定期发送数据
  3. 我知道它对其他人力资源监视器如何适用于BT。界面是否类似?或者应该依靠HealthKit来实现这一目标?

2 个答案:

答案 0 :(得分:4)

根据WatchKit FAQ on raywenderlich.com(滚动到“您可以通过手表应用程序访问手表上的心跳传感器和其他传感器吗?”),看起来好像您无法访问传感器数据。

  

没有。目前没有API可以访问硬件传感器   Apple Watch此时此刻。

答案 1 :(得分:3)

我已经制作了自己的锻炼应用程序(只是为了了解iWatch和iPhone之间的通信是如何工作的)。我目前正在通过以下方式获取心率信息。显然,这还没有经过测试,但是一旦你看看HealthKit框架是如何布局的,它就有意义了。

我们知道Apple Watch将通过蓝牙与iPhone通信。如果您阅读HealthKit文档的第一段,您将看到:

  

在iOS 8.0中,系统可以自动保存兼容的数据   蓝牙LE心率监测器直接进入HealthKit商店。

由于我们知道Apple Watch将是蓝牙设备且具有心率传感器,因此我将假设信息存储在HealthKit中。

所以我写了下面的代码:

- (void) retrieveMostRecentHeartRateSample: (HKHealthStore*) _healthStore completionHandler:(void (^)(HKQuantitySample*))completionHandler
{
    HKSampleType *_sampleType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
    NSPredicate *_predicate = [HKQuery predicateForSamplesWithStartDate:[NSDate distantPast] endDate:[NSDate new] options:HKQueryOptionNone];
    NSSortDescriptor *_sortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierStartDate ascending:NO];

    HKSampleQuery *_query = [[HKSampleQuery alloc] initWithSampleType:_sampleType predicate:_predicate limit:1 sortDescriptors:@[_sortDescriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error)
    {
        if (error)
        {
            NSLog(@"%@ An error has occured with the following description: %@", self, error.localizedDescription);
        }
        else
        {
            HKQuantitySample *mostRecentSample = [results objectAtIndex:0];
            completionHandler(mostRecentSample);
        }
    }];
    [_healthStore executeQuery:_query];
}

static HKObserverQuery *observeQuery;

- (void) startObservingForHeartRateSamples: (HKHealthStore*) _healthStore completionHandler:(void (^)(HKQuantitySample*))_myCompletionHandler
{
    HKSampleType *_sampleType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];

    if (observeQuery != nil)
        [_healthStore stopQuery:observeQuery];

    observeQuery = [[HKObserverQuery alloc] initWithSampleType:_sampleType predicate:nil updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error)
    {
        if (error)
        {
            NSLog(@"%@ An error has occured with the following description: %@", self, error.localizedDescription);
        }
        else

        {
            [self retrieveMostRecentHeartRateSample:_healthStore completionHandler:^(HKQuantitySample *sample)
             {
                 _myCompletionHandler(sample);
            }];

            // If you have subscribed for background updates you must call the completion handler here.
            // completionHandler();
        }
    }];
    [_healthStore executeQuery:observeQuery];
}

确保在取消分配屏幕后停止执行观察查询。