本节书摘来自异步社区《iOS 6高级开发手册(第4版)》一书中的第1章,第1.4节秘诀:取回额外的设备信息,作者 【美】Erica Sadun,更多章节内容可以访问云栖社区“异步社区”公众号查看
1.4 秘诀:取回额外的设备信息
iOS 6高级开发手册(第4版)
sysctl()和sysctlbyname()允许获取系统信息。这些标准的UNIX函数用于询问操作系统有关硬件和OS的详细信息。看一眼Macintosh上的/usr/include/sys/sysctl.h包括文件,就能对所提供的范围类型有一个感觉。在那里,能够找到一份可以用作这些函数的参数常量的详尽列表。
这些常量使你能够检查核心信息,比如系统的CPU频率、可用的内存量等。秘诀1-2演示了这种功能。它引入了一个UIDevice类,用于收集系统信息,并通过一系列方法调用返回它。
你可能想知道:当标准的UIDevice类可以根据需要返回设备型号时,为什么这个类还要包括一个平台方法。答案在于区分不同的单元类型。
iPhone 3GS的型号只是“iPhone”,iPhone 4S也是一样。与之相反,这个秘诀为3GS返回的平台值是“iPhone2,1”,为iPhone 4S返回的是“iPhone 4,1”。这允许以编程方式把3GS单元与第一代iPhone(“iPhone1,1”)或iPhone 3G(“iPhone1,2”)区分开。
每种型号都提供了独特的内置能力。准确知道你正在处理哪款iPhone有助于确定那个单元是否有可能支持诸如可访问性、GPS和磁力计之类的特性。
秘诀1-2 扩展设备信息收集
@implementation UIDevice (Hardware)
+ (NSString *) getSysInfoByName:(char *)typeSpecifier
{
// Recover sysctl information by name
size_t size;
sysctlbyname(typeSpecifier, NULL, &size, NULL, 0);
char *answer = malloc(size);
sysctlbyname(typeSpecifier, answer, &size, NULL, 0);
NSString *results = [NSString stringWithCString:answer
encoding: NSUTF8StringEncoding];
free(answer);
return results;
}
- (NSString *) platform
{
return [UIDevice getSysInfoByName:"hw.machine"];
}
- (NSUInteger) getSysInfo: (uint) typeSpecifier
{
size_t size = sizeof(int);
int results;
int mib[2] = {CTL_HW, typeSpecifier};
sysctl(mib, 2, &results, &size, NULL, 0);
return (NSUInteger) results;
}
- (NSUInteger) cpuFrequency
{
return [UIDevice getSysInfo:HW_CPU_FREQ];
}
- (NSUInteger) busFrequency
{
return [UIDevice getSysInfo:HW_BUS_FREQ];
}
- (NSUInteger) totalMemory
{
return [UIDevice getSysInfo:HW_PHYSMEM];
}
- (NSUInteger) userMemory
{
return [UIDevice getSysInfo:HW_USERMEM];
}
- (NSUInteger) maxSocketBufferSize
{
return [UIDevice getSysInfo:KIPC_MAXSOCKBUF];
}
@end
获取这个秘诀的代码
{要查找这个秘诀的完整示例项目,可以浏览https://github.com/erica/iOS-6-Advanced-Cookbook,并进入第1章的文件夹。