2015-07-21 12 views
5

Mam aplikację, w której próbuję zintegrować HealthKit i pobrać dane związane z etapami agregowane w ciągu dnia przy użyciu HKStatisticsCollectionQuery. Wymagane jest osobne pobieranie danych kroków tylko dla iPhone'a i urządzeń Apple Watch (bez usuwania duplikatów), które przyczyniły się do aplikacji zdrowia.Objective-C HealthKit określić, czy źródło pochodzi z Apple iPhone lub Apple Watch

Klasa HKSource eksponuje tylko następujące właściwości:

  • nazwa - nie może być stosowany jako użytkownik może zmienić na coś z tylko 'xxxx iPhone'
  • bundleIdentifier - dostarcza nam UUID urządzenia (unikalne na urządzenie, tak różne dla każdego iPhone/Watch), i wygląda na com.apple.health.UUID, oto co mówi dokumentacja Apple: "Dla aplikacji ta właściwość zawiera aplikację Identyfikator pakietu. W przypadku obsługiwanych urządzeń Bluetooth LE ta właściwość zawiera identyfikator UUID urządzenia. "

jestem w stanie wyciągnąć wszystkie źródła (za pomocą HKSourceQuery), które mają prefiks bundleIdentifier z«com.apple.health», ale jestem w stanie wywnioskować, co jest Apple iPhone kontra który jest iWatch firmy Apple .

czy ktoś przed obliczu podobnej sytuacji, i czy istnieje inny sposób, aby zidentyfikować, które źródło jest iPhone lub Apple Obserwować?

Każda pomoc będzie wielki! .thanks!

+0

W tej samej sytuacji. Coś w rodzaju statycznej metody zwracania iPhone'a "parentDevice" byłoby tutaj pomocne w Apple. – Wilmar

+0

Cześć Wilmar, zobacz moją odpowiedź poniżej. Znalazłem na razie obejście tego problemu. Proszę zaakceptować, jeśli odpowiedź jest wystarczająca. Dzięki. –

Odpowiedz

4

Nie najlepszy rozwiązanie, ale wymyśliłem sposób na odróżnienie być Tween zegarek i telefon stosując następujący proces:

zauważyłem, że wszystkie dane pochodzące z step iPhone/Watch mają następujący format bundleIdentifier:

com.apple.health.DeviceUUID

Pamiętaj, że ręcznie wprowadzane dane do aplikacji Zdrowie mają identyfikator pakietu com.apple.Health (z dużym "H").

Więc pierwszą rzeczą, dostać nazwę urządzenia do telefonu przy użyciu:

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

Następnie pobrać wszystkie źródła, dla których nie jest mecz przedrostek „com.apple.health” w bundleIdentifier. To powinno dać ci iPhone'a i zegarek Apple jako prawidłowe źródła i zignorować ręczne wpisy i wszystkie inne aplikacje.

Następnie sprawdź, czy nazwa urządzenia jest taka sama w źródle, a następnie w telefonie iPhone, inne źródło powinno być Apple Watch.

Oto kwerendy źródłowej próbki do pobierania źródeł:

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

Można teraz utworzyć orzecznik z każdego źródła danych pociągnij za pomocą klasy NSPredicate:

NSPredicate *sourcesPredicate = [HKQuery predicateForObjectsFromSource:source]; 

Zauważ, że mój pierwszy myślę, że pasuje do UUID, ale kiedy generuję UUID przy użyciu klasy NSUUID, nie pasuje on do tego, który jest obecny w identyfikatorze pakunku w wyciągniętych źródłach.

Możesz także zmienić nazwę telefonu na, co chcesz, automatycznie zaktualizuje się również w aplikacji Zdrowie.

Jak powiedziałem, nie jest to najlepsze rozwiązanie, ale działa dla mnie i jest to jedyny sposób, w jaki mogę to zrobić. Daj mi znać, jeśli udało Ci się znaleźć lepsze rozwiązanie. Dzięki.

Powiązane problemy