Определите, является ли устройство iOS 32-или 64-разрядным
кто - нибудь знает простой способ узнать, имеет ли устройство iOS7 32-или 64-разрядное оборудование? Я не имею в виду программно, я просто имею в виду настройки, номер модели, стороннее приложение и т. д.
У меня проблема, которая, как я подозреваю, связана с 64-бит. Совет Apple-протестировать на 64-битном симуляторе, но также и на реальном 64-битном устройстве, но затем ничего не говорит о том, как это определить. Я могу написать тестовое приложение, чтобы проверить sizeof (int) или что-то еще, но должен быть какой-то способ для, скажем, технической поддержки, чтобы знать, с чем они работают.
Эрик
7 ответов
нет другого "официального" способа определить это. Вы можете определить его с помощью этого кода:
if (sizeof(void*) == 4) {
NSLog(@"32-bit App");
} else if (sizeof(void*) == 8) {
NSLog(@"64-bit App");
}
ниже is64bitHardware способ. Он возвращает YES, если оборудование является 64-разрядным оборудованием и работает на реальном устройстве iOS и в симуляторе iOS. Вот источник.
#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;
}
полностью непроверенный, но вы должны иметь возможность получить процессор через 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>
as:
#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.
}
}
Если вы компилируете с 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-битных.
можно использовать bitWidth
on 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
}
Я использую это в swift 4, не уверен, что это лучшее решение, но оно работает.
func getCPUArch()
{
#if arch(arm)
print("this is a 32bit system")
#elseif arch(arm64)
print("this is a 64bit system")
#endif
}
во время выполнения вы можете использовать что-то вроде этого
extension UIDevice {
static let is64Bit = MemoryLayout<Int>.size == MemoryLayout<Int64>.size
}