Подтвердить что ты не робот

Определите, является ли устройство iOS 32- или 64-разрядным

Кто-нибудь знает простой способ сказать, имеет ли устройство iOS7 32- или 64-битное оборудование? Я не имею в виду программно, я имею в виду только настройки, номер модели, стороннее приложение и т.д.

У меня возникла проблема, которая, как я подозреваю, связана с 64 бит. Совет Apple должен протестировать на 64-битном симуляторе, но также и на реальном 64-битном устройстве, но затем ничего не говорит о том, как это определить. Я могу написать тестовое приложение, чтобы проверить sizeof (int) или что-то еще, но для технической поддержки, возможно, существует определенная возможность узнать, с чем они работают.

Эрик

4b9b3361

Ответ 1

Нет другого "официального" способа его определения. Вы можете определить его с помощью этого кода:

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

Ответ 2

Ниже приведен метод is64bitHardware. Он возвращает ДА, если оборудование является 64-разрядным оборудованием и работает на реальном устройстве iOS и в iOS Simulator. Вот источник.

#include <mach/mach.h>

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

Ответ 3

Полностью непроверенный, но вы можете получить CPU через sysctl следующим образом:

#include <sys/types.h>
#include <sys/sysctl.h>
#include <mach/machine.h>

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.
    }
}

В iOS 7 SDK CPU_TYPE_ARM64 определяется в <mach/machine.h> как:

#define CPU_TYPE_ARM64          (CPU_TYPE_ARM | CPU_ARCH_ABI64)

По-другому выглядит:

#include <mach/mach_host.h>

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.
    }
}

Ответ 4

Если вы компилируете с помощью clang, существует другой способ: просто проверьте, не определено ли __arm__ или __arm64__.

Пример кода ниже не проверен, но он должен проиллюстрировать, что я имею в виду:

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

Обратите внимание, что это зависит от того, что текущие исполняемые файлы приложений iOS содержат как 32-битные, так и 64-битные двоичные файлы в одном контейнере, и они будут правильно выбраны в зависимости от того, поддерживает ли ваше приложение 64-разрядную версию.

Ответ 5

Во время выполнения вы можете использовать что-то вроде этого

extension UIDevice {
    static let is64Bit = MemoryLayout<Int>.size == MemoryLayout<Int64>.size
}

Ответ 7

Я использую это в swift 4, не уверен, что это лучшее решение, но оно работает.

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