判断iOS设备是32位还是64位

32
有没有一种简单的方法可以告诉我们iOS7设备是32位还是64位的硬件?我不是指编程方式,我只是指通过设置、型号编号、第三方应用等方式。
我遇到了一个问题,我怀疑与64位有关。苹果的建议是在64位模拟器上测试,但也要在实际的64位设备上进行测试,但是并没有说明如何确定这一点。我可以编写一个测试应用程序来检查sizeof(int)或其他内容,但必须有某种方式,比如技术支持知道他们正在使用什么。

2
你可以通过型号来了解。iPhone 5s、iPad mini Retina和iPad Air是64位的,其他型号则为32位。 - Marcelo
使用模型也是我得出的结论。我猜想,当两年后我试图弄清楚客户正在运行什么时(“让我们看看,5C是32位的吗?”),有了模型号就足够了。 - Eric McNeill
在运行时,您可以通过以下解决方案检测设备架构:https://dev59.com/_2Ij5IYBdhLWcg3wk182#47636895 - Andrei Pachtarou
7个回答

39

没有其他“官方”的方法来确定它。你可以使用这段代码来确定:

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

9
该代码检查应用程序是否以32位或64位模式运行,而不是硬件是否为32位或64位。 - Martin R
5
根据苹果公司的说法,当您为64位编译时,.ipa文件中包括32位和64位二进制文件。因此,如果该应用程序在64位模式下运行,则硬件是64位。 - Nikos M.
2
@NikosM:是的,但32位应用程序也可以在64位硬件上运行。(顺便说一句,我没有投反对票。) - Martin R
2
如果应用程序编译为32/64位“通用”二进制文件,则两个答案都可以使用,因为64位切片将在64位硬件上运行,而32位切片将在32位硬件上运行。我只是想指出sizeof(void *)#ifdef __LP64__由编译器决定,而不是由硬件决定。 - Martin R
@MartinR 完全正确,但另一种方法是检查设备型号,但每次苹果发布新设备时都必须更新代码。 - Nikos M.
显示剩余5条评论

10

下面是is64bitHardware方法。如果硬件是64位的,并且可以在真实的iOS设备和iOS模拟器上工作,则它将返回YES。这里有源代码

#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;
}

7
如果您复制完整的函数,请链接到您的来源 - DarkDust

9
完全没有测试过,但是您应该能够通过sysctl获取CPU,就像这样:
#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.
    }
}

6
如果你正在使用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

3
在运行时,您可以使用类似以下的内容。
extension UIDevice {
    static let is64Bit = MemoryLayout<Int>.size == MemoryLayout<Int64>.size
}

3

我在Swift 4中使用了这个方法,不确定它是否是最好的解决方案,但它有效。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接