2012-09-01 10 views
7

Sto cercando un modo per rilevare il dispositivo su cui è in esecuzione la mia app. Non mi interessa la versione del software. Ho cercato molte domande, ma nessuno di loro (sorprendentemente) soddisfare i miei bisogni per le seguenti ragioni:Come posso rilevare quale dispositivo iOS sta usando il mio utente?

Soluzione 1:

NSString *deviceType = [UIDevice currentDevice].model; 

Questo non funziona perché mi dà solo "iPad". Voglio sapere se si tratta di iPad, iPad 2, nuovo iPad, iPhone 3GS, iPhone4 ecc

Soluzione 2: Non test per tipo di dispositivo, il controllo per le capacità individuali

Questo non si applica perché io desidera che questi dati raccolgano statistiche sugli utenti, non per eseguire operazioni specifiche del dispositivo.

Soluzione 3: Utilizzando UIDeviceHardware trovato here

Questo codice sembra piuttosto antiquato e sembra di accedere ai dati privati ​​sul dispositivo. C'è persino un dibattito sul fatto che un'app che usa questo verrà approvata o meno. Ancora più importante, non ho idea di come funziona :) Un'alternativa si trova anche here

Sono uno degli ultimi due che ho citato sicuro da usare? Sono conformi al futuro? Sono conformi alle regole di approvazione Apple?

Oppure c'è qualche altro metodo per aggirare questo?

Grazie in anticipo.

risposta

6

Apple utilizza tale API nel suo codice di esempio. Per citare il progetto di LargeImageDownsizing esempio, nel file LargeImageDownsizingViewController.m che inizia con la linea 83:

scelta appropriata risultante dimensioni dell'immagine e dimensioni del pannello può essere fatto, ma è lasciato come esercizio per lo sviluppatore. Si noti che la stringa di tipo/versione del dispositivo (ad es."IPhone2,1" può essere determinato in fase di esecuzione attraverso l'uso della funzione di sysctlbyname:

size_t size; 
sysctlbyname("hw.machine", NULL, &size, NULL, 0); 
char *machine = malloc(size); 
sysctlbyname("hw.machine", machine, &size, NULL, 0); 
NSString* _platform = [NSString stringWithCString:machine encoding:NSASCIIStringEncoding]; 
free(machine); 

_platform nel mio caso sarebbe iPod4,1 per un iPod touch 4th Gen.

Questo codice è ciò che è alla radice di entrambi gli esempi Github che hai pubblicato.

+0

Grazie. Ora che so che è sicuro, l'ho incluso nel mio progetto e risolto il problema. –

1

Tecnicamente, [UIDeviceHardware platform] dovrebbe funzionare correttamente ed è necessario inviarlo al server così com'è. Dovresti anche inviare la versione di iOS insieme all'ID della piattaforma per salvarti dai guai se l'id della piattaforma dovesse cambiare nel futuro sistema operativo.

Poiché la funzione sysctlbyname utilizzata qui è ben documentata, quindi non penso che Apple possa utilizzare la regola numero 2.5 contro di voi. Tuttavia, c'è ancora il numero della regola 17.1:

17.1 Apps non può trasmettere i dati su un utente senza ottenere la preventiva autorizzazione dell'utente e fornire all'utente l'accesso alle informazioni su come e dove verranno utilizzati i dati

È discutibile se la piattaforma del dispositivo riguarda o meno un utente. Il mio consiglio è di presentare l'app presumendo che non si stia violando il punto 17.1 e che non ne parli mai. È molto probabile che il revisore non sappia cosa stai facendo dietro la scena.

+0

Grazie. Sto aggregando i dati che raccolgo e non legandolo a un utente, quindi non penso che sia contro la regola 17.1. Sono anche sicuro che non se ne accorgeranno nemmeno. –

0

L'UIDeviceHardware che hai citato è abbastanza buono ma un po 'obsoleto. Puoi provare this Realizzato in più stile apple, quindi a loro piacerà di più.

Problemi correlati