2015-07-21 23 views
5

Tôi có một ứng dụng mà tôi đang cố gắng tích hợp HealthKit và kéo các bước liên quan đến dữ liệu được tổng hợp theo ngày bằng cách sử dụng HKStatisticsCollectionQuery. Yêu cầu là để kéo các bước dữ liệu cụ thể cho chỉ iPhone và Apple Watch thiết bị riêng biệt (không de-sao chép) đã góp phần vào các ứng dụng y tế.Objective-C HealthKit xác định xem nguồn từ Apple iPhone hay Apple Watch

Lớp HKSource chỉ làm lộ ra các thuộc tính sau:

  • tên - Không thể được sử dụng như người dùng có thể thay đổi điều này để bất cứ điều gì từ 'XXXX iPhone'
  • bundleIdentifier - Cung cấp chúng tôi UUID cho thiết bị (duy nhất cho mỗi thiết bị, rất khác nhau cho mỗi iPhone/Watch), và nó trông giống như com.apple.health.UUID, đây là những gì tài liệu Apple nói: "Đối với ứng dụng, tài sản này giữ ứng dụng Mã nhận dạng gói. Đối với các thiết bị Bluetooth LE được hỗ trợ, thuộc tính này giữ UUID cho thiết bị. "

tôi có thể kéo tất cả các nguồn (sử dụng một HKSourceQuery) mà có tiền tố bundleIdentifier của 'com.apple.health', nhưng tôi không thể suy ra đó là một chiếc iPhone của Apple so với đó là một iWatch của Apple .

có ai phải đối mặt với một tình huống tương tự trước đây, và có cách nào khác để xác định nguồn là một chiếc iPhone hoặc Apple Watch?

Bất kỳ trợ giúp sẽ là tuyệt vời! .Thanks!

+0

Trong cùng một tình huống. Một cái gì đó như 'parentDevice' phương pháp tĩnh để trả lại iPhone, sẽ là hữu ích ở đây từ Apple. – Wilmar

+0

Xin chào Wilmar, xin vui lòng xem câu trả lời của tôi dưới đây. Tôi tìm thấy một giải pháp cho bây giờ cho việc này. Vui lòng chấp nhận nếu câu trả lời đáp ứng nhu cầu của bạn. Cảm ơn. –

Trả lời

4

Không phải là tốt nhất nhưng tôi đã tìm ra cách để phân biệt Tween nó hồ và điện thoại bằng cách sử dụng quy trình sau:

tôi nhận thấy rằng tất cả dữ liệu bước đến từ iPhone/Watch có định dạng sau bundleIdentifier:

com.apple.health.DeviceUUID

Lưu ý rằng dữ liệu được nhập theo cách thủ công vào ứng dụng Sức khỏe có mã nhận dạng gói của com.apple.Health (với số vốn 'H').

Vì vậy, điều đầu tiên, lấy tên thiết bị cho các điện thoại sử dụng:

NSString *deviceName = [[UIDevice currentDevice] name]; 

Tiếp theo, lấy tất cả các nguồn mà có một trận đấu tiền tố của 'com.apple.health' trong bundleIdentifier. Điều này sẽ cung cấp cho bạn iPhone và đồng hồ Apple như các nguồn hợp lệ và bỏ qua các mục nhập thủ công và tất cả các ứng dụng khác.

Tiếp theo, kiểm tra xem tên của thiết bị có giống nhau trong nguồn, sau đó là iPhone của bạn, nguồn khác phải là Apple Watch của bạn.

Dưới đây là một truy vấn nguồn mẫu cho việc lấy các nguồn:

- (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]; 
} 

Bây giờ bạn có thể tạo ra một vị với từng nguồn cho dữ liệu của bạn kéo bằng cách sử dụng lớp NSPredicate:

NSPredicate *sourcesPredicate = [HKQuery predicateForObjectsFromSource:source]; 

Lưu ý rằng đầu tiên của tôi suy nghĩ là để phù hợp với UUID, nhưng khi tôi tạo ra một UUID bằng cách sử dụng lớp NSUUID, nó không phù hợp với một hiện diện trong bộ nhận dạng gói trong các nguồn được kéo.

Ngoài ra, bạn có thể thay đổi tên của điện thoại thành bất kỳ thứ gì bạn muốn, nó cũng sẽ tự động cập nhật trong ứng dụng Health.

Như tôi đã nói, không phải giải pháp tốt nhất nhưng phù hợp với tôi, và đó là cách duy nhất tôi có thể tìm thấy để làm điều này. Vui lòng cho tôi biết nếu bạn có thể tìm được giải pháp tốt hơn. Cảm ơn.

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