Determine si el dispositivo iOS tiene 32 o 64 bits

¿Alguien sabe de una manera fácil de decir si un dispositivo iOS7 tiene hardware de 32 o 64 bits? No me refiero a la progtwigción, me refiero a la configuración, el número de modelo, la aplicación de terceros, etc.

Tengo un problema que sospecho que está relacionado con 64 bits. El consejo de Apple es probar en el simulador de 64 bits pero también en un dispositivo real de 64 bits, pero luego no dice nada sobre cómo determinarlo. Puedo escribir una aplicación de prueba para verificar sizeof (int) o lo que sea, pero debe haber alguna forma de, por ejemplo, soporte técnico para saber con qué están trabajando.

Eric

No hay otra forma “oficial” de determinarlo. Puedes determinarlo usando este código:

if (sizeof(void*) == 4) { NSLog(@"32-bit App"); } else if (sizeof(void*) == 8) { NSLog(@"64-bit App"); } 

A continuación se muestra el método is64bitHardware. Devuelve SÍ si el hardware es un hardware de 64 bits y funciona en un dispositivo iOS real y en un simulador de iOS. Aquí está la fuente .

 #include  + (BOOL) is64bitHardware { #if __LP64__ // The app has been compiled for 64-bit intel and runs as 64-bit intel return YES; #endif // Use some static variables to avoid performing the tasks several times. static BOOL sHardwareChecked = NO; static BOOL sIs64bitHardware = NO; if(!sHardwareChecked) { sHardwareChecked = YES; #if TARGET_IPHONE_SIMULATOR // The app was compiled as 32-bit for the iOS Simulator. // We check if the Simulator is a 32-bit or 64-bit simulator using the function is64bitSimulator() // See http://blog.timac.org/?p=886 sIs64bitHardware = is64bitSimulator(); #else // The app runs on a real iOS device: ask the kernel for the host info. struct host_basic_info host_basic_info; unsigned int count; kern_return_t returnValue = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)(&host_basic_info), &count); if(returnValue != KERN_SUCCESS) { sIs64bitHardware = NO; } sIs64bitHardware = (host_basic_info.cpu_type == CPU_TYPE_ARM64); #endif // TARGET_IPHONE_SIMULATOR } return sIs64bitHardware; } 

Totalmente no probado, pero deberías ser capaz de obtener la CPU a través de sysctl esta manera:

 #include  #include  #include  void foo() { size_t size; cpu_type_t type; size = sizeof(type); sysctlbyname("hw.cputype", &type, &size, NULL, 0); if (type == CPU_TYPE_ARM64) { // ARM 64-bit CPU } else if (type == CPU_TYPE_ARM) { // ARM 32-bit CPU } else { // Something else. } } 

En iOS 7 SDK, CPU_TYPE_ARM64 se define en como:

 #define CPU_TYPE_ARM64 (CPU_TYPE_ARM | CPU_ARCH_ABI64) 

Una forma diferente parece ser:

 #include  void foo() { host_basic_info_data_t hostInfo; mach_msg_type_number_t infoCount; infoCount = HOST_BASIC_INFO_COUNT; host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, &infoCount); if (hostInfo.cpu_type == CPU_TYPE_ARM64) { // ARM 64-bit CPU } else if (hostInfo.cpu_type == CPU_TYPE_ARM) { // ARM 32-bit CPU } else { // Something else. } } 

Si está comstackndo con clang, hay otra manera: simplemente verifique si __arm__ o __arm64__ está definido.

El código de ejemplo siguiente no está probado, pero debe ilustrar lo que quiero decir con eso:

 #if defined(__arm__) NSLog(@"32-bit App"); #elif defined(__arm64__) NSLog(@"64-bit App"); #else NSLog(@"Not running ARM"); #endif 

Tenga en cuenta que esto se basa en el hecho de que los binarios de aplicaciones actuales de iOS contienen binarios de 32 bits y de 64 bits en un único contenedor y se seleccionarán correctamente dependiendo de si su aplicación admite la ejecución de 64 bits.

Puede usar bitWidth en Int https://developer.apple.com/documentation/swift/int/2885648-bitwidth

 static var is32Bit: Bool { return Int.bitWidth == 32 } static var is64Bit: Bool { return Int.bitWidth == 64 } 

Utilizo esto en swift 4, no estoy seguro de si es la mejor solución, pero funciona.

  func getCPUArch() { #if arch(arm) print("this is a 32bit system") #elseif arch(arm64) print("this is a 64bit system") #endif } 

En tiempo de ejecución puedes usar algo como esto

 extension UIDevice { static let is64Bit = MemoryLayout.size == MemoryLayout.size }