使用 iOS SDK 和完整的 Cocoa Touch / Objective-C 代码确定用户的设备
我根据不同的来源编写了以下 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
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
I have written the following UIDevice category based on different sources. I've upgraded the platformCode
method so it's less low-level than can be seen.
This works perfectly, but the platformCode
method is low level. Do you know if this kind of call can be replaced with Cocoa Touch code? Here's the relevant code:
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
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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这可以被认为是一种“objective-c”方式:
这将是
utsname
machine
的 obj-c 版本(来自这一行:NSString* platform = [NSString stringWithCString:systemInfo.machine 编码:NSUTF8StringEncoding];
)。utsname
:UIDevice
类参考:但是,由于 systemName 只返回 @"iPhone OS",要获取实际的设备型号,您必须使用 C 代码。这是另一种方法:
This may be considered an "objective-c" way of doing it:
This would be obj-c version of
utsname
machine
(from this line:NSString* platform = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
).utsname
:UIDevice
Class Reference:But, since systemName only returns @"iPhone OS", to get the actual device model number, you have to use c code. Here's another way to do it:
您必须使用低级 C 调用来获取 infoString。出于我的目的,我编写了一个小型 Objective-C 库,它将其抽象出来并呈现一个 Objective-C 接口。
如果您愿意,可以在 github 上获取它: GBDeviceInfo
You'll have to use the low level C call to get the infoString. For my purposes I've written a tiny Objective-C library that abstracts this away and presents an Objective-C interface.
You can get it on github if you like: GBDeviceInfo