2012-09-01 43 views
7

Estoy buscando una forma de detectar el dispositivo en el que se ejecuta mi aplicación. No estoy interesado en la versión de software. He buscado muchas preguntas, pero ninguno de ellos (sorprendentemente) cumplir con mis necesidades por razones siguientes:¿Cómo puedo detectar qué dispositivo iOS está usando mi usuario?

Solución 1:

NSString *deviceType = [UIDevice currentDevice].model; 

Esto no funciona porque me da simplemente "IPAD". Quiero saber si se trata de iPad, iPad 2, nuevo iPad, el iPhone 3GS, iPhone4 etc.

Solución 2: No prueba para el tipo de dispositivo, la comprobación de las capacidades individuales

Esto no se aplica porque desea que estos datos recopilen estadísticas de los usuarios, no para realizar ninguna operación específica del dispositivo.

Solución 3: Uso de UIDeviceHardware encontró here

Este código es bastante anticuado y parece tener acceso a los datos privados en el dispositivo. Incluso se debate si una aplicación que usa esto será aprobada o no. Más importante aún, no tengo idea de cómo funciona :) También se encuentra una alternativa here

¿Alguno de los dos últimos que mencioné es seguro de usar? ¿Son compatibles en el futuro? ¿Cumplen con las reglas de aprobación de Apple?

¿O hay algún otro método para evitar esto?

Gracias de antemano.

Respuesta

6

Apple usa una API como esta en el código de muestra. Para citar el proyecto LargeImageDownsizing ejemplo, en el archivo LargeImageDownsizingViewController.m comenzando con la línea 83:

La elección apropiada resultante tamaño de la imagen y el tamaño del azulejo se puede hacer, pero se deja como ejercicio para el desarrollador. Tenga en cuenta que el dispositivo tipo/cadena de versión (p."IPhone2,1" se puede determinar en tiempo de ejecución a través del uso de la función 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 en mi caso sería iPod4,1 para un iPod touch 4ª generación.

Este código es lo que está en la raíz de ambos ejemplos de Github que ha publicado.

+0

Gracias. Ahora que sé que es seguro, lo incluí en mi proyecto y resolví el problema. –

1

Técnicamente, [UIDeviceHardware platform] debería funcionar bien y debe enviarlo a su servidor tal como está. También debe enviar la versión de iOS junto con la identificación de la plataforma para evitar problemas si la id de la plataforma cambiara en el SO futuro.

Porque la función sysctlbyname que se utiliza aquí está bien documentada, por lo que no creo que Apple pueda usar la regla número 2.5 en su contra. Sin embargo, todavía el número de la regla 17.1:

17.1 Las aplicaciones no pueden transmitir datos sobre un usuario sin necesidad de obtener permiso previo del usuario y proporciona al usuario acceso a información sobre cómo y dónde se utilizarán los datos

Es discutible si la plataforma del dispositivo es sobre un usuario o no. Mi consejo es que debes enviar la aplicación suponiendo que no estás violando el 17.1 y nunca mencionar eso. Es muy probable que el revisor no sepa qué está haciendo detrás de la escena.

+0

Gracias. Agregué los datos que recopilé y no los vinculé a un usuario, por lo que tampoco creo que vaya en contra de la regla 17.1. También estoy seguro de que ni siquiera lo notarán. –

0

El UIDeviceHardware que mencionaste es lo suficientemente bueno pero un poco desactualizado. Puede probar this Hecho más estilo manzana, por lo que pueden quererlo más.

Cuestiones relacionadas