¿Es posible detectar que su aplicación iOS se ejecuta en un iPad mini en tiempo de ejecución?

La detección de hardware diferente en tiempo de ejecución es útil para el análisis (entre otros, incluso para fines más cuestionables).

Muchos creadores de aplicaciones iOS pueden estar interesados ​​en saber cuántos usuarios están experimentando su aplicación en un iPad mini (en lugar de simplemente saber cuántos usuarios están experimentando su aplicación en un iPad con una resolución de pantalla de 1024×768, lo que también sería interesante).

¿Existe alguna API pública en Cocoa touch/UIKit/ObjC/C que pueda usarse para detectar que su aplicación iOS se ejecuta en un iPad mini en tiempo de ejecución? Idealmente, este método debería distinguir entre iPad 2 y iPad mini (que tienen el mismo número de píxeles, pero una densidad de píxeles diferente).


Escritura posterior: me doy cuenta de que mucha gente considerará detectar iPad mini en tiempo de ejecución una mala idea. Sin embargo, creo que esta es una pregunta válida con una respuesta definitiva de Sí o No. Una respuesta que creo que es útil que la comunidad sepa.

La respuesta de Boxel sería buena si no invoca un comportamiento indefinido y si no tiene partes superfluas. Uno, + [NSString stringWithCString:encoding:] requiere una cadena C, es decir, un puntero char terminado en NUL (de lo contrario, es muy probable que descargue núcleo). Además, no necesita la conversión a NSString , ya que sysctlbyname() proporciona una cadena C simple (sin el terminador NUL, por supuesto), puede usar strcmp() directamente para guardar algunas docenas de ciclos de CPU:

 #include  size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = malloc(size + 1); sysctlbyname("hw.machine", machine, &size, NULL, 0); machine[size] = 0; if (strcmp(machine, "iPad2,5") == 0) { /* iPad mini */ } free(machine); 

Editar: ahora esa respuesta también está arreglada.

Use sysctlbyname para obtener la cadena de plataforma, luego compárela con las cadenas de prefijo IPSW que se enumeran aquí . Parece que el único iPad Mini actualmente conocido es “iPad2,5”

Ejemplo:

 size_t size; sysctlbyname("hw.machine", NULL, &size, NULL, 0); char *machine = malloc(size + 1); sysctlbyname("hw.machine", machine, &size, NULL, 0); machine[size] = 0; if(strcmp(machine, "iPad2,5") == 0) { // do something special on the iPad Mini } free(machine); 

No existe una manera confiable y segura para detectar la densidad de píxeles del iPad mini. Otras respuestas sugieren mirar la cadena hw.machine . Pero no sabemos (a partir del momento en que escribo esto) cuáles serán las cadenas para los mini modelos celulares iPad (aunque podemos hacer una conjetura: iPad2,6 probablemente tendrá GSM y iPad2,7 probablemente tendrá CDMA) )

Está bien mirar la cadena hw.machine para análisis. Pero es peligroso dejar que afecte a la interfaz de usuario de su aplicación, porque incluso la cadena iPad2,5 para el iPad mini actual está sujeta a cambios.

Cuando salió el iPad 2, la cadena del modelo wifi fue iPad2,1 . Más tarde (cuando lanzaron el iPad 3), cambiaron el hardware del iPad 2 y cambiaron la cadena hw.machine a iPad2,4 , pero aún así la llamaron iPad 2. Lo mismo podría pasar con el iPad mini, o incluso con el iPad 2 otra vez! Por ejemplo, Apple podría lanzar otra versión del hardware del iPad 2 y darle la cadena de la máquina iPad2,8 .

importar CoreTelephony.framework. Pruebe esto en el dispositivo

 #import  #import  NSString* machineName() { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } 

Esto resuelve mi propósito hasta ahora. Pero como no tengo ningún iPad mini, no sé qué va a imprimir para iPad mini. ¿Podrías avisarme?