如何检测我的 iPhone 应用正在 iPad 上运行

3
我有一个OpenGL应用程序,RetinaDisplay模式(双倍缩放因子)下呈现效果更佳。我注意到iPad通过模拟低分辨率屏幕的iPhone应用程序来运行,这使得iPad无法受益于视网膜显示图形。
当我的iPhone应用程序在iPad上运行时,我想将比例因素加倍,以从Retina Display图形中受益。但似乎iPad真的很好地模仿了iPhone(如果它是一个Retina Display的话,那就太完美了…)
当我强制双倍比例时,在模拟器中工作得非常好(我没有iPad来测试)。
因此,我需要一种方法来知道我是否在iPad上运行,尽管许多事情告诉我它是旧的iPhone。
或者,也许我不应该尝试这样做?

是的,看起来很像,但那里没有找到好的答案。 - teupoui
开始认为这是苹果的错误... - teupoui
6个回答

21
如果该应用是在iPad上以模拟器模式运行的iPhone应用,则其userInterfaceIdiom为Phone,但型号类型为iPad。您可以使用以下代码进行检查:

如果该应用是在iPad上以模拟器模式运行的iPhone应用,则其userInterfaceIdiom为Phone,但型号类型为iPad。您可以使用以下代码进行检查:

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

只有当应用程序作为通用应用程序构建时,此功能才能正常工作。 - peetonn
3
我很高兴能为您服务。谢谢Michael。 - anders
2
and peetonn,他说的是一款非通用iPhone应用程序在iPad上以经典模式(1X / 2X)运行。 - anders
2
我想知道为什么这个答案没有被采纳,而那个与问题无关的答案却被采纳了。 - Rohan Sanap

20

如果您想为iPad制作自定义代码(最有可能是与自定义UI相关的方法),那么可以使用(如Apple所指示)存在于iOS 3.2及更高版本中的UI_USER_INTERFACE_IDIOM()方法。

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

这是苹果推荐的方法。


我认为这是最好的方法,但在这个例子中,它说“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
是的,你说得对,它只适用于iOS 3.2及以上版本 - 但是你可以测试它是否存在,如果不存在,你就知道它不是iPad或iPhone 4G,因为它们都配备了iOS 3.2+。如果它有响应,你可以获取iOS版本和IDIOM。 - shein
1
这是一个回答,针对那些想知道应用程序是否在iPad上运行的人,但它适用于原生运行在iPad上的通用应用程序。我想知道我的仅限于iPhone的应用程序是否在iPad上运行,以便切换到Retina显示图形,这是一个不好的想法。 - teupoui

1

在文档中查找,UIDevice:

例如像这样: NSString *system = [[UIDevice currentDevice] systemName];

然后通过使用 [system isEqualToString:@"iPad"] 来判断是否是 iPad。

UIDevice 是一个非常好的类,它还有像 multiTaskingSupported, systemVersion 等等的属性。简直就是喜欢 UIKit;)


1
我尝试了这个解决方案,但它无法检测到iPad。这就是为什么我说它非常好地模拟了iPhone:对于这个功能,它也假装自己是一个iPhone。 - teupoui

0

关于

这实际上只会告诉你应用程序是在模拟环境还是实际设备上运行,并不影响平台是iPad还是iPhone。

事实上,它在编译时就会告诉你编译的目标平台,因此在运行之前,你就知道并且可以采取必要的措施来处理特定的问题。

例如,我有不同的URL用于开发(在模拟器上运行)和生产使用,所以我会做一些像这样的事情

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

请注意,#define 是一个编译器指令,这意味着 URL 的值将在编译时确定,而不是在运行时确定。 - Mojtaba

0

我认为是这样的:

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

如果是模拟器

NSString *hello = @"你好,iOS 模拟器!";

否则

NSString *hello = @"你好,iOS 设备!";

结束条件编译

链接 苹果文档


抱歉,这只在iPad模拟器中有效,我正在寻找在iPad设备的iPhone模拟器中为真实的选项,我非常确定此标志不对应于那个选项...当然,我无法测试。 - teupoui
这实际上是一个预处理器宏。一旦编译应用程序,它将不会产生任何影响,这种宏在实际编译之前将被预处理器剥离。 - Blitz
这实际上只会告诉你应用程序是在模拟环境还是实际设备上运行,并不影响平台是iPad还是iPhone。 - WrightsCS

-4

如果是iPhone应用程序,那么只要它能运行在iPhone上,你就不应该能够区分它们之间的差异。如果你想针对iPad开发应用程序,那么你需要为iPad目标构建应用程序。


iPad可以运行任何iPhone应用程序,记住哦:P - Antwan van Houdt
苹果一直非常谨慎,确保应用程序能够即开即用的唯一方法是,如果它们无法从iPad获得与iPhone不同的返回内容,那么就没有办法。商店上有太多应用程序会测试硬件标识符/屏幕分辨率等其他边缘情况,苹果不敢冒险留下这些问题。 - MCannon
@Antwan 任何 iPhone 应用程序都可以在 iPad 上运行,但它是在模拟环境中。如果您想在 iPad 上进行任何不同的操作,必须为 iPad 构建应用程序...这是因为它需要运行任何 iPhone 应用程序,所以无法从 iPhone 构建中检测到它正在 iPad 上运行。 - MCannon
有没有其他为iPhone制作的应用程序在iPad上具有视网膜显示图形?如果我没记错,iPad是在iPhone宣布之前推出的,屏幕分辨率较低(尽管比iPhone 3gs高)。 - MCannon
@shein,这不是一个通用应用程序,而是一个 iPhone 应用。这就是为什么 iPad API 没有报告它是 iPad 的原因。如果它是一种通用应用程序,那么它就是针对 iPad 标头构建的,所以具有可用的信息。http://www.mattcannon.co.uk/ipadexample.png 显示了 iPhone 应用程序的运行方式。 - MCannon
显示剩余4条评论

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