दिलचस्प पोस्ट
आधुनिक RDBMS पर इनलाइन स्टेटमेंट की तुलना में, सामान्य रूप से संसाधित प्रक्रियाएं अधिक कुशल हैं? क्या Mysql एक स्तंभ को विभाजित कर सकता है? JQuery के सत्यापन प्लगइन के साथ बूटस्ट्रैप 3 जावास्क्रिप्ट में दीप क्लोन कैसे करें SQL सर्वर में दशमलव से पीछे वाले शून्य निकालें अनारी प्लस और माइनस ऑपरेटरों का महत्वपूर्ण उपयोग क्या है? क्या Haskell पूंछ-पुनरावर्ती अनुकूलन है? NSMutableArray को घुमाए जाने का सबसे अच्छा तरीका क्या है? पर्ल में तालिका डेटा को पार्स करने में समस्या सी # लम्बाडा (=>) एंड्रॉइड में संपादन टेक्स्ट के लिए न्यूनतम और अधिकतम मान परिभाषित करने का कोई तरीका है? नि: शुल्क इंटरनेट ब्राउज़र? अजगर चेतावनियों को अक्षम कैसे करें .NET में मेमोरी लीक्स को खोजने के लिए कौन से रणनीतियों और टूल उपयोगी हैं? इस गोलांग कोड में क्या गलत है?

पता लगाएँ कि डिवाइस आईफोन एक्स है

मेरा आईओएस ऐप UINavigationBar लिए एक कस्टम ऊँचाई का उपयोग करता है जो नए आईफोन एक्स पर कुछ समस्याओं की ओर जाता है।

क्या कोई पहले से ही जानता है कि आईफोन एक्स पर कोई ऐप चल रहा है, तो विश्वसनीय कैसे पता चलता है कि प्रोग्राममैटिक रूप से (उद्देश्य-सी में)?

संपादित करें:

बेशक स्क्रीन के आकार की जांच करना संभव है, लेकिन मुझे आश्चर्य है कि अगर कुछ " TARGET_OS_IPHONE " की TARGET_OS_IPHONE करने के लिए TARGET_OS_IPHONE जैसी "बिल्ड इन" विधि है …

 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize screenSize = [[UIScreen mainScreen] bounds].size; if (screenSize.height == 812) NSLog(@"iPhone X"); } 

2 संपादित करें:

मुझे नहीं लगता, मेरा प्रश्न लिंक किए गए प्रश्न का डुप्लिकेट है बेशक मौजूदा डिवाइस के विभिन्न गुणों को "माप" करने के लिए और उपकरण का इस्तेमाल करने के लिए परिणामों का उपयोग करने के तरीकों का इस्तेमाल किया जाता है। हालांकि यह मेरे प्रश्न का वास्तविक बिंदु नहीं था क्योंकि मैंने पहले संपादन में जोर देने की कोशिश की थी।

वास्तविक प्रश्न यह है: "क्या यह प्रत्यक्ष रूप से पता लगा सकता है कि वर्तमान डिवाइस एक आईफोन एक्स है (जैसे कुछ एसडीके सुविधा के द्वारा) या मुझे अप्रत्यक्ष माप का उपयोग करना है ? "

अब तक दिए गए उत्तरों से, मैं मानता हूं कि जवाब "नहीं, कोई प्रत्यक्ष तरीके नहीं हैं। मापन का रास्ता तय करना है"।

वेब के समाधान से एकत्रित समाधान "पता लगाएँ कि डिवाइस आईफोन एक्स है"

आपके प्रश्न के आधार पर, उत्तर है नहीं, कोई सीधा तरीके नहीं हैं, अधिक जानकारी के लिए आप यहां से जानकारी प्राप्त कर सकते हैं 1 और यहां 2

अगर आप आईफोन एक्स ऊँचाई 2436 पीएक्स का पता लगाना चाहते हैं

डिवाइस स्क्रीन आकार और ओरिएंटेशन

यहां छवि विवरण दर्ज करें

तेज 3 और ऊपर

 if UIDevice().userInterfaceIdiom == .phone { switch UIScreen.main.nativeBounds.height { case 1136: print("iPhone 5 or 5S or 5C") case 1334: print("iPhone 6/6S/7/8") case 2208: print("iPhone 6+/6S+/7+/8+") case 2436: print("iPhone X") default: print("unknown") } } 

उद्देश्य सी

  if([[UIDevice currentDevice]userInterfaceIdiom]==UIUserInterfaceIdiomPhone) { switch ((int)[[UIScreen mainScreen] nativeBounds].size.height) { case 1136: printf("iPhone 5 or 5S or 5C"); break; case 1334: printf("iPhone 6/6S/7/8"); break; case 2208: printf("iPhone 6+/6S+/7+/8+"); break; case 2436: printf("iPhone X"); break; default: printf("unknown"); } } 

आपके प्रश्न के आधार पर अनुसरण करें

या स्क्रीन साइज का उपयोग करें.हाइट 812.0 812.0f इंट 812 रूप में नहीं

 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize screenSize = [[UIScreen mainScreen] bounds].size; if (screenSize.height == 812.0f) NSLog(@"iPhone X"); } 

अधिक जानकारी के लिए आप यहां प्राप्त कर सकते हैं

अद्यतन करें

डिवाइस प्रकार की पहचान करने के लिए userInterfaceIdiom प्रॉपर्टी का उपयोग न करें, जैसा कि सेब दस्तावेज़ बताते हैं,

सार्वभौमिक अनुप्रयोगों के लिए, आप इस प्रॉपर्टी का उपयोग किसी विशिष्ट प्रकार के डिवाइस के लिए आपके एप्लिकेशन के व्यवहार को तैयार करने के लिए कर सकते हैं। उदाहरण के लिए, iPhone और आईपैड डिवाइसों के अलग-अलग स्क्रीन आकार हैं, इसलिए आप वर्तमान डिवाइस के प्रकार के आधार पर अलग-अलग दृश्य और नियंत्रण बनाना चाहते हैं।

यही है, यह प्रॉपर्टी केवल चल रहे ऐप के दृश्य शैली की पहचान करने के लिए उपयोग की जाती है। हालांकि, आईपैड ऐप (सार्वभौमिक नहीं) को ऐप स्टोर के माध्यम से आईपैड डिवाइस में स्थापित किया जा सकता है, उस स्थिति में, यूजर इंटरफेसआईडीओम भी यूआईयूजर इंटरफेस आईडीओएमफोन को वापस देगा।

मशीन का नाम uname माध्यम से प्राप्त करने का सही तरीका है, इस थ्रेड को विस्तार से देखें।

एक और संभावना है, जो वर्तमान में काम करती है क्योंकि आईफोन एक्स शीर्ष पर एक पायदान के साथ एक है। यही मैं वास्तव में यहाँ का पता लगा रहा हूं:

  iphoneX = NO; if (@available(iOS 11.0, *)) { if (_window.safeAreaInsets.top > 0.0) { iphoneX = YES; } } 

और निश्चित रूप से, यदि आप लैंडस्केप ओरिएंटेशन में हैं तो आपको बाएं और दाएं सुरक्षित क्षेत्र insets की जांच करनी पड़ सकती है

संपादित करें: _Window, AppDelegate का UIWindow है, जहां यह जांच एप्लिकेशन में किया गया है FinishLaunchingWithOptions।

डिवाइस मॉडल / मशीन का नाम जांचें, अपने कोड में बिंदु / पिक्सेल गिनती का सीधे उपयोग न करें, यह कठिन कोड है !

 #import <sys/utsname.h> NSString* deviceName() { struct utsname systemInfo; uname(&systemInfo); return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; } 

परिणाम:

 @"iPhone10,3" on iPhone X (CDMA) @"iPhone10,6" on iPhone X (GSM) 

इस उत्तर को देखें।

पूर्ण कोड कार्यान्वयन:

 #import <sys/utsname.h> BOOL IsiPhoneX(void) { static BOOL isiPhoneX = NO; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ #if TARGET_IPHONE_SIMULATOR NSString *model = NSProcessInfo.processInfo.environment[@"SIMULATOR_MODEL_IDENTIFIER"]; #else struct utsname systemInfo; uname(&systemInfo); NSString *model = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; #endif isiPhoneX = [model isEqualToString:@"iPhone10,3"] || [model isEqualToString:@"iPhone10,6"]; }); return isiPhoneX; } 

आईफोन एक्स डिवाइस को आयाम के अनुसार पता लगाने के लिए आप ऐसा कर सकते हैं।

तीव्र

 if UIDevice().userInterfaceIdiom == .phone && UIScreen.main.nativeBounds.height == 2436 { //iPhone X } 

उद्देश्य सी

 if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone && UIScreen.mainScreen.nativeBounds.size.height == 2436) { //iPhone X } 

यहां छवि विवरण दर्ज करें

लेकिन ,

यह पर्याप्त रास्ता नहीं है क्या होगा अगर ऐप्पल ने अगले आईफोन को आईफोन एक्स के एक ही आयाम के साथ बताया। इसलिए डिवाइस का पता लगाने के लिए हार्डवेयर स्ट्रिंग का सबसे अच्छा तरीका है।

नए डिवाइस के लिए हार्डवेयर स्ट्रिंग नीचे दी गई है

आईफोन 8 – आईफोन 10,1 या आईफोन 10,3

आईफोन 8 प्लस – आईफोन 10,2 या आईफोन 10,4

iPhone X – iPhone10,5 या iPhone10,6

ये सभी उत्तर आयामों के आधार पर भविष्य के उपकरणों पर गलत व्यवहार के लिए अतिसंवेदनशील होते हैं। वे आज काम करेंगे, लेकिन क्या होगा अगर अगले साल एक आईफोन है जो कि एक ही आकार का है, लेकिन कैमरा, इत्यादि गिलास के नीचे है, तो कोई "पायदान" नहीं है? यदि एकमात्र विकल्प ऐप को अपडेट करना है, तो यह आपके और आपके ग्राहकों के लिए खराब समाधान है।

आप "iPhone10,1" की तरह हार्डवेयर मॉडल स्ट्रिंग भी देख सकते हैं, लेकिन यह समस्याग्रस्त है क्योंकि कभी-कभी Apple दुनिया भर में विभिन्न वाहकों के लिए अलग-अलग मॉडल संख्या जारी करता है।

सही दृष्टिकोण शीर्ष लेआउट को फिर से डिज़ाइन करना है, या कस्टम नेविगेशन पट्टी की ऊँचाई के साथ होने वाली समस्याओं का समाधान करना है (इस पर मैं क्या फ़ोकस करेगा)। लेकिन, अगर आप उन चीजों में से कोई भी नहीं करने का निर्णय लेते हैं, तो पता है कि जो कुछ भी आप कर रहे हैं वह आजकल काम करने के लिए एक हैक है , और आपको इसे कुछ समय पर सुधारने की ज़रूरत है, शायद कई बार, हैक्स रखने के लिए काम कर रहे।

हाँ यह संभव है। UIDevice- हार्डवेयर एक्सटेंशन डाउनलोड करें (या कोकापोड 'यूआईडीवाइस-हार्डवेयर' के द्वारा स्थापित करें) और उसके बाद उपयोग करें:

 NSString* modelID = [[[UIDevice currentDevice] modelIdentifier]; BOOL isIphoneX = [modelID isEqualToString:@"iPhone10,3"] || [modelID isEqualToString:@"iPhone10,6"]; 

ध्यान दें कि यह सिम्युलेटर में काम नहीं करेगा, केवल वास्तविक डिवाइस पर।

 #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_IPHONE_4 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 480.0) #define IS_IPHONE_5 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 568.0) #define IS_IPHONE_6 (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 667.0) #define IS_IPHONE_6PLUS (IS_IPHONE && [[UIScreen mainScreen] nativeScale] == 3.0f) #define IS_IPHONE_6_PLUS (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 736.0) #define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0) #define IS_RETINA ([[UIScreen mainScreen] scale] == 2.0) #define IS_IPAD_DEVICE [(NSString*)[UIDevice currentDevice].model hasPrefix:@"iPad"] 

स्विफ्ट 4 उत्तर

मेहौद 1:

window?.safeAreaInsets.top का उपयोग करके window?.safeAreaInsets.top

  var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { window = UIWindow(frame: UIScreen.main.bounds) if #available(iOS 11.0, *) { if (window?.safeAreaInsets.top)! > CGFloat(0.0) || window?.safeAreaInsets != .zero { print("iPhone X") } else { print("Not iPhone X") } } return true } 

विधि 2: नोट: परीक्षण के लिए वास्तविक उपकरण की आवश्यकता है

संदर्भ

  let deviceType = UIDevice.current.modelName if deviceType.range(of:"iPhone10,3") != nil || deviceType.range(of:"iPhone10,6") != nil { print("iPhone X") } else { print("Not iPhone X") } extension UIDevice { var modelName: String { var systemInfo = utsname() uname(&systemInfo) let machineMirror = Mirror(reflecting: systemInfo.machine) let identifier = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } return identifier } } 

@ Saswanb की प्रतिक्रिया के अनुसार, यह स्विफ्ट 4 संस्करण है:

 var iphoneX = false if #available(iOS 11.0, *) { if ((UIApplication.shared.keyWindow?.safeAreaInsets.top)! > CGFloat(0.0)) { iphoneX = true } } 

वास्तविक आवश्यकता पर निर्भर करते हुए आप iPhone X के विभिन्न detections प्रदर्शन करेंगे

शीर्ष पायदान (स्टेटसबार, नेवाबार) या नीचे होम इंडिकेटर (टैबबार) आदि से निपटने के लिए

 class var hasSafeAreaInsets: Bool { if #available(iOS 11.0, tvOS 11.0, *) { return UIApplication.shared.delegate?.window??.safeAreaInsets != .zero } return false } 

पृष्ठभूमि आकार, फुल स्क्रीन सुविधाओं आदि के लिए

 class var isIphoneXOrBigger: Bool { return UIScreen.main.bounds.height >= 812 } 

ध्यान दें: अंत में इसे UIDevice.current.userInterfaceIdiom == .phone साथ UIDevice.current.userInterfaceIdiom == .phone
नोट: इस विधि के लिए लॉन्च स्क्रीन स्टोरीबोर्ड या उचित लॉन्च इमेजेस होना आवश्यक है

पृष्ठभूमि अनुपात, स्क्रॉलिंग फीचर्स आदि के लिए

 class var isIphoneXOrLonger: Bool { return UIScreen.main.bounds.height / UIScreen.main.bounds.width >= 812.0 / 375.0 } 

नोट: इस विधि के लिए लॉन्च स्क्रीन स्टोरीबोर्ड या उचित लॉन्च इमेजेस होना आवश्यक है

विश्लेषिकी, आंकड़े, ट्रैकिंग आदि के लिए

मशीन पहचानकर्ता प्राप्त करें और इसे दस्तावेज़ित मानों की तुलना करें:

 class var isIphoneX: Bool { var size = 0 sysctlbyname("hw.machine", nil, &size, nil, 0) var machine = [CChar](repeating: 0, count: size) sysctlbyname("hw.machine", &machine, &size, nil, 0) var model = String(cString: machine) return model == "iPhone10,3" || model == "iPhone10,6" } 

अपने विश्लेषिकी में सिम्युलेटर को एक वैध आईफोन एक्स के रूप में शामिल करने के लिए:

 class var isIphoneX: Bool { let model: String if TARGET_OS_SIMULATOR != 0 { model = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "" } else { var size = 0 sysctlbyname("hw.machine", nil, &size, nil, 0) var machine = [CChar](repeating: 0, count: size) sysctlbyname("hw.machine", &machine, &size, nil, 0) model = String(cString: machine) } return model == "iPhone10,3" || model == "iPhone10,6" } 

फेसएड समर्थन के लिए

 import LocalAuthentication /// will fail if user denies canEvaluatePolicy(_:error:) class var canUseFaceID: Bool { if #available(iOS 11.0, *) { return LAContext().biometryType == .typeFaceID } return false } 

आपको यह नहीं मानना ​​चाहिए कि एकमात्र उपकरण जो कि ऐप्पल एक अलग UINavigationBar ऊंचाई के साथ जारी करता है iPhone X होगा। इस समस्या को अधिक सामान्य समाधान का उपयोग करने का प्रयास करें। यदि आप बार को अपनी डिफ़ॉल्ट ऊँचाई से 20 पिक्सेल बड़ा बनाते हैं, तो आपके कोड को 64px (44px + 20px) पर सेट करने के बजाय बार की ऊंचाई पर 20px जोड़ना चाहिए।

 #define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) #define IS_IPHONE_X (IS_IPHONE && [[UIScreen mainScreen] bounds].size.height == 812.0f) 
 struct ScreenSize { static let width = UIScreen.main.bounds.size.width static let height = UIScreen.main.bounds.size.height static let maxLength = max(ScreenSize.width, ScreenSize.height) static let minLength = min(ScreenSize.width, ScreenSize.height) static let frame = CGRect(x: 0, y: 0, width: ScreenSize.width, height: ScreenSize.height) } struct DeviceType { static let iPhone4orLess = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength < 568.0 static let iPhone5orSE = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 568.0 static let iPhone678 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 667.0 static let iPhone678p = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 736.0 static let iPhoneX = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 812.0 static let IS_IPAD = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.maxLength == 1024.0 static let IS_IPAD_PRO = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.maxLength == 1366.0 } 

मुझे पता है कि यह केवल एक स्विफ्ट समाधान है, लेकिन यह किसी को मदद कर सकता है

मेरे पास हर प्रोजेक्ट में globals.swift है और उन चीजों में से एक है जो मैं हमेशा इसके लिए जोड़ता हूं, यह डिवाइस के लिए शीघ्रता से उपयोगकर्ता के उपकरण का पता लगाने के लिए है:

 struct ScreenSize { static let width = UIScreen.main.bounds.size.width static let height = UIScreen.main.bounds.size.height static let maxLength = max(ScreenSize.width, ScreenSize.height) static let minLength = min(ScreenSize.width, ScreenSize.height) static let frame = CGRect(x: 0, y: 0, width: ScreenSize.width, height: ScreenSize.height) } struct DeviceType { static let iPhone4orLess = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength < 568.0 static let iPhone5orSE = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 568.0 static let iPhone678 = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 667.0 static let iPhone678p = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 736.0 static let iPhoneX = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.maxLength == 812.0 } 

यह संभवतया कुछ अन्य स्टैक ओवरफ्लो उत्तर से बना है जैसा कि मुझे सभी अच्छी चीजें मिलती हैं!

आमतौर पर, प्रोग्रामर को इसे ऊपर या नीचे तक सीमित करने की आवश्यकता होती है, इसलिए ये विधियां मदद कर सकती हैं

 static func extraTop() -> CGFloat { var top: CGFloat = 0 if #available(iOS 11.0, *) { if let t = UIApplication.shared.keyWindow?.safeAreaInsets.top { top = t } } return top } static func extraBottom() -> CGFloat { var bottom: CGFloat = 0 if #available(iOS 11.0, *) { if let b = UIApplication.shared.keyWindow?.safeAreaInsets.bottom { bottom = b } } return bottom } 

आईफोन एक्स से पहले ये विधियां वापस आती हैं: 0

आईफोन एक्स के लिए: 44 और 34 तदनुसार

तो बस इन अतिरिक्त को ऊपर या निचले बाधाओं में जोड़ें

 - (BOOL)isIphoneX { if (@available(iOS 11.0, *)) { UIWindow *window = UIApplication.sharedApplication.keyWindow; CGFloat topPadding = window.safeAreaInsets.top; if(topPadding>0) { return YES; } else { return NO; } } else { return NO; } } 

सभी उत्तरों जो height का उपयोग कर रहे हैं, एक कारण से कहानी का आधा हिस्सा हैं। यदि आप इस तरह की जाँच करने जा रहे हैं कि डिवाइस की स्थिति landscapeLeft या landscapeRight , तो जांच विफल हो जाएगी, क्योंकि height width साथ स्वैप हो गई है।

इसलिए मेरा समाधान स्विफ्ट 4.0 में इस तरह दिखता है:

 extension UIScreen { /// static var isPhoneX: Bool { let screenSize = UIScreen.main.bounds.size let width = screenSize.width let height = screenSize.height return min(width, height) == 375 && max(width, height) == 812 } } 

सभी उत्तरों को देखने के बाद मैं यह कर रहा हूं:

समाधान (स्विफ्ट 4 संगत)

 extension UIDevice { static var isIphoneX: Bool { var modelIdentifier = "" if isSimulator { modelIdentifier = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "" } else { var size = 0 sysctlbyname("hw.machine", nil, &size, nil, 0) var machine = [CChar](repeating: 0, count: size) sysctlbyname("hw.machine", &machine, &size, nil, 0) modelIdentifier = String(cString: machine) } return modelIdentifier == "iPhone10,3" || modelIdentifier == "iPhone10,6" } static var isSimulator: Bool { return TARGET_OS_SIMULATOR != 0 } } 

उपयोग

 if UIDevice.isIphoneX { // is iPhoneX } else { // is not iPhoneX } 

डिवाइस के बारे में जानने के लिए कई कारण हैं

  1. आप डिवाइस ऊंचाई (और चौड़ाई) को देख सकते हैं। यह लेआउट के लिए उपयोगी है, लेकिन आप आमतौर पर ऐसा नहीं करना चाहते हैं यदि आप सटीक डिवाइस जानना चाहते हैं।

  2. लेआउट प्रयोजनों के लिए, आप UIView.safeAreaInsets भी उपयोग कर सकते हैं।

  3. यदि आप डिवाइस नाम को प्रदर्शित करना चाहते हैं, उदाहरण के लिए, निदान उद्देश्यों के लिए एक ईमेल में शामिल करने के लिए, sysctl () का उपयोग करते हुए डिवाइस मॉडल को पुनर्प्राप्त करने के बाद, आप इसका समतुल्य नाम का उपयोग कर सकते हैं:

     $ curl http://appledevicenames.com/devices/iPhone10,6 iPhone X