2010-12-16 226 views
2

我有一个opengl应用程序,可以在RetinaDisplay模式下呈现更好的效果(双比例因子),并且我注意到iPad模拟了具有低分辨率屏幕(正常比例因子)的iPhone应用程序, 。如何检测我的iPhone应用程序正在iPad上运行

我想在iPad上运行我的iPhone应用程序时将比例因子加倍,以便从Retina Display图形中受益。但似乎iPad真的很好地假装成一个iPhone(这将是完美的,如果只有它是一个视网膜显示器一个...)

当我强制双倍规模,它工作得很好(至少在模拟器,我没有iPad来测试)。

所以我需要一种方法来知道我是否在iPad上运行,尽管许多事情告诉我它是一个旧的iPhone。

或者我不应该试图做到这一点?

+2

[检测兼容模式上iPad上运行iPhone应用程序(可能重复http://stackoverflow.com/questions/3242620/detecting-iphone-app-running-:可以用下面的代码检查这ipad-in-compatible-mode) – 2010-12-16 22:14:57

+0

是的,看起来非常像,但没有找到好的答案。 – teupoui 2010-12-16 22:31:38

+0

开始认为这是来自苹果的错误... – teupoui 2010-12-16 22:34:08

回答

-3

你不应该能够分辨出来,如果一个iPhone应用程序,那么远因为它可以告诉它在iPhone上运行。如果你想瞄准一个iPad,那么你需要为iPad目标构建它。

+0

一台iPad可以运行任何iPhone应用程序请记住:P – 2010-12-16 22:17:07

+0

恐怕你是对的MCannon ... – teupoui 2010-12-16 22:19:55

+0

苹果已经非常慎重对待这一点,确保应用程序可以用完的唯一方法是,如果没有他们可能会从iPad返回一些东西,以至于他们无法从iPhone中获得。在商店中有太多应用程序正在测试硬件标识符/屏幕显示其他边缘情况,以使苹果机会离开它。 – MCannon 2010-12-16 22:31:20

1

查找的文档中,的UIDevice:

例如是这样的: 的NSString *系统= [[的UIDevice currentDevice] SYSTEMNAME];

然后通过使用[system isEqualToString:@“iPad”]判断它是否是ipad。

的UIDevice是一个很不错的类,它也有这样的东西multiTaskingSupported,systemVersion等得爱的UIKit;)

+0

我试过这个解决方案,但它没有检测到iPad。这就是为什么我说它很好地模拟iPhone:它也假装成为这个功能的一个。 – teupoui 2010-12-16 22:19:13

0

我认为它是:

// Set hello to "Hello, <device or simulator>"! 

如果TARGET_IPHONE_SIMULATOR

的NSString *你好= @ “你好,iPhone模拟器!”; NSString * hello = @“你好,iOS设备!”;或者,

ENDIF

链接apple doc

+0

恐怕这只是有效的,因为我在iPad模拟器,我正在寻找在iPad设备的iPhone模拟器中会出现的问题,我很确定这个标记不会对应于此......但我当然无法测试。 – teupoui 2010-12-16 22:27:04

+0

这实际上是一个预处理器makro。编译应用程序后不会产生任何影响,这些类型的宏在预处理器进行实际编译之前会被删除。 – LordT 2010-12-16 23:34:18

+0

这实际上只会告诉您应用程序是在模拟环境中还是在实际设备上运行,并且不会影响平台是iPad还是iPhone。 – WrightsCS 2010-12-16 23:53:07

21

如果你正在寻找让自定义代码(最有可能的自定义用户界面相关的方法)的iPad只有这样,你可以使用(如苹果的指示)的UI_USER_INTERFACE_IDIOM()方法存在于iOS 3.2及更高版本

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
{ 
    // The device is an iPad running iPhone 3.2 or later. 
} 
else 
{ 
    // The device is an iPhone or iPod touch. 

} 

你可以在这里阅读更多http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/BuildTimeConfiguration/BuildTimeConfiguration.html

这是苹果公司推荐的方法

+0

我认为这是最好的方法,但是在这个例子中,它表示“3.2或更高”,这种方法不适用。这实际上是寻找接口习惯用法,它基本上是设备的屏幕大小,而不是iOS版本。 有关IDIOM的更多信息,请参阅:http://developer.apple。com/library/ios/documentation/UIKit/Reference/UIDevice_Class/Reference/UIDevice.html#// apple_ref/occ/instp/UIDevice/userInterfaceIdiom – WrightsCS 2010-12-16 23:50:56

+0

是的,你是对的,它只适用于iOS 3.2及更高版本 - 但你可以测试如果它存在,如果它不存在,你知道它不是iPad或iPhone 4G,因为它们随附iOS 3.2+,如果它确实响应,则可以同时获得iOS版本和IDIOM – shein 2010-12-17 00:05:18

+1

这对于那些想知道如果该应用程序在iPad上运行,但它适用于在iPad上本机运行的通用应用程序。我想知道,如果我的iPhone专用应用程序是在iPad上运行的,以便切换Retina Display图形,这是一个坏主意。 – teupoui 2010-12-17 11:13:18

0

这实际上只会告诉你,如果 的应用程序是在模拟 环境中运行,或者在实际设备上, 并且对是否没有影响 平台是iPad或iPhone。

事实上,它在编译时说明了您正在编译的平台的目标,因此在运行之前,您需要知道并且执行必要的操作来处理特定的问题。

比如我开发(在模拟器上运行)和生产使用diferent URL,所以我做一些喜欢

#if TARGET_IPHONE_SIMULATOR 
#define URL @"http://192.x.x.x/request" 
#else 
#define URL @"http://example.com/request" 
#endif 
+0

请注意,#define是一个编译器指令,意味着URL的值将在编译时确定,而不是在运行时确定。 – Mojtaba 2013-04-25 00:04:06

18

如果应用程序是在iPad在模拟器模式下运行一个iPhone应用程序,它将具有Phone的userInterfaceIdiom,但是是iPad的模型类型。

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone && 
    [[[UIDevice currentDevice] model] hasPrefix:@"iPad"]) { 
    // This app is an iPhone app running on an iPad 
} 
+0

只有当应用程序被构建为通用 – peetonn 2014-02-27 13:52:29

+2

时,这才能正常工作!感谢迈克尔 – anders 2014-04-15 14:10:28

+1

和peetonn,他说的是一个非经典iPhone(1X/2X)模式下的ipod – anders 2014-04-15 14:10:59

相关问题