2010-07-14 11 views
10

मेरा आईफोन ऐप (http://hexalex.com) सार्वभौमिक नहीं है लेकिन इसमें एक सुविधा है जिसे मैं आईपैड पर खेलने वाले लोगों के लिए सक्षम करना चाहता हूं। क्या यह पता लगाने का कोई तरीका है कि आप एक आईपैड पर संगतता मोड में चल रहे हैं? मशीन चश्मे का पता लगाने के लिए UIDevice विधियां सभी एक आईफोन (कम से कम सिम्युलेटर पर) के मूल्यों को वापस लौटाते हैं। एकमात्र चीज जिसे मैं सोच सकता हूं वह ओएस 3.2 का पता लगा रहा है, लेकिन वह तकनीक लंबे समय तक काम नहीं करेगी।संगतता मोड में आईपैड पर चल रहे आईफोन ऐप का पता लगाने

+3

"compatability" मोड से आपका क्या मतलब है? यह आईओएस है, विंडोज एक्सपी नहीं। –

+0

जब आप एक आईपैड पर एक गैर-सार्वभौमिक आईफोन ऐप चलाते हैं तो यह एक नकली आईफोन वातावरण में चलता है। इसके लिए आपको सही शब्द जानने के लिए मुझे क्षमा करना होगा। – n8gray

+0

हां। आईपैड एप्स आईपैड पर चलते हैं। उस स्थिति में आप पहले से ही जानते हैं कि आपने एक आईफोन ऐप बनाया है, आपको बस यह जांचने की ज़रूरत है कि आईपैड पर चल रहा है या नहीं, मेरा जवाब देखें। –

उत्तर

19

मूल रूप से यहां उत्तर: https://stackoverflow.com/a/14864400/577237

फिर से पोस्ट किया है, क्योंकि यह इतना कम है:

एप्लिकेशन एक iPhone एक iPad पर एमुलेटर मोड में चल रहा ऐप्स है, तो यह फोन की एक userInterfaceIdiom होगा, लेकिन एक मॉडल प्रकार का आईपैड। आप इसे निम्न कोड से देख सकते हैं:

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

आपका कोड गलत है। UI_USER_INTERFACE_IDIOM() आईपैड पर चल रहे आईफोन ऐप के लिए आईपैड के बराबर होगा। – SpaceDog

+0

@RubberDuck मुझे आपके मूल्यांकन से असहमत होना है। मैंने इस कार्यक्षमता का परीक्षण करने के लिए एक परीक्षण ऐप बनाया है: https://github.com/michaelpatzer/TestEmulationMode –

+0

यह अजीब बात है क्योंकि आपके ऐप पर व्यवहार अपेक्षित है लेकिन मेरे दो ऐप्स में, मैं आईपैड को आईपैड के रूप में देखता हूं मुहावरा! WTF !!!! – SpaceDog

9

1) उपयोग UIDevice-एक्सटेंशन एरिका Sadun ने लिखा है। एक बहुत ही व्यापक वर्ग:

[[UIDevice currentDevice] name]    // eg. "Brock's iPhone" 
[[UIDevice currentDevice] model]    // eg. @"iPhone", @"iPod Touch" 
[[UIDevice currentDevice] localizedModel] // localized version of model 
[[UIDevice currentDevice] systemName]  // eg. @"iPhone OS" 
[[UIDevice currentDevice] systemVersion]  // eg. @"3.2" 
[[UIDevice currentDevice] uniqueIdentifier] // UDID, a unique string to identify the device 

ऊपर लाइनों में से प्रत्येक एक NSString वापस आ जाएगी: http://github.com/erica/uidevice-extension/blob/master/UIDevice-Hardware.m

2) या आप भी UIDevice वर्ग विधि का उपयोग कर सकते हैं। जो करने के लिए आप तो इस तरह की स्ट्रिंग तुलना कर सकते हैं:

NSString *model = [[UIDevice currentDevice] model]; 
NSLog(@"Current device model: \"%@\"", model); 

3) एक और तरीका है:

http://www.drobnik.com/touch/2009/07/determining-the-hardware-model/ आप iPad के लिए सही हार्डवेयर नंबर का उपयोग करने के लिए इस संशोधित करने की आवश्यकता होगी।

UIDevice-hardware.h

#import 

#define IPHONE_1G_NAMESTRING @"iPhone 1G" 
#define IPHONE_3G_NAMESTRING @"iPhone 3G" 
#define IPHONE_3GS_NAMESTRING @"iPhone 3GS" 
#define IPOD_1G_NAMESTRING @"iPod touch 1G" 
#define IPOD_2G_NAMESTRING @"iPod touch 2G" 

@interface UIDevice (Hardware) 
- (NSString *) platform; 
- (NSString *) platformString; 
@end 

UIDevice-hardware.m

#import "UIDevice-hardware.h" 
#include <sys/types.h> 
#include <sys/sysctl.h> 

@implementation UIDevice (Hardware) 

/* 
Platforms 
iPhone1,1 = iPhone 1G 
iPhone1,2 = iPhone 3G 
iPhone2,1 = iPhone 3GS 
iPod1,1 = iPod touch 1G 
iPod2,1 = iPod touch 2G 
*/ 

- (NSString *) platform 
{ 
size_t size; 
sysctlbyname("hw.machine", NULL, &amp;size, NULL, 0); 
char *machine = malloc(size); 
sysctlbyname("hw.machine", machine, &amp;size, NULL, 0); 
NSString *platform = [NSString stringWithCString:machine]; 
free(machine); 
return platform; 
} 

- (NSString *) platformString 
{ 
NSString *platform = [self platform]; 
if ([platform isEqualToString:@"iPhone1,1"]) return IPHONE_1G_NAMESTRING; 
if ([platform isEqualToString:@"iPhone1,2"]) return IPHONE_3G_NAMESTRING; 
if ([platform isEqualToString:@"iPhone2,1"]) return IPHONE_3GS_NAMESTRING; 
if ([platform isEqualToString:@"iPod1,1"]) return IPOD_1G_NAMESTRING; 
if ([platform isEqualToString:@"iPod2,1"]) return IPOD_2G_NAMESTRING; 
return NULL; 
} 
@end 
+0

मेरे पास परीक्षण करने के लिए आईपैड नहीं है, लेकिन आईपैड सिम्युलेटर' [[यूआईडीवीस वर्तमानडिवाइस] मॉडल] 'आईफोन सिम्युलेटर' देता है, न कि 'आईपैड सिम्युलेटर'। मुझे लगता है कि डिवाइस पर चलते समय यह 'आईपैड' के बजाय 'आईफोन' वापस कर देगा। यह एक नकली आईफोन वातावरण है, इसलिए यह कोई आश्चर्य की बात नहीं है। 'hw.machine' sysctl एक दिलचस्प सुझाव है, लेकिन आईपैड सिम्युलेटर पर यह केवल' i386' देता है। क्या आप जानते हैं कि गैर-सार्वभौमिक आईफोन ऐप चलाने पर आईपैड पर क्या आता है? – n8gray

+1

आपको सिम्युलेटर पर इसका परीक्षण करने की आवश्यकता नहीं है। आपको एक असली डिवाइस की ज़रूरत है, अन्यथा आप कैसे जान सकते हैं कि क्षेत्र के माहौल में क्या होता है? –

3

आप "UIDevice.h" जाँच कर दी: ऊपर के लिंक से लिया? इसमें मॉडल प्रॉपर्टी है जिसे आप आईफोन, आईपॉड, आईपैड डिवाइस

एनएसएसटींग * नाम; // उदा। "मेरा आईफोन"

एनएसएसटींग * मॉडल; // उदा। @ "आईफोन", @ "आइपॉड टच"

एनएसएसटींग * लोकलाइज्ड मॉडल; // मॉडल

NSString * systemName का स्थानीय संस्करण; // उदा। @ "आईफोन ओएस"

एनएसएसटींग * सिस्टमवर्सन; // उदा। @ "2.0"

एनएसएसटींग * अद्वितीय पहचानकर्ता; (DEPRECATED) // विभिन्न हार्डवेयर जानकारी के आधार पर प्रत्येक डिवाइस के लिए अद्वितीय स्ट्रिंग स्ट्रिंग।

+0

मेरे पास परीक्षण करने के लिए आईपैड नहीं है, लेकिन आईपैड सिम्युलेटर '[[यूआईडीवीस वर्तमानडिवाइस] मॉडल] 'आईफोन सिम्युलेटर' देता है, न कि 'आईपैड सिम्युलेटर'। – n8gray

+0

मैं [[UIDevice currentDevice] मॉडल प्रिंट करता हूं] और यह मुझे "आईपैड" वापस कर दिया :) –

+0

@ n8gray: हाँ सिम्युलेटर सीमित है। केवल आईओएस उपकरणों पर काम करता है। –

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