《iOS 6高级开发手册(第4版)》——1.4节秘诀:取回额外的设备信息

本节书摘来自异步社区《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章的文件夹。

上一篇:aix installp软件包管理工具


下一篇:《iOS 6高级开发手册(第4版)》——1.5节处理基本的方向