iPhone - 我该如何检测 iPhone 的版本?

12

如何检测用户是否在iPhone 4或3G/3GS上运行应用程序?

我需要检测硬件,而不是iOS版本。

感谢任何帮助。


您可以在UIDevice上调用currentDevice,并查看model属性。编辑:尽管文档建议这不包括确切的型号编号。 - Joost Schuur
3个回答

11

可以放心使用这个类 - 我在这里找到它。

用法

UIDeviceHardware *h=[[UIDeviceHardware alloc] init];
[self setDeviceModel:[h platformString]];   
[h release];

UIDeviceHardware.h

//
//  UIDeviceHardware.h
//
//  Used to determine EXACT version of device software is running on.

#import <Foundation/Foundation.h>

@interface UIDeviceHardware : NSObject 

- (NSString *) platform;
- (NSString *) platformString;

@end

UIDeviceHardware.m

//
//  UIDeviceHardware.m
//
//  Used to determine EXACT version of device software is running on.

#import "UIDeviceHardware.h"
#include <sys/types.h>
#include <sys/sysctl.h>

@implementation UIDeviceHardware

- (NSString *) platform{
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *machine = malloc(size);
    sysctlbyname("hw.machine", machine, &size, NULL, 0);
    NSString *platform = [NSString stringWithCString:machine];
    free(machine);
    return platform;
}

- (NSString *) platformString{
    NSString *platform = [self platform];
    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:@"iPod1,1"])   return @"iPod Touch 1G";
    if ([platform isEqualToString:@"iPod2,1"])   return @"iPod Touch 2G";
    if ([platform isEqualToString:@"i386"])   return @"iPhone Simulator";
    return platform;
}

@end

1
比我的答案好多了,但是有人需要在 iPhone 4 上运行并查看该型号的机器字符串。我认为它可能是“iPhone3,1”。 - Joost Schuur
+1 很好的观点。我现在太累了,但我明天会尝试并发布结果——除非有人比我先完成。 - SeniorShizzle
我会使用hw.machine(和hw.model)。 iPhone1,1也被称为“原始iPhone”或“iPhone 2G”(非官方),而苹果公司列出了“iPod Touch第二代”和“iPod Touch第三代”,其中一个在此处缺失(可能是iPod2,2)。 - tc.
而iPad呢?这种方法无法检测到正确的模拟器版本。有什么线索吗? - Duck
这有点费力,但是http://www.everymac.com/列出了每个iOS设备的平台字符串。例如,iPod touch第四代的平台字符串可以在http://www.everymac.com/systems/apple/consumer_electronics/stats/ipod-touch-4th-gen-4g-facetime-specs.html找到。我没有找到一个按平台字符串索引的列表。 - westsider

6
#import <sys/utsname.h>

+ (NSString*)deviceModelName {

        struct utsname systemInfo;

        uname(&systemInfo);

        NSString *modelName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

        if([modelName isEqualToString:@"i386"]) {
            modelName = @"iPhone Simulator";
        }
        else if([modelName isEqualToString:@"iPhone1,1"]) {
            modelName = @"iPhone";
        }
        else if([modelName isEqualToString:@"iPhone1,2"]) {
            modelName = @"iPhone 3G";
        }
        else if([modelName isEqualToString:@"iPhone2,1"]) {
            modelName = @"iPhone 3GS";
        }
        else if([modelName isEqualToString:@"iPhone3,1"]) {
            modelName = @"iPhone 4";
        }
        else if([modelName isEqualToString:@"iPhone4,1"]) {
            modelName = @"iPhone 4S";
        }
        else if([modelName isEqualToString:@"iPod1,1"]) {
            modelName = @"iPod 1st Gen";
        }
        else if([modelName isEqualToString:@"iPod2,1"]) {
            modelName = @"iPod 2nd Gen";
        }
        else if([modelName isEqualToString:@"iPod3,1"]) {
            modelName = @"iPod 3rd Gen";
        }
        else if([modelName isEqualToString:@"iPad1,1"]) {
            modelName = @"iPad";
        }
        else if([modelName isEqualToString:@"iPad2,1"]) {
            modelName = @"iPad 2(WiFi)";
        }
        else if([modelName isEqualToString:@"iPad2,2"]) {
            modelName = @"iPad 2(GSM)";
        }
        else if([modelName isEqualToString:@"iPad2,3"]) {
            modelName = @"iPad 2(CDMA)";
        }

        return modelName;
    }

很简单...在最后一个“if else”之后,你可以添加else { modelName=@"iPhone 5";}。 - Vishnu Kumar. S
1
不要在 iPhone 5 上使用没有 ifelse。任何未知设备都会错误地回退到被称为 iPhone 5。 - kirb

1

您可以使用此代码来检测iPhone操作系统版本。 float version = [[[UIDevice currentDevice] systemVersion] floatValue];

if (version >= 3.0) {
    // Only executes on version 3 or above.
} 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接