2010-07-05 91 views
0

我需要检测用户是否正在使用iPhone 4,但我需要这个在模拟器上工作(因为苹果忘了我的国家,iPhone 4在这里没有迹象)。iPhone 4检测...在模拟器上

我发现这个 http://www.clintharris.net/2009/iphone-model-via-sysctlbyname/

但在模拟器上运行此不检测正确的版本。我的意思是,Xcode 3.2.3有两个模拟器(3G/3GS和4)。我期待的检测方法告诉我,我正在使用的正确版本......但相反,它告诉我“iPhone模拟器”...

有没有什么办法可以做到这一点? 谢谢。

+0

你需要什么检测到它呢? – kennytm 2010-07-05 14:22:05

+0

如果使用iPhone 3G/3GS或iPod Touch第二代,我有一些图像需要缩小比例。在其他所有情况下(iPhone 4或iPad),图像必须保持原始大小。在运行时我没有图像,我不得不即时检测设备。 – SpaceDog 2010-07-05 14:30:49

+0

可能模拟器实际上并不模拟这些零件。你必须在开发过程中用#ifdef或类似的东西来伪造它。 – 2010-07-05 15:07:04

回答

4

你不需要在你的情况下检测系统版本。

假设图像被命名为foo.png,那么你只需要添加

[UIImage imageNamed:@"foo.png"]加载图像。详情请参阅iPhone Application Programming Guide

+0

谢谢。我认为这是我的情况最好的方法! – SpaceDog 2010-07-05 15:59:17

+0

此外,我建议观看WWDC 2010视频会议134 - “为视网膜显示器优化您的iPhone应用程序”。所有这些在这里详细解释。 – 2010-07-05 17:27:14

-1

Mike,您可以通过使用预处理器指令知道用户是否正在使用iPhone 4。例如:

#ifdef __IPHONE_4_0 
    // Do some work for iPhone 4 device 
#else 
    // Do some work for non iPhone 4 device 
#endif 

我希望它能帮助你。

+0

编辑器会在ifdef开头删除#号,否则你需要添加一个#。 – Sebastian 2010-07-05 14:41:29

+0

谢谢,但这不会在运行时检测到设备。我需要检测是即时的,而不是预处理。 – SpaceDog 2010-07-05 14:54:23

0

@property (nonatomic, readonly, retain) NSString *systemVersion; 
// It equal to @"4.0" on iOS 4.0 

@property (nonatomic, readonly, retain) NSString *model; 
// Possible examples of model strings are @”iPhone” and @”iPod touch” 
类的UIDevice

+0

他不想检测软件版本,但要检测硬件版本。 – 2010-07-05 15:06:18

+0

好的,我现在看到... – nepo 2010-07-05 15:09:41

1

我认为最好是检查您需要的功能,而不是特定的设备。这当然是苹果推荐的,因为它可以在新设备滚动时为您提供保险!

在这种情况下,它会检查屏幕的大小,并使用它来确定是否需要缩放图像吗?

[[UIScreen mainScreen] bounds] 
+0

这不起作用了。 iPhone 4将报告480x320!苹果希望我们受苦。 – SpaceDog 2010-07-05 15:36:44

+0

嗯,这太吸引了:( – TheNextman 2010-07-05 15:38:17

+0

@Mike - 实际上,苹果公司是这样做的,所以我们不必完全重写我们现有的iPhone应用程序来支持新的显示器,而是在UIScreen和其他地方提供了一个扩展属性这表明坐标空间将如何缩放以适应新的高分辨率显示,以及用于高分辨率图像的@ 2x扩展,这些图像可以在幕后透明地交换它们,这很容易实现。 – 2010-07-05 17:25:07

1

硬件可用性与状态

如果硬件功能(例如, 陀螺仪)是 设备上不可用,调用相关 该功能启动方法不影响。您可以通过检查 适当的属性来确定硬件功能是否可用或可用 ;例如,对于 陀螺仪的数据,您可以检查陀螺仪的 值或陀螺仪的性能。

使用

@property(readonly, nonatomic, getter=isGyroAvailable) BOOL gyroAvailable 
类CMMotionManager

+2

这告诉他设备是否有陀螺仪,现在唯一一款带有陀螺仪的苹果设备是iPhone 4--但是明年,例如,当iPhone 5发布陀螺仪和不同形状的屏幕,需要他处理时图片不同?它似乎不是一个非常实用的解决方案... – TheNextman 2010-07-05 15:31:43

0

从埃里卡苏丹:

- (NSString *) platform 
{ 
    size_t size; 
    sysctlbyname("hw.machine", NULL, &size, NULL, 0); 
    char *machine = malloc(size); 
    sysctlbyname("hw.machine", machine, &size, NULL, 0); 
    /* 
    Possible values: 
    "iPhone1,1" = iPhone 1G 
    "iPhone1,2" = iPhone 3G 
    "iPhone2,1" = iPhone 3GS 
    "iPhone3,1" = iPhone 4 
    "iPod1,1" = iPod touch 1G 
    "iPod2,1" = iPod touch 2G 
    */ 
    NSString *platform = [NSString stringWithCString:machine]; 

    free(machine); 
    return platform; 
} 

或者,如果你只需要检测,如果它是一个高分辨率的屏幕,你可以使用:

UIScreen *screen = [UIScreen mainScreen]; 
BOOL isHighRes; 

if ([screen respondsToSelector:@selector(scale)]) { 
    isHighRes = ([screen scale] > 1); 
} else { 
    isHighRes = NO; 
}