2015-07-21 15 views
5

Ho un'app in cui sto cercando di integrare HealthKit e di eseguire i passaggi relativi ai dati aggregati di giorno utilizzando HKStatisticsCollectionQuery. Il requisito è quello di estrarre i dati dei passaggi specifici per i dispositivi iPhone e Apple Watch separatamente (senza deduplicazione) che hanno contribuito all'app di salute.Objective-C HealthKit identifica se la fonte proviene da Apple iPhone o Apple Watch

La classe HKSource espone solo le seguenti proprietà:

  • nome - Non può essere utilizzato come l'utente può cambiare questo per qualsiasi cosa, da solo 'XXXX iPhone'
  • bundleIdentifier - fornisce noi l'UUID per il dispositivo (unico per dispositivo, così diverso per ogni iPhone/Watch), e sembra com.apple.health.UUID, ecco cosa dice la documentazione Apple: "Per le app, questa proprietà contiene l'app Identificatore del bundle. Per i dispositivi Bluetooth LE supportati, questa proprietà contiene un UUID per il dispositivo. "

Sono in grado di tirare tutte le fonti (utilizzando un HKSourceQuery) che hanno il prefisso bundleIdentifier di 'com.apple.health', ma sono in grado di dedurre che è un iPhone di Apple contro il che è un iWatch di Apple .

qualcuno ha affrontato una situazione simile prima, e c'è qualche altro modo per identificare quale sorgente è un orologio iPhone o Apple?

qualsiasi aiuto sarebbe grande! Grazie!

+0

Nella stessa situazione. Qualcosa come il metodo statico 'parentDevice' per restituire l'iPhone, sarebbe utile qui da Apple. – Wilmar

+0

Ciao Wilmar, per favore vedi la mia risposta qui sotto. Ho trovato una soluzione per ora per questo. Si prega di accettare se la risposta è sufficiente per il vostro bisogno. Grazie. –

risposta

4
Non

il migliore soluzione ma, ho trovato un modo per distinguere l'essere interpolare l'orologio e il telefono utilizzando il seguente processo:

ho notato che tutti i dati di movimentazione provenienti da iPhone/Guarda hanno il seguente formato bundleIdentifier:

com.apple.health.DeviceUUID

Tieni presente che i dati inseriti manualmente nell'app Salute hanno un identificatore di bundle di com.apple.Health (con una "H" maiuscola).

Quindi, prima cosa, ottenere il nome del dispositivo per il telefono utilizzando:

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

Avanti, prendere tutte le fonti per i quali esiste una corrispondenza prefisso 'com.apple.health' nel bundleIdentifier. Questo dovrebbe darti l'iPhone e l'Apple come fonti valide e ignorare le voci manuali e tutte le altre app.

Successivamente, controlla se il nome del dispositivo è lo stesso nella sorgente, quindi il tuo iPhone, l'altra fonte dovrebbe essere il tuo Apple Watch.

Ecco una query di origine di esempio per il recupero delle fonti:

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

È ora possibile creare un predicato con ogni fonte per i dati tirare utilizzando la classe NSPredicate:

NSPredicate *sourcesPredicate = [HKQuery predicateForObjectsFromSource:source]; 

Nota che il mio primo si pensava di far corrispondere l'UUID, ma quando genero un UUID usando la classe NSUUID, non corrisponde a quello presente nell'identificatore del bundle nelle sorgenti tirate.

Inoltre, è possibile modificare il nome del telefono in base alle proprie esigenze, verrà automaticamente aggiornato anche nell'app Salute.

Come ho già detto, non è la soluzione migliore ma funziona per me, ed è l'unico modo che ho potuto trovare per farlo. Per favore fatemi sapere se siete stati in grado di trovare una soluzione migliore. Grazie.

Problemi correlati