使用iOS SDK和完整的Cocoa Touch/Objective-C代码确定用户的设备

Oli*_*ver 8 iphone sdk ipod ipad ios

我根据不同的来源编写了以下UIDevice类别.我已经升级了这个platformCode方法,所以它的水平低于可以看到的水平.

这很好用,但platformCode方法很低.你知道这种电话是否可以用Cocoa Touch代码取代吗?这是相关的代码:

UIDevice_enhanced.h

@interface UIDevice (Enhanced)

typedef enum {
    kUnknownPlatform = 0,
    kiPhone1G,
    kiPhone3G,
    kiPhone3GS,
    kiPhone4,
    kiPhone4Verizon,
    kiPhone4S,
    kiPodTouch1G,
    kiPodTouch2G,
    kiPodTouch3G,
    kiPodTouch4G,
    kiPad,
    kiPad2Wifi,
    kiPad2GSM,
    kiPad2CMDA,
    kSimulator
} PlatformType;

- (NSString *) platformName;
- (PlatformType) platform;

@end
Run Code Online (Sandbox Code Playgroud)

UIDevice_enhanced.m

#import "UIDevice_enhanced.h"
#include <sys/utsname.h>

@interface UIDevice (Enhanced)
- (NSString *) platformCode;
@end 


@implementation UIDevice (Enhanced)

// Utility method (private)
- (NSString*) platformCode {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString* platform =  [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

    return platform;
}

// Public method to use
- (NSString*) platformName {
    NSString* platform = [self platformCode];

    if ([platform isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";
    if ([platform isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
    if ([platform isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
    if ([platform isEqualToString:@"iPhone3,1"])    return @"iPhone 4";
    if ([platform isEqualToString:@"iPhone3,2"])    return @"Verizon iPhone 4";
    if ([platform isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([platform isEqualToString:@"iPod1,1"])      return @"iPod Touch 1G";
    if ([platform isEqualToString:@"iPod2,1"])      return @"iPod Touch 2G";
    if ([platform isEqualToString:@"iPod3,1"])      return @"iPod Touch 3G";
    if ([platform isEqualToString:@"iPod4,1"])      return @"iPod Touch 4G";
    if ([platform isEqualToString:@"iPad1,1"])      return @"iPad";
    if ([platform isEqualToString:@"iPad2,1"])      return @"iPad 2 (WiFi)";
    if ([platform isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
    if ([platform isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([platform isEqualToString:@"i386"])         return @"Simulator";

    return platform;
}

// Public method to use
- (PlatformType) platform {
    NSString *platform = [self platformCode];
    if ([platform isEqualToString:@"iPhone1,1"])    return kiPhone1G;
    if ([platform isEqualToString:@"iPhone1,2"])    return kiPhone3G;
    if ([platform isEqualToString:@"iPhone2,1"])    return kiPhone3GS;
    if ([platform isEqualToString:@"iPhone3,1"])    return kiPhone4;
    if ([platform isEqualToString:@"iPhone3,2"])    return kiPhone4Verizon;
    if ([platform isEqualToString:@"iPhone4,1"])    return kiPhone4S;
    if ([platform isEqualToString:@"iPod1,1"])      return kiPodTouch1G;
    if ([platform isEqualToString:@"iPod2,1"])      return kiPodTouch2G;
    if ([platform isEqualToString:@"iPod3,1"])      return kiPodTouch3G;
    if ([platform isEqualToString:@"iPod4,1"])      return kiPodTouch4G;
    if ([platform isEqualToString:@"iPad1,1"])      return kiPad;
    if ([platform isEqualToString:@"iPad2,1"])      return kiPad2Wifi;
    if ([platform isEqualToString:@"iPad2,2"])      return kiPad2GSM;
    if ([platform isEqualToString:@"iPad2,3"])      return kiPad2CMDA;
    if ([platform isEqualToString:@"i386"])         return kSimulator;

    return kUnknownPlatform;
}

@end
Run Code Online (Sandbox Code Playgroud)

cho*_*own 2

这可以被认为是一种“objective-c”方式:

\n\n
// Utility method (private)\n- (NSString *)platformCode {\n    // This may or not be necessary \n    // Im not sure if you can have a device thats not currentDevice can you?\n    // if ([self isEqual:[UIDevice currentDevice]]) {\n\n\xc2\xa0 \xc2\xa0 NSString* platform = \xc2\xa0[[self.systemName copy] autorelease];\n\xc2\xa0 \xc2\xa0 return platform;\n\n    // Could probably shorten to just\n    // return [[self.systemName copy] autorelease];\n\n    // or - return [NSString stringWithString:self.systemName];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将是 obj-c 版本utsname machine(来自这一行:NSString* platform = \xc2\xa0[NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

\n\n

utsname:

\n\n
\n

<sys/utsname.h>头定义了结构体 utsname,其中至少包括以下成员:

\n\n

char sysname[]   操作系统的此实现的名称
\n char nodename[]依赖于实现的通信网络中的此节点的名称
\n char release[]   此实现的当前版本级别\n 此实现
char version[]   当前版本级别\n 发行版
\n char machine[]   硬件类型的名称\n 系统正在其上运行

\n
\n\n

UIDevice类参考

\n\n
\n

systemName接收方所代表的设备上运行的操作系统的名称。(只读)
\n @property (nonatomic, readonly, retain) NSString *system

\n
\n\n
\n\n

但是,由于 systemName 仅返回@“iPhone OS”,因此要获取实际的设备型号,您必须使用 c 代码。这是另一种方法:

\n\n
#include <sys/types.h>\n#include <sys/sysctl.h>\n\n- (NSString *)machine {\n     size_t size;\n\n    // Set \'oldp\' parameter to NULL to get the size of the data\n    // returned so we can allocate appropriate amount of space\n    sysctlbyname("hw.machine", NULL, &size, NULL, 0); \n\n    // Allocate the space to store name\n    char *name = malloc(size);\n\n    // Get the platform name\n    sysctlbyname("hw.machine", name, &size, NULL, 0);\n\n    // Place name into a string\n    NSString *machine = [NSString stringWithCString:name];\n\n    // Done with this\n    free(name);\n\n    return machine;\n}\n
Run Code Online (Sandbox Code Playgroud)\n