2010-12-16 103 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

相關問題