Update: The author of the device detection code has been identified! Max Horváth dropped me a note letting me know that this lovely little bit of code was written by him. He's got a great blog that often covers iPhone SDK material also.
Somebody asked me over Twitter for how to detect what device the code was running on. Since a tree fell in my backyard the other day, right on the telephone lines and taking out my internet service in the process, I was working on an iPhone, and trying to answer a question quickly.
In short, I gave a wrong answer. My apologies to anybody who relied on it.
Here's some code, written by
Max Horváth, that detects the device model correctly.
#import <sys/utsname.h>
enum {
MODEL_IPHONE_SIMULATOR,
MODEL_IPOD_TOUCH,
MODEL_IPHONE,
MODEL_IPHONE_3G
};
@interface DeviceDetection : NSObject
+ (uint) detectDevice;
+ (NSString *) returnDeviceName:(BOOL)ignoreSimulator;
@end
@implementation DeviceDetection
+ (uint) detectDevice {
NSString *model= [[UIDevice currentDevice] model];
NSString *iPodTouch = @"iPod Touch";
NSString *iPodTouchLowerCase = @"iPod touch";
NSString *iPodTouchShort = @"iPod";
NSString *iPhoneSimulator = @"iPhone Simulator";
uint detected;
if ([model compare:iPhoneSimulator] == NSOrderedSame) {
detected = MODEL_IPHONE_SIMULATOR;
} else if ([model compare:iPodTouch] == NSOrderedSame) {
detected = MODEL_IPOD_TOUCH;
} else if ([model compare:iPodTouchLowerCase] == NSOrderedSame) {
detected = MODEL_IPOD_TOUCH;
} else if ([model compare:iPodTouchShort] == NSOrderedSame) {
detected = MODEL_IPOD_TOUCH;
} else {
struct utsname u;
uname(&u);
if (!strcmp(u.machine, "iPhone1,1")) {
detected = MODEL_IPHONE;
} else {
detected = MODEL_IPHONE_3G;
}
}
return detected;
}
+ (NSString *) returnDeviceName:(BOOL)ignoreSimulator {
NSString *returnValue = @"Unknown";
switch ([DeviceDetection detectDevice]) {
case MODEL_IPHONE_SIMULATOR:
if (ignoreSimulator) {
returnValue = @"iPhone 3G";
} else {
returnValue = @"iPhone Simulator";
}
break;
case MODEL_IPOD_TOUCH:
returnValue = @"iPod Touch";
break;
case MODEL_IPHONE:
returnValue = @"iPhone";
break;
case MODEL_IPHONE_3G:
returnValue = @"iPhone 3G";
break;
default:
break;
}
return returnValue;
}
@end
8 comments:
Jeff, thanks for the code and all your efforts, I will check this code out and let you know. And as I asked the original question on Twitter, I will RT it. @yasir_ibrahim
Interesting info, Jeff. I am wondering if there is a way to differentiate between the first gen and second gen iPod touches.
Maybe the lower case and upper case "touch" is for that.
Just a note for something like this:
+ (NSString *) returnDeviceName:(BOOL)ignoreSimulator {
static NSString *returnValue = nil;
if( returnValue ) return returnValue;
returnvalue = @"unknown Device";
....
This is something I was looking for. Do you have an updated code to include the iPhone 3G S as well? I notice that some of my apps run differently on the iphone 3GS and I need to tweak the time interval between animation effects. Would be great if you can help :)
I have also started following you on twitter. I'm currently developing Apps in Malaysia and run a small company as well. If you are interested you could follow me on twitter @rajrmatblogger.
Thanks once again!
Thanks for the info.
To detect the 3GS, it turns out this works:
if (!strcmp(u.machine, "iPhone2,1")
Stupid question here, relatively new to Objective-C:
How do I call on the returned value from this code?
scrub m65 kamagra attorney lawyer body scrub field jacket lovegra marijuana attorney injury lawyer
Post a Comment