2015-10-28 26 views
5

Tôi đang viết một ứng dụng đơn giản để theo dõi nhịp tim (HKQuantityTypeIdentifierHeartRate) từ HealthKit bất cứ khi nào giá trị tỷ lệ sức khỏe mới được ghi vào HealthKit.Theo dõi nhịp tim từ HealthKit -> HKAnchoredObjectQuery chỉ được gọi sau applicationDidBecomeActive (BUG hoặc FEATURE?)

Như đã thấy tại WWDC2015 (phiên 203) Tôi đang sử dụng HKAnchoredObjectQuery nên hoạt động để thêm và xóa đối tượng. Bất cứ khi nào tôi khởi động ứng dụng, tôi đang gọi số HKQuery cho các đối tượng mới nhất và thực thiTrình đơn hoạt động tốt !!! Nhưng tôi không nhận được mẫu mới ngay cả khi các mẫu có ở đó, nhưng nếu tôi mang ứng dụng về phía sau và một lần nữa đến nền trước, tôi sẽ nhận được tất cả các nhịp tim mới. IS LÀ BUG? Hoặc tôi phải làm gì để theo dõi nhịp tim mà không mang ứng dụng đến mặt sau và tiền cảnh?

Đây là mã tôi đang sử dụng (tất cả mọi thứ được lưu trữ trong appdelegate), tôi kêu gọi [self requestAccessDataTypes]; từ didFinishLaunchingWithOptions:

[healthStore enableBackgroundDeliveryForType:sampleType frequency:HKUpdateFrequencyImmediate withCompletion:^(BOOL success, NSError *error) {}]; 

HKQuery *query = [self createHeartRateStreamingQuery:datum]; 
    if (query) { 
     [healthStore executeQuery:query]; 
    } 
    else 
    { 
     NSLog(@"workout can not start"); 
    } 

-(HKQuery*)createHeartRateStreamingQuery:(NSDate*)workoutStartDate 
{ 
    NSLog(@"%@ - createHeartRateStreamingQuery", [self class]); 

    if ([HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]) { 
     HKQuantityType *quantityType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; 

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

      if (!error) { 
       anchor = newAnchor; 
       [self updateHeartRate:sampleObjects]; 

      } 

     }]; 
     heartRateQuery.updateHandler = ^void(HKAnchoredObjectQuery *query, NSArray<__kindof HKSample *> * __nullable addedObjects, NSArray<HKDeletedObject *> * __nullable deletedObjects, HKQueryAnchor * __nullable newAnchor, NSError * __nullable error) 
     { 
      if (!error) { 
       anchor = newAnchor; 
       [self updateHeartRate:addedObjects]; 

      } 

     }; 
     return heartRateQuery; 
    } 
    return nil; 
} 

Trả lời

1

Ngay bây giờ (iOS 9.1, watchos 2.0 .1), không thể lấy dữ liệu mới nhất từ ​​HealthKit thông qua ứng dụng iOS. Có thể trong bản demo WWDC vì mã đang chạy trên ExtensionDelegate của ứng dụng WatchOS chứ không phải trên ứng dụng iOS. Có một báo cáo lỗi rdar nộp here.

Để nhận dữ liệu mới nhất trên iOS, không thể thực hiện mà không cần tạo ứng dụng WatchOS. Với ứng dụng WatchOS, bạn có thể sử dụng Workout SessionWatch Connectivity để gửi dữ liệu nhịp tim đến ứng dụng iOS mỗi lần thay đổi.

Tất nhiên, điều này không giúp ích nếu dữ liệu nhịp tim của bạn không đến từ Apple Watch. Hy vọng nó sẽ được sửa trong bản phát hành sắp tới.

+0

Cảm ơn bạn đã trả lời nhưng tôi đang sử dụng tự động chuyển dữ liệu HealthKit từ đồng hồ sang ứng dụng gốc và như tôi đã viết trong yêu cầu của tôi, dữ liệu được truyền ít nhiều trong thời gian thực! Bất cứ khi nào tôi bắt đầu ứng dụng tôi đang gọi HKQuery cho các đối tượng mới nhất và thực hiện truy vấn trên ỨNG DỤNG PHỤ HUYNH (ví dụ: iPhone) hoạt động tốt !!! Nhưng tôi không nhận được mẫu mới ngay cả khi các mẫu có ở đó, nhưng nếu tôi mang ứng dụng về phía sau và một lần nữa đến nền trước, tôi sẽ nhận được tất cả các nhịp tim mới. –

+1

Chắc chắn nó không phải là lý tưởng để phải đóng ứng dụng của bạn để có được những dữ liệu mới nhất? Tôi đã cố gắng để ám chỉ vấn đề này, và hy vọng Apple sẽ làm cho nó có thể để có được các dữ liệu khi nó vào HealthKit trên iOS mà không có cách giải quyết như thế này. –

0

Bạn đang thiếu một phần quan trọng để quan sát những thay đổi trong HealthKit. Nó được gọi là HKObserverQuery.

Docs

truy vấn Observer thiết lập một nhiệm vụ dài chạy trên một hàng đợi nền. Tác vụ này xem cửa hàng HealthKit và cảnh báo bạn bất cứ khi nào dữ liệu phù hợp được lưu vào hoặc xóa khỏi cửa hàng. Truy vấn Observer cho phép ứng dụng của bạn phản hồi các thay đổi được thực hiện bởi các ứng dụng và thiết bị khác.

Tóm tắt:

Bạn phải quấn HKAnchoredObjectQuery của bạn trong HKObserverQuery với giao nền kích hoạt để nhận được thông báo về bản cập nhật. Sau đó, bạn có thể thực hiện truy vấn của mình bất cứ khi nào điều đó xảy ra.

Lưu ý Trình xử lý cập nhật 1: HKObserverQuery sẽ KHÔNG cung cấp cho bạn bất kỳ mẫu dữ liệu Apple Health nào. Bạn vẫn phải thực hiện HKAnchoredObjectQuery của bạn với một neo thích hợp để có được các mẫu.

Lưu ý 2: Bạn phải thiết lập HKObserverQuery mỗi khi ứng dụng của bạn khởi chạy.

Để biết thêm thông tin, hãy xem câu trả lời của tôi here.

Các vấn đề liên quan