2010-05-21 21 views
32

क्या रनटाइम पर जांच करने के लिए कोई एपीआई है चाहे आप आईफोन या आईपैड पर चल रहे हों?एपीआई यह निर्धारित करने के लिए कि आईफोन या आईपैड पर चल रहा है

एक तरह से मैं के बारे में सोच सकते हैं उपयोग करने के लिए होगा:

[[UIDevice currentDevice] model]; 

और स्ट्रिंग @ "iPad" के अस्तित्व का पता लगाने - जो थोड़ा कमजोर लगता है।

3.2 एसडीके में, मैं देख रहा हूँ भी एक संपत्ति है जो वास्तव में है मैं क्या देख रहा हूँ है, लेकिन (जाहिर है) के लिए पूर्व 3.2 काम नहीं करता:

[[UIDevice currentDevice] userInterfaceIdiom]; 

वहाँ अन्य रहे हैं एक सार्वभौमिक ऐप के लिए @ "आईपैड" के अस्तित्व की जांच करने के तरीके?

उत्तर

41

चेकआउट UI_USER_INTERFACE_IDIOM

वर्तमान डिवाइस द्वारा समर्थित इंटरफ़ेस मुहावरे को वापस करता है।

वापसी मूल्य
UIUserInterfaceIdiomPhone कि उपकरण किसी iPhone या iPod touch या UIUserInterfaceIdiomPad कि उपकरण किसी आईपैड है।

UIUserInterfaceIdiom

अंतरफलक के प्रकार है कि वर्तमान डिवाइस

typedef enum { 
    UIUserInterfaceIdiomPhone, 
    UIUserInterfaceIdiomPad, 
} UIUserInterfaceIdiom; 
+0

पकड़ लिया - मैं उपयोग कर सकते हैं respondsToSelector: @selector (userInterfaceIdiom) के बजाय स्ट्रिंग के अस्तित्व के लिए जाँच की " आईपैड "। धन्यवाद! – Eric

+7

मैक्रो का उपयोग करें - बाद में ओएस चयनकर्ता को जवाब देगा, लेकिन जरूरी नहीं कि एक आईपैड हो। – Andiih

+1

ठीक है, मैं सीख रहा हूँ। :) मेरा # फ़ाईल: मैं 3.2 और 3.1 के बीच सक्रिय एसडीके स्विच करके आईफोन और आईपैड के बीच टॉगल करने के लिए सिम्युलेटर का उपयोग कर रहा हूं - जिसमें सक्रिय एसडीके 3.1 होने पर अब संकलित नहीं किया गया है। तब मैंने कुछ कैफीन के साथ न्यूरॉन्स को झुका दिया और #ifdef UI_USER_INTERFACE_IDIOM को इसके चारों ओर प्लग किया ... वैसे भी, फॉलोअप एंडीह के लिए धन्यवाद - और अगर मैंने #ifdef के साथ #worsethanfailure को #fail किया है, तो मुझे जानना। :) – Eric

0

उपयोग NSClassFromString और एक iPad विशेष वर्ग पर इस्तेमाल किया जाना चाहिए। यहाँ और अधिक पढ़ें:

http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/StartingYourProject/StartingYourProject.html#//apple_ref/doc/uid/TP40009370-CH9-SW3

+4

-1 यह बताने में वाकई मुश्किल है कि आपका जवाब क्या है। या तो हटाएं या ठीक करें, शायद? –

1
  1. userInterfaceIdiom संपत्ति, usings respondsToSelector की उपस्थिति की जांच :. यदि यह अस्तित्व में नहीं है, तो हम प्री-3.2 डिवाइस पर हैं, इस प्रकार एक आईपैड नहीं है।
  2. यदि उपयोगकर्ताInterfaceIdiom मौजूद है, तो इसका उपयोग करें।

संपादित करें: ... जो स्पष्ट रूप से ठीक है क्या UI_USER_INTERFACE_IDIOM() मैक्रो करता है, तो यह है कि बजाय का उपयोग करें। :)

15
बस मेरे संदर्भ के लिए

:

@property (nonatomic, readonly) BOOL isPhone; 

-(BOOL)isPhone { 
    return (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone); 
} 

या एक #define

#define IS_PHONE (UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone) 

का उपयोग हालांकि, अगर आप सब अपने कोड पर isPhone उपयोग कर रहे हैं, कि आम तौर पर बुरा व्यवहार है। अपने if बयानों को रखने के लिए फैक्ट्री पैटर्न और पॉलिमॉर्फिज्म का उपयोग करें, ताकि आपको फ़ोन या आईपैड के लिए बनाई गई ऑब्जेक्ट मिलें और फिर उन लोगों के साथ काम करें।

जोड़ा गया

मैं सभी मेरे कोड पर अब इस समाधान का उपयोग कर रहा हूँ। यह आवंटन में एक मानक कारखाना पैटर्न जोड़ता है।

#define ALLOC_PER_DEVICE() id retVal = nil; \ 
         NSString *className = NSStringFromClass(self);\ 
         if (IS_PHONE && ![className hasSuffix:@"Phone"]) {\ 
          className = [NSString stringWithFormat:@"%@Phone", className];\ 
          Class newClass = NSClassFromString(className);\ 
          retVal = [newClass alloc];\ 
         }\ 
         if (!retVal)\ 
          retVal = [super alloc];\ 
         assert(retVal != nil);\ 
         return retVal\ 

तब मेरे allocs इस तरह दिखेगा:

+alloc { ALLOC_PER_DEVICE(); } 

और मैं एक उपवर्ग फोन संस्करण के लिए TheClassPhone बुलाया जोड़ें।

नोट: वहाँ ऑब्जेक्टिव-सी में कोई एकाधिक वंशानुक्रम है के बाद से, अपनी समस्याओं को हल करने के वंशानुक्रम का उपयोग थोड़ा अहंकारी है (यानी, वह अगर आप उपवर्गों की उपवर्गों है काम नहीं करता है)। जब आपको इसकी आवश्यकता हो तो if की तरह कुछ भी नहीं।

+0

हाय, उद्देश्य-सी के यहां सीखें। बस सोच रहा है कि एक यूटिलिटी क्लास बनाने के लिए क्यों एक अच्छा विचार नहीं है और उसके बाद एक "आईएसफोन" स्थिर विधि जोड़ें ताकि मैं कर सकूं ([उपयोगिताओं isPhone]) {/ * iphone stuff * /} else {/ * आईपैड सामान * /} मेरी परियोजना में? इसके अलावा, आप अपनी विधि को संपत्ति के रूप में क्यों परिभाषित करते हैं? कक्षा विधियों के साथ – Macmee

+0

उपयोगिता वर्ग ठीक है। मैं इसे एक संपत्ति के रूप में परिभाषित करता हूं क्योंकि मैं इसे इस तरह से उपयोग करना चाहता हूं। –

+0

यदि आपकी 'यूटिलिटीज' क्लास एक सिंगलटन है, तो आप 'यूटिलिटीज आईफोन' का उपयोग कर सकते हैं अन्यथा क्लास विधियां बना सकते हैं। सिंगलटन निश्चित रूप से जाने का अनुशंसित तरीका है। गुणों के रूप में तरीके एक ही हैं। उद्देश्य-सी उस तरह लचीला है। –

1

आप देख सकते हैं आप निम्नलिखित कोड का उपयोग करके iPhone या iPad पर अनुप्रयोग चलाने यदि:

- (NSString *)deviceModel 
{ 
    struct utsname systemInfo; 
    uname(&systemInfo); 
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; 
} 

- (NSString *) platformString 
{ 
    NSString *platform = [self deviceModel]; 
    if ([platform isEqualToString:@"iPhone1,1"]) return @"iPhone_2G"; 
    else if ([platform isEqualToString:@"iPhone1,2"]) return @"iPhone_3G"; 
    else if ([platform isEqualToString:@"iPhone2,1"]) return @"iPhone_3GS"; 
    else if ([platform isEqualToString:@"iPhone3,1"]) return @"iPhone_4"; 
    else if ([platform isEqualToString:@"iPhone3,3"]) return @"Verizon_iPhone_4"; 
    else if ([platform isEqualToString:@"iPhone4,1"]) return @"iPhone_4S"; 
    else if ([platform isEqualToString:@"iPhone5,1"]) return @"iPhone_5"; 
    else if ([platform isEqualToString:@"iPhone5,2"]) return @"iPhone_5"; 
    else if ([platform isEqualToString:@"iPod1,1"])  return @"iPod_Touch 1G"; 
    else if ([platform isEqualToString:@"iPod2,1"])  return @"iPod_Touch 2G"; 
    else if ([platform isEqualToString:@"iPod3,1"])  return @"iPod_Touch 3G"; 
    else if ([platform isEqualToString:@"iPod4,1"])  return @"iPod_Touch 4G"; 
    else if ([platform isEqualToString:@"iPad1,1"])   return @"iPad_1G"; 
    else if ([platform isEqualToString:@"iPad2,1"])  return @"iPad_2(WiFi)"; 
    else if ([platform isEqualToString:@"iPad2,2"])  return @"iPad_2(GSM)"; 
    else if ([platform isEqualToString:@"iPad2,3"])  return @"iPad_2(CDMA)"; 
    else if ([platform isEqualToString:@"iPad3,1"])  return @"iPad_3"; 
    else if ([platform isEqualToString:@"iPad3,2"])  return @"iPad_3(GSM/CDMA)"; 
    else if ([platform isEqualToString:@"iPad3,3"])  return @"iPad_3(GSM)"; 
    else if ([platform isEqualToString:@"iPad3,4"])  return @"iPad_3(GSM)"; 
    else if ([platform isEqualToString:@"iPad2,5"])  return @"iPad_mini_1G"; 
    else if ([platform isEqualToString:@"i386"])   return @"Simulator"; 
    else if ([platform isEqualToString:@"x86_64"])  return @"Simulator"; 
    return platform; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे