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

Posted

技术标签:

【中文标题】如何检测我的 iPhone 应用程序正在 iPad 上运行【英文标题】:How to detect my iPhone app is being run on an iPad 【发布时间】:2010-12-16 22:06:44 【问题描述】:

我有一个 opengl 应用程序,它在 RetinaDisplay 模式(双倍比例因子)下呈现更好,我注意到 iPad 模拟了一个具有低分辨率屏幕的 iPhone 应用程序(正常比例因子)。

当我的 iPhone 应用在 iPad 上运行时,我想将比例因子加倍,以便从 Retina Display 图形中受益。但似乎 iPad 真的很好地伪装成 iPhone(如果它是 Retina Display 就完美了……)

当我强制使用双刻度时,它工作得很好(至少在模拟器中,我没有 iPad 来测试)。

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

或者我不应该尝试这样做?

【问题讨论】:

detecting iPhone app running on iPad in compatibility mode的可能重复 是的,看起来很像,但没有找到好的答案。 开始认为这是Apple的错误...... 【参考方案1】:

如果应用程序是在 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,他说的是在 ipad 上以经典 (1X / 2X) 模式运行的非通用 iPhone 应用程序 我想知道为什么这个不是被接受的答案,而没有解决问题的那个被接受了。【参考方案2】:

如果您只想为 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 的更多信息,请参阅:developer.apple.com/library/ios/documentation/UIKit/Reference/… 是的,您是对的,它仅适用于 iOS 3.2 及更高版本 - 但您可以测试它是否存在,如果不存在,您知道它不是 iPad 或 iPhone 4G,因为它们附带 iOS 3.2+如果它确实响应,您可以获得 iOS 版本和 IDIOM 对于那些想知道应用程序是否在 iPad 上运行的人来说,这是一个答案,但它适用于在 iPad 上本地运行的通用应用程序。我想知道我的仅限 iPhone 的应用程序是否在 iPad 上运行以打开 Retina Display 图形,这是个坏主意。【参考方案3】:

查看文档,UIDevice:

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

然后使用 [system isEqualToString:@"iPad"] 不管它是否是 ipad。

UIDevice 是一个非常不错的类,它也有 multiTaskingSupported、systemVersion 等内容。一定要喜欢 UIKit ;)

【讨论】:

我试过这个解决方案,但它没有检测到 iPad。这就是为什么我说它很好地模仿了 iPhone:它也假装是这个功能的一个。【参考方案4】:

我认为是这样的:

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

如果 TARGET_IPHONE_SIMULATOR

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

其他

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

endif

链接apple doc

【讨论】:

恐怕这只是有效的,因为我在 iPad 模拟器中,我正在寻找在 iPad 设备的 iPhone 模拟器中正确的东西,我很确定这个标志不会对应的...但是我当然不能测试。 这实际上是一个预处理器makro。一旦你编译了应用程序就不会产生任何影响,这些宏在预处理器进行实际编译之前被剥离。 这实际上只会告诉您应用程序是在模拟环境中运行,还是在实际设备上运行,而对平台是iPad还是iPhone没有影响。【参考方案5】:

关于

这实际上只会告诉你如果 该应用程序正在模拟中运行 环境,或在实际设备上, 并且不影响是否 平台是 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 的值将在编译时确定,而不是在运行时确定。【参考方案6】:

如果它是一个 iPhone 应用程序,那么你应该无法分辨出区别,那么就它可以判断它是在 iPhone 上运行。如果您想以 iPad 为目标,则需要为 iPad 目标构建它。

【讨论】:

一台 iPad 可以运行任何 iphone 应用记住:P 苹果对此非常慎重,确保应用程序开箱即用的唯一方法是,如果他们无法从 iPad 上获得他们无法返回的东西从 iPhone 获取。商店中有太多应用程序将测试硬件标识符/屏幕分辨率其他边缘情况,苹果有机会离开它。 @Antwan 任何 iPhone 应用程序都可以在其上运行,但它是在模拟环境中。如果你想在 iPad 上做任何不同的事情,它必须为 iPad 构建......因为它需要运行任何 iPhone 应用程序,而这些应用程序无法从 iPhone 构建中检测到它正在 iPad 上运行。 很公平。我还是觉得没有 RetinaDisplay 显卡是不正常的,但这是苹果和他们 iPad 上的 iPhone 模拟器的问题,那不是我的……谢谢。 是否还有其他适用于 iPhone 的应用程序在 iPad 上具有视网膜显示图形?如果我记得的话,iPad 在 iPhone 发布之前就已经问世了,而且屏幕分辨率较低(虽然比 iPhone 3gs 高)

以上是关于如何检测我的 iPhone 应用程序正在 iPad 上运行的主要内容,如果未能解决你的问题,请参考以下文章

iPhone:如何使用 AVAudioPlayer 检测 Iphone/Ipod 音量级别

检测应用程序是不是安装在 iPad 或 iPhone 上(iOS 6 到 iOS 7)

设置一个应用程序来检测操作系统版本。和 iPhone 或 iPad

检测 iPhone/iPad 是不是受密码保护

检测iOS设备类型

通过 javascript 检测 ipad/iphone webview