বর্তমান আইফোন / ডিভাইস মডেলটি কীভাবে নির্ধারণ করবেন?


385

সুইফটে ডিভাইসের মডেল নাম (আইফোন 4 এস, আইফোন 5, আইফোন 5 এস, ইত্যাদি) পাওয়ার কোনও উপায় আছে কি?

আমি জানি যে এখানে একটি সম্পত্তি আছে UIDevice.currentDevice().modelতবে এটি কেবলমাত্র ডিভাইসের প্রকার (আইপড টাচ, আইফোন, আইপ্যাড, আইফোন সিমুলেটর ইত্যাদি) দেয়।

আমি আরও জানি যে এটি এই পদ্ধতিতে উদ্দেশ্য-সিতে সহজেই করা যেতে পারে:

#import <sys/utsname.h>

struct utsname systemInfo;
uname(&systemInfo);

NSString* deviceModel = [NSString stringWithCString:systemInfo.machine
                          encoding:NSUTF8StringEncoding];

তবে আমি সুইফটে আমার আইফোন অ্যাপটি বিকাশ করছি যাতে কেউ দয়া করে সুইফটে এটি সমাধানের জন্য সমপরিমাণ উপায়ে আমাকে সহায়তা করতে পারেন?


3
এটি উদ্দেশ্য সিতে করুন এবং কেবল সুইফট থেকে এটি কল করুন from
কেভিন


কেউ কি জানেন যে কারপ্লে কী সনাক্তকারী হিসাবে ফিরে আসে? আমি অনুমান করছি অ্যাপস এটি ইনস্টল করা যেতে পারে।
jww

কটাক্ষপাত দয়া করে stackoverflow.com/a/52821290/3472073
ale_stro

@jww কারপ্লে আইওএস ডিভাইসে চলে। আইওএস কেবল গাড়ি (স্টেরিও) থেকে প্রদর্শন, টাচ ইনপুট, স্পিকার ইত্যাদি ব্যবহার করে, সমস্ত কিছু আইওএস ডিভাইসে কার্যকর করা হয়, গাড়িতে নয় (স্টেরিও)।
d4Rk

উত্তর:


933

আমি এই "খাঁটি সুইফ্ট" এক্সটেনশনটি চালু করেছি UIDevice

এই সংস্করণটি সুইফট 2 বা উচ্চতরতে কাজ করে আপনি যদি পূর্ববর্তী সংস্করণ ব্যবহার করেন তবে আমার উত্তরটির একটি পুরানো সংস্করণ ব্যবহার করুন ।

আপনি যদি আরও মার্জিত সমাধানের সন্ধান করছেন তবে আপনি গিটহাবে প্রকাশিত আমার framework-কাঠামোটিDeviceKit ব্যবহার করতে পারেন (কোকোপডস, কার্থেজ এবং সুইফট প্যাকেজ ম্যানেজারের মাধ্যমেও উপলব্ধ)।

কোডটি এখানে:

import UIKit

public extension UIDevice {

    static let 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)))
        }

        func mapToDevice(identifier: String) -> String { // swiftlint:disable:this cyclomatic_complexity
            #if os(iOS)
            switch identifier {
            case "iPod5,1":                                 return "iPod touch (5th generation)"
            case "iPod7,1":                                 return "iPod touch (6th generation)"
            case "iPod9,1":                                 return "iPod touch (7th generation)"
            case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
            case "iPhone4,1":                               return "iPhone 4s"
            case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
            case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
            case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
            case "iPhone7,2":                               return "iPhone 6"
            case "iPhone7,1":                               return "iPhone 6 Plus"
            case "iPhone8,1":                               return "iPhone 6s"
            case "iPhone8,2":                               return "iPhone 6s Plus"
            case "iPhone8,4":                               return "iPhone SE"
            case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
            case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
            case "iPhone10,1", "iPhone10,4":                return "iPhone 8"
            case "iPhone10,2", "iPhone10,5":                return "iPhone 8 Plus"
            case "iPhone10,3", "iPhone10,6":                return "iPhone X"
            case "iPhone11,2":                              return "iPhone XS"
            case "iPhone11,4", "iPhone11,6":                return "iPhone XS Max"
            case "iPhone11,8":                              return "iPhone XR"
            case "iPhone12,1":                              return "iPhone 11"
            case "iPhone12,3":                              return "iPhone 11 Pro"
            case "iPhone12,5":                              return "iPhone 11 Pro Max"
            case "iPhone12,8":                              return "iPhone SE (2nd generation)"
            case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
            case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad (3rd generation)"
            case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad (4th generation)"
            case "iPad6,11", "iPad6,12":                    return "iPad (5th generation)"
            case "iPad7,5", "iPad7,6":                      return "iPad (6th generation)"
            case "iPad7,11", "iPad7,12":                    return "iPad (7th generation)"
            case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
            case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
            case "iPad11,4", "iPad11,5":                    return "iPad Air (3rd generation)"
            case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad mini"
            case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad mini 2"
            case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad mini 3"
            case "iPad5,1", "iPad5,2":                      return "iPad mini 4"
            case "iPad11,1", "iPad11,2":                    return "iPad mini (5th generation)"
            case "iPad6,3", "iPad6,4":                      return "iPad Pro (9.7-inch)"
            case "iPad7,3", "iPad7,4":                      return "iPad Pro (10.5-inch)"
            case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4":return "iPad Pro (11-inch)"
            case "iPad8,9", "iPad8,10":                     return "iPad Pro (11-inch) (2nd generation)"
            case "iPad6,7", "iPad6,8":                      return "iPad Pro (12.9-inch)"
            case "iPad7,1", "iPad7,2":                      return "iPad Pro (12.9-inch) (2nd generation)"
            case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8":return "iPad Pro (12.9-inch) (3rd generation)"
            case "iPad8,11", "iPad8,12":                    return "iPad Pro (12.9-inch) (4th generation)"
            case "AppleTV5,3":                              return "Apple TV"
            case "AppleTV6,2":                              return "Apple TV 4K"
            case "AudioAccessory1,1":                       return "HomePod"
            case "i386", "x86_64":                          return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "iOS"))"
            default:                                        return identifier
            }
            #elseif os(tvOS)
            switch identifier {
            case "AppleTV5,3": return "Apple TV 4"
            case "AppleTV6,2": return "Apple TV 4K"
            case "i386", "x86_64": return "Simulator \(mapToDevice(identifier: ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "tvOS"))"
            default: return identifier
            }
            #endif
        }

        return mapToDevice(identifier: identifier)
    }()

}

আপনি এটিকে এভাবে বলেছেন:

let modelName = UIDevice.modelName

প্রকৃত ডিভাইসগুলির জন্য এটি "আইপ্যাড প্রো 9.7 ইঞ্চি" যেমন ফেরত দেয়, সিমুলেটরগুলির জন্য এটি "সিমুলেটর" + সিমুলেটর শনাক্তকারী, যেমন "সিমুলেটর আইপ্যাড প্রো 9.7 ইঞ্চি" দেয়


2
আমি মনে করি এটি দুর্দান্ত (উন্নত সুইফট), এবং আমি এটির জন্য অন্যান্য অপ্টিমাইজেশনগুলি কী করতে পারি তা জানার চেষ্টা করছি। একটি জিনিস হ'ল পুরানো ডিভাইসগুলি আইওএসের পরবর্তী সংস্করণগুলিতে সাফ্ট সমর্থন করে না যেগুলি আইফোন 4 এস এবং আইপ্যাড 2 এর আগে আইওএস 8+ এর পূর্বের যে কোনও কিছুই স্যুইফট উদাহরণের জন্য তালিকাভুক্ত করা অর্থহীন বলে মনে হয়
স্পষ্টলাইট

2
আমি আপনার উদাহরণটি নতুন করে সংশোধন করেছি এবং নীচে একটি নতুন পোস্ট করেছি। সমস্ত ভারী উত্তোলন আপনি এবং অন্যরা দ্বারা সম্পন্ন হয়েছিল। আমি সবেমাত্র পরীক্ষা-নিরীক্ষা করেছি এবং সম্মিলিত ও পরিমার্জন করেছি।
ক্লিয়ারলাইট

2
@HAS প্রতিচ্ছবি আইওএস 9 এ একটি ত্রুটি ফেলছে, তারা কি এটিকে হ্রাস করেছে?
ড্যান বিউলিউ

3
@Doug ভাল প্রশ্ন, আমি সম্ভবত অন্তর্ভুক্ত করেছি উচিত যে উত্তর ... theiphonewiki.com/wiki/Models
রয়েছে

3
আপনি আইফোন এক্সএস, এক্সএস ম্যাক্স এবং এক্সআর দয়া করে :) এটি আপডেট করতে পারেন :)
জর্দান এইচ

157

এই সুইফট 3.0 উদাহরণটি বর্তমান ডিভাইস মডেলটিকে একটি enumধ্রুবক হিসাবে দেয় (স্ট্রিং লিটারেলের সাথে সরাসরি তুলনা এড়ানোর জন্য)। এনামের কাঁচা মান হ'ল Stringমানব-পঠনযোগ্য আইওএস ডিভাইসের নাম ধারণ করে। এটি যেহেতু সুইফট, তাই স্বীকৃত ডিভাইসের তালিকায় কেবলমাত্র আইওএস রিলিজ সমর্থন করার জন্য পর্যাপ্ত মডেল অন্তর্ভুক্ত রয়েছে যার মধ্যে সুইফট অন্তর্ভুক্ত রয়েছে। নিম্নলিখিত ব্যবহারের উদাহরণটি এই উত্তরের শেষে প্রয়োগটি ব্যবহার করে:

    switch UIDevice().type {
    case .iPhone5:
              print("No TouchID sensor")
    case .iPhone5S:
              fallthrough
    case .iPhone6:
              fallthrough
    case .iPhone6plus:
              fallthrough
    case .iPad_Pro9_7:
              fallthrough
    case .iPad_Pro12_9:
              fallthrough
    case .iPhone7:
              fallthrough
    case .iPhone7plus:
              print("Put your thumb on the " + 
                     UIDevice().type.rawValue + " TouchID sensor")
    case .unrecognized:
              print("Device model unrecognized");
    default:
              print(UIDevice().type.rawValue + " not supported by this app");
    }

নতুন অ্যাপ্লিকেশন রিলিজের জন্য এবং অ্যাপল একই ডিভাইস পরিবারের জন্য নতুন মডেল যুক্ত করার সময় আপনার অ্যাপ্লিকেশনটি আপ টু ডেট রাখতে হবে। উদাহরণস্বরূপ, আইফোন 3,1 আইফোন 3,2 আইফোন 3,4 সমস্ত "আইফোন 4"। এমন কোড রচনা করা এড়ান যা নতুন মডেলগুলির জন্য অ্যাকাউন্ট করে না, তাই আপনার অ্যালগরিদমগুলি অপ্রত্যাশিতভাবে কোনও নতুন ডিভাইস কনফিগার করতে বা প্রতিক্রিয়া জানাতে ব্যর্থ হয় না। কৌশলগত সময়ে আপনার অ্যাপ্লিকেশন আপডেট করতে আপনি iOS ডিভাইস মডেল # এর এই রক্ষণাবেক্ষণের তালিকাটি উল্লেখ করতে পারেন ।

iOS এর মধ্যে হার্ডওয়্যার ক্ষমতা এবং পর্দার আকারের মতো পরামিতিগুলি সনাক্ত করতে ডিভাইস-স্বতন্ত্র ইন্টারফেস অন্তর্ভুক্ত। অ্যাপ্লিকেশন সরবরাহ করে এমন জেনারেলাইজড ইন্টারফেসগুলি সাধারণত কোনও অ্যাপ্লিকেশনটির আচরণকে বিভিন্ন হার্ডওয়্যারের সাথে গতিশীল করার জন্য নিরাপদ, সেরা সমর্থিত প্রক্রিয়া। তবুও, নিম্নলিখিত কোডটি প্রোটোটাইপিং, ডিবাগিং, পরীক্ষার জন্য কার্যকর হতে পারে বা যে কোনও সময় কোডের জন্য কোনও নির্দিষ্ট ডিভাইস পরিবারকে টার্গেট করা দরকার। এই কৌশলটি বর্তমান ডিভাইসটির সাধারণ / সর্বজনীনভাবে স্বীকৃত নামের দ্বারা বর্ণনা করতেও কার্যকর হতে পারে।

সুইফট 3

// 1. Declare outside class definition (or in its own file).
// 2. UIKit must be included in file where this code is added.
// 3. Extends UIDevice class, thus is available anywhere in app.
//
// Usage example:
//
//    if UIDevice().type == .simulator {
//       print("You're running on the simulator... boring!")
//    } else {
//       print("Wow! Running on a \(UIDevice().type.rawValue)")
//    }
import UIKit

public enum Model : String {
    case simulator   = "simulator/sandbox",
    iPod1            = "iPod 1",
    iPod2            = "iPod 2",
    iPod3            = "iPod 3",
    iPod4            = "iPod 4",
    iPod5            = "iPod 5",
    iPad2            = "iPad 2",
    iPad3            = "iPad 3",
    iPad4            = "iPad 4",
    iPhone4          = "iPhone 4",
    iPhone4S         = "iPhone 4S",
    iPhone5          = "iPhone 5",
    iPhone5S         = "iPhone 5S",
    iPhone5C         = "iPhone 5C",
    iPadMini1        = "iPad Mini 1",
    iPadMini2        = "iPad Mini 2",
    iPadMini3        = "iPad Mini 3",
    iPadAir1         = "iPad Air 1",
    iPadAir2         = "iPad Air 2",
    iPadPro9_7       = "iPad Pro 9.7\"",
    iPadPro9_7_cell  = "iPad Pro 9.7\" cellular",
    iPadPro10_5      = "iPad Pro 10.5\"",
    iPadPro10_5_cell = "iPad Pro 10.5\" cellular",
    iPadPro12_9      = "iPad Pro 12.9\"",
    iPadPro12_9_cell = "iPad Pro 12.9\" cellular",
    iPhone6          = "iPhone 6",
    iPhone6plus      = "iPhone 6 Plus",
    iPhone6S         = "iPhone 6S",
    iPhone6Splus     = "iPhone 6S Plus",
    iPhoneSE         = "iPhone SE",
    iPhone7          = "iPhone 7",
    iPhone7plus      = "iPhone 7 Plus",
    iPhone8          = "iPhone 8",
    iPhone8plus      = "iPhone 8 Plus",
    iPhoneX          = "iPhone X",
    iPhoneXS         = "iPhone XS",
    iPhoneXSmax      = "iPhone XS Max",
    iPhoneXR         = "iPhone XR",
    iPhone11         = "iPhone 11",
    iPhone11Pro      = "iPhone 11 Pro",
    iPhone11ProMax   = "iPhone 11 Pro Max",
    unrecognized     = "?unrecognized?"
}

public extension UIDevice {
    public var type: Model {
        var systemInfo = utsname()
        uname(&systemInfo)
        let modelCode = withUnsafePointer(to: &systemInfo.machine) {
            $0.withMemoryRebound(to: CChar.self, capacity: 1) {
                ptr in String.init(validatingUTF8: ptr)

            }
        }
        var modelMap : [ String : Model ] = [
            "i386"       : .simulator,
            "x86_64"     : .simulator,
            "iPod1,1"    : .iPod1,
            "iPod2,1"    : .iPod2,
            "iPod3,1"    : .iPod3,
            "iPod4,1"    : .iPod4,
            "iPod5,1"    : .iPod5,
            "iPad2,1"    : .iPad2,
            "iPad2,2"    : .iPad2,
            "iPad2,3"    : .iPad2,
            "iPad2,4"    : .iPad2,
            "iPad2,5"    : .iPadMini1,
            "iPad2,6"    : .iPadMini1,
            "iPad2,7"    : .iPadMini1,
            "iPhone3,1"  : .iPhone4,
            "iPhone3,2"  : .iPhone4,
            "iPhone3,3"  : .iPhone4,
            "iPhone4,1"  : .iPhone4S,
            "iPhone5,1"  : .iPhone5,
            "iPhone5,2"  : .iPhone5,
            "iPhone5,3"  : .iPhone5C,
            "iPhone5,4"  : .iPhone5C,
            "iPad3,1"    : .iPad3,
            "iPad3,2"    : .iPad3,
            "iPad3,3"    : .iPad3,
            "iPad3,4"    : .iPad4,
            "iPad3,5"    : .iPad4,
            "iPad3,6"    : .iPad4,
            "iPhone6,1"  : .iPhone5S,
            "iPhone6,2"  : .iPhone5S,
            "iPad4,1"    : .iPadAir1,
            "iPad4,2"    : .iPadAir2,
            "iPad4,4"    : .iPadMini2,
            "iPad4,5"    : .iPadMini2,
            "iPad4,6"    : .iPadMini2,
            "iPad4,7"    : .iPadMini3,
            "iPad4,8"    : .iPadMini3,
            "iPad4,9"    : .iPadMini3,
            "iPad6,3"    : .iPadPro9_7,
            "iPad6,11"   : .iPadPro9_7,
            "iPad6,4"    : .iPadPro9_7_cell,
            "iPad6,12"   : .iPadPro9_7_cell,
            "iPad6,7"    : .iPadPro12_9,
            "iPad6,8"    : .iPadPro12_9_cell,
            "iPad7,3"    : .iPadPro10_5,
            "iPad7,4"    : .iPadPro10_5_cell,
            "iPhone7,1"  : .iPhone6plus,
            "iPhone7,2"  : .iPhone6,
            "iPhone8,1"  : .iPhone6S,
            "iPhone8,2"  : .iPhone6Splus,
            "iPhone8,4"  : .iPhoneSE,
            "iPhone9,1"  : .iPhone7,
            "iPhone9,2"  : .iPhone7plus,
            "iPhone9,3"  : .iPhone7,
            "iPhone9,4"  : .iPhone7plus,
            "iPhone10,1" : .iPhone8,
            "iPhone10,2" : .iPhone8plus,
            "iPhone10,3" : .iPhoneX,
            "iPhone10,6" : .iPhoneX,
            "iPhone11,2" : .iPhoneXS,
            "iPhone11,4" : .iPhoneXSmax,
            "iPhone11,6" : .iPhoneXSmax,
            "iPhone11,8" : .iPhoneXR,
            "iPhone12,1" : .iPhone11,
            "iPhone12,3" : .iPhone11Pro,
            "iPhone12,5" : .iPhone11ProMax
        ]

    if let model = modelMap[String.init(validatingUTF8: modelCode!)!] {
            return model
        }
        return Model.unrecognized
    }
}

সুইফট 2 প্রতিস্থাপন করুন: দিন সঙ্গে machinePtr = অগ্রিম (ptr.baseAddress, INT (_SYS_NAMELEN * 4)) দিন machinePtr = ptr.baseAddress.advancedBy (INT (_SYS_NAMELEN * 4))
DrPatience

আপনার কাছে নকল কী রয়েছে modelMapযা Duplicate literals in keys
আইওএসকে

3
সর্বশেষতম সুইফ্ট 3.0.2 অংশ সম্পর্কে অভিযোগ if let model = modelMap[String.fromCString(modelCode!)!]। ওয়ার্কারআউন্ডটি প্রথমে সিএসস্ট্রিংকে ডিকোডিং করা যায় এবং তারপরে ডিকোড স্ট্রিং খাওয়ানো যায় modelMap `if (str, _) = স্ট্রিং.ডেকোডসিএসট্রিং (মডেলকোড, হিসাবে: UTF8.self, रिपাইরিংআইডিয়োডকোড ইউনাইটস: মিথ্যা) {যদি মডেল = মডেলম্যাপ [str] {রিটার্ন মডেল} ``
আলেক্পেরোস

3
যেমন @alekperos বলেছে কোডটিতে একটি টাইপো রয়েছে। এটি হওয়া উচিত:if let model = modelMap[String.init(validatingUTF8: deviceModelCode()!)!] { return model }
wuf810

ডোজ কেউ জানেন যে স্ট্রিংটি মডেলকোড হিসাবে ফিরে আসবে! ব্যবহারকারী যদি আইফোনএসই ব্যবহার করেন?
কং বাইুল

117

ডিভাইস এবং সিমুলেটর উভয়ই 2020 এ আপডেট হয়েছে সুইফ্ট 5.2.x

এবং নতুন সর্বশেষতম আইপ্যাড প্রো 11 " , আইপ্যাড এয়ার 3 য় প্রজন্ম এবং আইপ্যাড প্রো 3 প্রজন্ম , আইফোন 11, 11 প্রো এবং 11 প্রো ম্যাক্স এবং আইফোন এসই দ্বিতীয় প্রজন্ম

এই পদ্ধতিটি সিমুলেটর থাকলেও সঠিক মডেলটি সনাক্ত করে। ( আপনার সিমুলেটারে চলমান সিমুলেটর ডিভাইস মডেলের সঠিক নাম )

public enum Model : String {

//Simulator
case simulator     = "simulator/sandbox",

//iPod
iPod1              = "iPod 1",
iPod2              = "iPod 2",
iPod3              = "iPod 3",
iPod4              = "iPod 4",
iPod5              = "iPod 5",

//iPad
iPad2              = "iPad 2",
iPad3              = "iPad 3",
iPad4              = "iPad 4",
iPadAir            = "iPad Air ",
iPadAir2           = "iPad Air 2",
iPadAir3           = "iPad Air 3",
iPad5              = "iPad 5", //iPad 2017
iPad6              = "iPad 6", //iPad 2018
iPad7              = "iPad 7", //iPad 2019

//iPad Mini
iPadMini           = "iPad Mini",
iPadMini2          = "iPad Mini 2",
iPadMini3          = "iPad Mini 3",
iPadMini4          = "iPad Mini 4",
iPadMini5          = "iPad Mini 5",

//iPad Pro
iPadPro9_7         = "iPad Pro 9.7\"",
iPadPro10_5        = "iPad Pro 10.5\"",
iPadPro11          = "iPad Pro 11\"",
iPadPro12_9        = "iPad Pro 12.9\"",
iPadPro2_12_9      = "iPad Pro 2 12.9\"",
iPadPro3_12_9      = "iPad Pro 3 12.9\"",

//iPhone
iPhone4            = "iPhone 4",
iPhone4S           = "iPhone 4S",
iPhone5            = "iPhone 5",
iPhone5S           = "iPhone 5S",
iPhone5C           = "iPhone 5C",
iPhone6            = "iPhone 6",
iPhone6Plus        = "iPhone 6 Plus",
iPhone6S           = "iPhone 6S",
iPhone6SPlus       = "iPhone 6S Plus",
iPhoneSE           = "iPhone SE",
iPhone7            = "iPhone 7",
iPhone7Plus        = "iPhone 7 Plus",
iPhone8            = "iPhone 8",
iPhone8Plus        = "iPhone 8 Plus",
iPhoneX            = "iPhone X",
iPhoneXS           = "iPhone XS",
iPhoneXSMax        = "iPhone XS Max",
iPhoneXR           = "iPhone XR",
iPhone11           = "iPhone 11",
iPhone11Pro        = "iPhone 11 Pro",
iPhone11ProMax     = "iPhone 11 Pro Max",
iPhoneSE2          = "iPhone SE 2nd gen",

//Apple TV
AppleTV            = "Apple TV",
AppleTV_4K         = "Apple TV 4K",
unrecognized       = "?unrecognized?"
}

// #-#-#-#-#-#-#-#-#-#-#-#-#
// MARK: UIDevice extensions
// #-#-#-#-#-#-#-#-#-#-#-#-#

public extension UIDevice {

var type: Model {
    var systemInfo = utsname()
    uname(&systemInfo)
    let modelCode = withUnsafePointer(to: &systemInfo.machine) {
        $0.withMemoryRebound(to: CChar.self, capacity: 1) {
            ptr in String.init(validatingUTF8: ptr)
        }
    }

    let modelMap : [String: Model] = [

        //Simulator
        "i386"      : .simulator,
        "x86_64"    : .simulator,

        //iPod
        "iPod1,1"   : .iPod1,
        "iPod2,1"   : .iPod2,
        "iPod3,1"   : .iPod3,
        "iPod4,1"   : .iPod4,
        "iPod5,1"   : .iPod5,

        //iPad
        "iPad2,1"   : .iPad2,
        "iPad2,2"   : .iPad2,
        "iPad2,3"   : .iPad2,
        "iPad2,4"   : .iPad2,
        "iPad3,1"   : .iPad3,
        "iPad3,2"   : .iPad3,
        "iPad3,3"   : .iPad3,
        "iPad3,4"   : .iPad4,
        "iPad3,5"   : .iPad4,
        "iPad3,6"   : .iPad4,
        "iPad6,11"  : .iPad5, //iPad 2017
        "iPad6,12"  : .iPad5,
        "iPad7,5"   : .iPad6, //iPad 2018
        "iPad7,6"   : .iPad6,
        "iPad7,11"  : .iPad7, //iPad 2019
        "iPad7,12"  : .iPad7,

        //iPad Mini
        "iPad2,5"   : .iPadMini,
        "iPad2,6"   : .iPadMini,
        "iPad2,7"   : .iPadMini,
        "iPad4,4"   : .iPadMini2,
        "iPad4,5"   : .iPadMini2,
        "iPad4,6"   : .iPadMini2,
        "iPad4,7"   : .iPadMini3,
        "iPad4,8"   : .iPadMini3,
        "iPad4,9"   : .iPadMini3,
        "iPad5,1"   : .iPadMini4,
        "iPad5,2"   : .iPadMini4,
        "iPad11,1"  : .iPadMini5,
        "iPad11,2"  : .iPadMini5,

        //iPad Pro
        "iPad6,3"   : .iPadPro9_7,
        "iPad6,4"   : .iPadPro9_7,
        "iPad7,3"   : .iPadPro10_5,
        "iPad7,4"   : .iPadPro10_5,
        "iPad6,7"   : .iPadPro12_9,
        "iPad6,8"   : .iPadPro12_9,
        "iPad7,1"   : .iPadPro2_12_9,
        "iPad7,2"   : .iPadPro2_12_9,
        "iPad8,1"   : .iPadPro11,
        "iPad8,2"   : .iPadPro11,
        "iPad8,3"   : .iPadPro11,
        "iPad8,4"   : .iPadPro11,
        "iPad8,5"   : .iPadPro3_12_9,
        "iPad8,6"   : .iPadPro3_12_9,
        "iPad8,7"   : .iPadPro3_12_9,
        "iPad8,8"   : .iPadPro3_12_9,

        //iPad Air
        "iPad4,1"   : .iPadAir,
        "iPad4,2"   : .iPadAir,
        "iPad4,3"   : .iPadAir,
        "iPad5,3"   : .iPadAir2,
        "iPad5,4"   : .iPadAir2,
        "iPad11,3"  : .iPadAir3,
        "iPad11,4"  : .iPadAir3,


        //iPhone
        "iPhone3,1" : .iPhone4,
        "iPhone3,2" : .iPhone4,
        "iPhone3,3" : .iPhone4,
        "iPhone4,1" : .iPhone4S,
        "iPhone5,1" : .iPhone5,
        "iPhone5,2" : .iPhone5,
        "iPhone5,3" : .iPhone5C,
        "iPhone5,4" : .iPhone5C,
        "iPhone6,1" : .iPhone5S,
        "iPhone6,2" : .iPhone5S,
        "iPhone7,1" : .iPhone6Plus,
        "iPhone7,2" : .iPhone6,
        "iPhone8,1" : .iPhone6S,
        "iPhone8,2" : .iPhone6SPlus,
        "iPhone8,4" : .iPhoneSE,
        "iPhone9,1" : .iPhone7,
        "iPhone9,3" : .iPhone7,
        "iPhone9,2" : .iPhone7Plus,
        "iPhone9,4" : .iPhone7Plus,
        "iPhone10,1" : .iPhone8,
        "iPhone10,4" : .iPhone8,
        "iPhone10,2" : .iPhone8Plus,
        "iPhone10,5" : .iPhone8Plus,
        "iPhone10,3" : .iPhoneX,
        "iPhone10,6" : .iPhoneX,
        "iPhone11,2" : .iPhoneXS,
        "iPhone11,4" : .iPhoneXSMax,
        "iPhone11,6" : .iPhoneXSMax,
        "iPhone11,8" : .iPhoneXR,
        "iPhone12,1" : .iPhone11,
        "iPhone12,3" : .iPhone11Pro,
        "iPhone12,5" : .iPhone11ProMax,
        "iPhone12,8" : .iPhoneSE2,

        //Apple TV
        "AppleTV5,3" : .AppleTV,
        "AppleTV6,2" : .AppleTV_4K
    ]

    if let model = modelMap[String.init(validatingUTF8: modelCode!)!] {
        if model == .simulator {
            if let simModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
                if let simModel = modelMap[String.init(validatingUTF8: simModelCode)!] {
                    return simModel
                }
            }
        }
        return model
    }
    return Model.unrecognized
  }
}

ব্যবহার : আপনি সহজেই এর সাথে ডিভাইস মডেলটি পেতে পারেন:

let deviceType = UIDevice().type

বা এর সাথে সঠিক স্ট্রিংটি মুদ্রণ করুন:

print("Running on: \(UIDevice().type)")
Output -> "iPhone X"

মামলাগুলির সাথে আরেকটি উদাহরণ :

var myDefaultFontSize: CGFloat = 26.0
switch UIDevice().type {
    case .iPhoneSE, .iPhone5, .iPhone5S: print("default value")
    case .iPhone6, .iPhone7, .iPhone8, .iPhone6S, .iPhoneX: myDefaultFontSize += 4
    default: break
}

অ্যাপল ডিভাইসগুলির মডেলগুলির জন্য এখানে যান: https://www.theiphonewiki.com/wiki/ মডেলগুলি


2
আপনার আউটপুটটি ভুল, আপনাকে UIDevice().type.rawvalueস্পেস সহ ডিভাইসের নাম পাওয়ার জন্য জিজ্ঞাসা করতে হবে।
রাদু উরশাচে

স্পেস ব্যবহার করে UIDevice().typeআমি বিন্যাসিত সংস্করণটি পাচ্ছি না , এবং আমি যদি .rawvalueএর শেষে যুক্ত করি তবে আমি উল্লেখ করে একটি ত্রুটি পেয়েছি: 'মডেল' টাইপের মানটির কোনও সদস্য 'কাঁচা মূল্য নেই'
ডিজেফায়ার

@ ডিজেফায়ার সম্পর্কে rawvalue, সুইফট 5 এর সাথে এটি আর প্রয়োজন হয় না , আমি সেই লাইনটি আপডেট করেছি। আমি এখন কোডটি পরীক্ষা করেছি এবং এটি সঠিকভাবে কাজ করে, আপনি কোন ধরণের ডিভাইসটি পরীক্ষা করার চেষ্টা করছেন? UIDeviceআপনার প্রজেজে কি আপনার অন্যান্য এক্সটেনশন রয়েছে?
আলেসান্দ্রো অর্নানো

@ আলেসান্দ্রো ওর্নানো আমি একটি আইফোন 6 এস এবং একটি আইফোন এক্সএস ম্যাক্স পরীক্ষা করছি। কনসোল মুদ্রণ এবং একটি পরিবর্তনশীল হিসাবে ব্যবহার উভয় ফাঁকা ছাড়াই এটি ফেরত। সমস্ত সফ্টওয়্যার সর্বশেষ সর্বজনীন প্রকাশ is UIDeviceআপনার কাছ থেকে অন্য কোনও এক্সটেনশন (এক উত্সর্গীকৃত সুইফ্ট ফাইলে রাখা)
ডিজেফায়ার

1
আইফোন এসই দ্বিতীয় জেনারেশন যোগ করুন। iPhone12,8
স্বর্গীয়

102

তবুও অন্য / সাধারণ বিকল্প ( https://www.theiphonewiki.com/wiki/Models এ মডেল শনাক্তকারী রেফারেন্স পাওয়া গেছে ):

স্ট্রিং ট্রিমিং এবং সিমুলেটর সহায়তা সহ সুইফট 3/4/5 এর জন্য আপডেট উত্তর:

func modelIdentifier() -> String {
    if let simulatorModelIdentifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] { return simulatorModelIdentifier }
    var sysinfo = utsname()
    uname(&sysinfo) // ignore return value
    return String(bytes: Data(bytes: &sysinfo.machine, count: Int(_SYS_NAMELEN)), encoding: .ascii)!.trimmingCharacters(in: .controlCharacters)
}

1
মহান। সহজ উত্তর
সাজ্জাদ হিশাইন খান

এই পাবলিক এপিআই নাকি প্রাইভেট? আমি বোঝাতে চাইছি আমি অ্যাপ্লিকেশন স্টোরে যে অ্যাপ্লিকেশনটি রাখতে চাইছি এটি কি আমার অ্যাপ্লিকেশনটিতে ব্যবহার করতে পারি?
জাফর খোশতাবায়াত

1
হাই @ জাফরখোশতাবায়াত :) এটি ইউনিক্সের একটি অংশ এবং আমি এটি বহু বছর ধরে অ্যাপ স্টোরের অ্যাপ্লিকেশনগুলিতে ব্যবহার করেছি :)
জেনস

1
সিমুলেটর সনাক্তকরণ ব্যবহারের জন্য: #if টার্গেট এনভায়রনমেন্ট (সিমুলেটর) #endif
গুট

আপনার যদি ম্যাকো এবং আইওএস জুড়ে কাজ করার প্রয়োজন হয় তবে এটি সর্বোত্তম উত্তর।
22:36

23

আমি @ এইচএস এর উত্তরে সিমুলেটর মডেল আইডেন্টিফায়ার বেস অন্তর্ভুক্ত করতে ইউআইডিভাইসিতে আরেকটি নমুনা বর্ধন করেছি । এটি উপরের সুইফট ৩.২ এর সাথে দুর্দান্ত কাজ করছে (এতে সুইফট ৪.x, সুইফট ৫ অন্তর্ভুক্ত):

let modelName = UIDevice.current.modelName

নতুন অ্যাড মডেলগুলি: আইফোন 11, আইফোন 11 প্রো, আইফোন 11 প্রো সর্বোচ্চ

public extension UIDevice {

    /// pares the deveice name as the standard name
    var modelName: String {

        #if targetEnvironment(simulator)
            let identifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"]!
        #else
            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)))
            }
        #endif

        switch identifier {
        case "iPod5,1":                                 return "iPod Touch 5"
        case "iPod7,1":                                 return "iPod Touch 6"
        case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
        case "iPhone4,1":                               return "iPhone 4s"
        case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
        case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
        case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
        case "iPhone7,2":                               return "iPhone 6"
        case "iPhone7,1":                               return "iPhone 6 Plus"
        case "iPhone8,1":                               return "iPhone 6s"
        case "iPhone8,2":                               return "iPhone 6s Plus"
        case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
        case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
        case "iPhone8,4":                               return "iPhone SE"
        case "iPhone10,1", "iPhone10,4":                return "iPhone 8"
        case "iPhone10,2", "iPhone10,5":                return "iPhone 8 Plus"
        case "iPhone10,3", "iPhone10,6":                return "iPhone X"
        case "iPhone11,2":                              return "iPhone XS"
        case "iPhone11,4", "iPhone11,6":                return "iPhone XS Max"
        case "iPhone11,8":                              return "iPhone XR"
        case "iPhone12,1":                              return "iPhone 11"
        case "iPhone12,3":                              return "iPhone 11 Pro"
        case "iPhone12,5":                              return "iPhone 11 Pro Max"
        case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
        case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
        case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
        case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
        case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
        case "iPad6,11", "iPad6,12":                    return "iPad 5"
        case "iPad7,5", "iPad7,6":                      return "iPad 6"
        case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
        case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
        case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
        case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
        case "iPad6,3", "iPad6,4":                      return "iPad Pro 9.7 Inch"
        case "iPad6,7", "iPad6,8":                      return "iPad Pro 12.9 Inch"
        case "iPad7,1", "iPad7,2":                      return "iPad Pro (12.9-inch) (2nd generation)"
        case "iPad7,3", "iPad7,4":                      return "iPad Pro (10.5-inch)"
        case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4":return "iPad Pro (11-inch)"
        case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8":return "iPad Pro (12.9-inch) (3rd generation)"
        case "AppleTV5,3":                              return "Apple TV"
        case "AppleTV6,2":                              return "Apple TV 4K"
        case "AudioAccessory1,1":                       return "HomePod"
        default:                                        return identifier
        }
    }

}

17

উভয় ডিভাইসের পাশাপাশি সিমুলেটরগুলির জন্য, ইউআইডিএভাইস.সুইফ্ট নামের একটি নতুন সুইফট ফাইল তৈরি করুন

নীচের কোড যুক্ত করুন

import UIKit


public extension UIDevice {

var modelName: String {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        let DEVICE_IS_SIMULATOR = true
    #else
        let DEVICE_IS_SIMULATOR = false
    #endif

    var machineString : String = ""

    if DEVICE_IS_SIMULATOR == true
    {

        if let dir = NSProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
            machineString = dir
        }
    }
    else {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        machineString = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8 where value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }
    }
    switch machineString {
    case "iPod5,1":                                 return "iPod Touch 5"
    case "iPod7,1":                                 return "iPod Touch 6"
    case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
    case "iPhone4,1":                               return "iPhone 4s"
    case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
    case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
    case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
    case "iPhone7,2":                               return "iPhone 6"
    case "iPhone7,1":                               return "iPhone 6 Plus"
    case "iPhone8,1":                               return "iPhone 6s"
    case "iPhone8,2":                               return "iPhone 6s Plus"
    case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
    case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
    case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
    case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
    case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
    case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
    case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
    case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
    case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
    case "iPad6,7", "iPad6,8":                      return "iPad Pro"
    case "AppleTV5,3":                              return "Apple TV"
    default:                                        return machineString
    }
}
}

তারপরে আপনার ভিউকন্ট্রোলারে,

 let deviceType = UIDevice.currentDevice().modelName

    if deviceType.lowercaseString.rangeOfString("iphone 4") != nil {
       print("iPhone 4 or iphone 4s")
    }
    else if deviceType.lowercaseString.rangeOfString("iphone 5") != nil {
        print("iPhone 5 or iphone 5s or iphone 5c")
    }
   else if deviceType.lowercaseString.rangeOfString("iphone 6") != nil {
        print("iPhone 6 Series")
    }

এক্সকোড .2.২ বলছে যে লাইনে dir = NSProcessInfo ()। পরিবেশ ["সিমুলেটর_মোডেল_আইডিএনটিএফআইআর"] কখনই কার্যকর করা হবে না।
দীপক ঠাকুর

@ প্রদীপঠাকুর, আপনি কি সিমুলেটর চালানোর চেষ্টা করেছিলেন? আমিও
এক্সকোড .2.২

আইফোন 6 এবং আইফোন 6 প্লাস আকার পৃথক পৃথক। কীভাবে এটি পরিচালনা করবেন?
জয়প্রকাশ দুবে 12

@ জয়প্রকাশ দুবে, এই পদ্ধতিতে এটি 6 আইফোনটির জন্য "আইফোন 6 প্লাস" ফিরিয়ে দেবে, আপনি যাচাই করতে পারবেন ...
আজিক আবদুল্লাহ

আর উদ্দেশ্য সি কাল্পনিক ধরনের পাওয়া সমতূল্য: [NSProcessInfo processInfo] .environment [@ "SIMULATOR_MODEL_IDENTIFIER"]
jk7

12

সি স্ট্রাক্টের সাথে ডিল করা দ্রুত বেদনাদায়ক। বিশেষত যদি তারা এতে কোনও ধরণের সি অ্যারে করে থাকে। এখানে আমার সমাধান: উদ্দেশ্য-সি ব্যবহার করা চালিয়ে যান। কেবল একটি মোড়ক উদ্দেশ্য-সি শ্রেণি তৈরি করুন যা এই কাজটি করে এবং তারপরে দ্রুত এই ক্লাসটি ব্যবহার করে। এখানে একটি নমুনা বর্গ যা ঠিক এটি করে:

@interface DeviceInfo : NSObject

+ (NSString *)model;

@end

#import "DeviceInfo.h"
#import <sys/utsname.h>

@implementation DeviceInfo

+ (NSString *)model
{
    struct utsname systemInfo;
    uname(&systemInfo);

    return [NSString stringWithCString: systemInfo.machine encoding: NSUTF8StringEncoding];
}

@end

দ্রুত দিকে:

let deviceModel = DeviceInfo.model()

ধন্যবাদ mstysf। তবে আমি মনে করি যে আমি এখানে < স্ট্যাকওভারফ্লো . com/ a/ 25380129 > এর সমাধান পেয়েছি । তবে, আপনি কি জানেন যে আইফোন সিমুলেটরগুলির (আইফোন 4, আইফোন 5, আইফোন 6) এর মধ্যে বলা সম্ভব কিনা? কারণ আমার কাছে মনে হচ্ছে এটি কেবল আইফোন সিমুলেটরগুলির জন্য "x86_64" ফিরিয়ে দেয় আমি কোন মডেলই বেছে নিই না।
ম্যাক সিস্টেম

দুঃখিত, আমি মনে করি মোকাবিলা করার সময় একটি ত্রুটি ঘটেছে। এখানে লিঙ্কটি রয়েছে: stackoverflow.com/a/25380129/2640210
ম্যাক সিস্টেম

1
@ দ্য ম্যাচসিস্টেম এটাই এই পদ্ধতির সম্পূর্ণ সমস্যা। বেশিরভাগ ক্ষেত্রেই আপনার অ্যাপ্লিকেশনটির আচরণটি মানিয়ে নেওয়ার সঠিক উপায় নয়। আপনার যেখানে প্রয়োজন সেখানে আরও সাধারণ মানের স্ট্যান্ডার্ড আইওএস ইন্টারফেস ব্যবহার করে হার্ডওয়্যার কনফিগারেশন এবং বৈশিষ্ট্যগুলি স্নিগ্ধ করা উচিত যদিও এর জন্য আরও কিছু গবেষণা এবং কোডিং প্রচেষ্টা প্রয়োজন হতে পারে।
স্পষ্টলাইট

@ দ্যম্যাচসিস্টেমটি সম্ভবত কিছুটা দেরিতে চিমিং করতে পারে তবে আপনার প্রশ্নের উত্তর (যদি সিমুলেটারে আইডাভাইস মডেলগুলির মধ্যে পার্থক্য করা সম্ভব হয় তবে) হয় না। কারণ আপনি পেয়ে থাকেন x86_64থেকে utsnameযে সিমুলেটার আসলে যা হয়েছে আপনার কম্পিউটারে হয় machineসম্পত্তি x86_64। পরিবর্তন করে ব্যবহার করে দেখুন .machineজন্য .nodenameআপনার পদ্ধতিতে ফেরত মান ভালো কিছু হতে হবে My-iMac.local
xoudini

9

প্রদত্ত কয়েকটি উত্তরের ভিত্তিতে ব্যবহৃত ডিভাইস সনাক্ত করতে আমি একটি সুপার-লাইটওয়েট লাইব্রেরি প্রয়োগ করেছি : https://github.com/schickling/Device.swift

এটি কার্থেজের মাধ্যমে ইনস্টল করা যেতে পারে এবং এটি ব্যবহার করা যেতে পারে :

import Device

let deviceType = UIDevice.currentDevice().deviceType

switch deviceType {
case .IPhone6: print("Do stuff for iPhone6")
case .IPadMini: print("Do stuff for iPad mini")
default: print("Check other available cases of DeviceType")
}

8

আমি দেখতে পেয়েছি যে এই সমস্ত উত্তরগুলি স্ট্রিং ব্যবহার করে। আমি এনাম ব্যবহারের জন্য @ উত্তর উত্তরটি পরিবর্তন করার সিদ্ধান্ত নিয়েছি:

public enum Devices: String {
    case IPodTouch5
    case IPodTouch6
    case IPhone4
    case IPhone4S
    case IPhone5
    case IPhone5C
    case IPhone5S
    case IPhone6
    case IPhone6Plus
    case IPhone6S
    case IPhone6SPlus
    case IPhone7
    case IPhone7Plus
    case IPhoneSE
    case IPad2
    case IPad3
    case IPad4
    case IPadAir
    case IPadAir2
    case IPadMini
    case IPadMini2
    case IPadMini3
    case IPadMini4
    case IPadPro
    case AppleTV
    case Simulator
    case Other
}

public extension UIDevice {

    public var modelName: Devices {
        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)))
        }

        switch identifier {
        case "iPod5,1":                                 return Devices.IPodTouch5
        case "iPod7,1":                                 return Devices.IPodTouch6
        case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return Devices.IPhone4
        case "iPhone4,1":                               return Devices.IPhone4S
        case "iPhone5,1", "iPhone5,2":                  return Devices.IPhone5
        case "iPhone5,3", "iPhone5,4":                  return Devices.IPhone5C
        case "iPhone6,1", "iPhone6,2":                  return Devices.IPhone5S
        case "iPhone7,2":                               return Devices.IPhone6
        case "iPhone7,1":                               return Devices.IPhone6Plus
        case "iPhone8,1":                               return Devices.IPhone6S
        case "iPhone8,2":                               return Devices.IPhone6SPlus
        case "iPhone9,1", "iPhone9,3":                  return Devices.IPhone7
        case "iPhone9,2", "iPhone9,4":                  return Devices.IPhone7Plus
        case "iPhone8,4":                               return Devices.IPhoneSE
        case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return Devices.IPad2
        case "iPad3,1", "iPad3,2", "iPad3,3":           return Devices.IPad3
        case "iPad3,4", "iPad3,5", "iPad3,6":           return Devices.IPad4
        case "iPad4,1", "iPad4,2", "iPad4,3":           return Devices.IPadAir
        case "iPad5,3", "iPad5,4":                      return Devices.IPadAir2
        case "iPad2,5", "iPad2,6", "iPad2,7":           return Devices.IPadMini
        case "iPad4,4", "iPad4,5", "iPad4,6":           return Devices.IPadMini2
        case "iPad4,7", "iPad4,8", "iPad4,9":           return Devices.IPadMini3
        case "iPad5,1", "iPad5,2":                      return Devices.IPadMini4
        case "iPad6,3", "iPad6,4", "iPad6,7", "iPad6,8":return Devices.IPadPro
        case "AppleTV5,3":                              return Devices.AppleTV
        case "i386", "x86_64":                          return Devices.Simulator
        default:                                        return Devices.Other
        }
    }

}

7

সুইফট 3 (এক্সকোড 8.3) ব্যবহার করে

 func deviceName() -> String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let str = withUnsafePointer(to: &systemInfo.machine.0) { ptr in
            return String(cString: ptr)
        }
        return str
    }

দ্রষ্টব্য: অফিসিয়াল দেব ফোরামের উত্তর অনুসারে, এইভাবে টিপলগুলি ব্যবহার করা নিরাপদ। বড় ইন্ট 8 টিপলের জন্য মেমরি সারিবদ্ধকরণটি এটির মতোই বড় হবে যেমন এটি কোনও বড় ইন্টার 8 টি অ্যারে রয়েছে। অর্থাত: সংক্ষিপ্ত এবং প্যাডযুক্ত নয়।


এই একটির অ-ইউআইকিট নির্ভর না হওয়ার যুক্ত বোনাস রয়েছে
বিশিরলে

7

সুইফট 5

/// Obtain the machine hardware platform from the `uname()` unix command
///
/// Example of return values
///  - `"iPhone8,1"` = iPhone 6s
///  - `"iPad6,7"` = iPad Pro (12.9-inch)
static var unameMachine: String {
    var utsnameInstance = utsname()
    uname(&utsnameInstance)
    let optionalString: String? = withUnsafePointer(to: &utsnameInstance.machine) {
        $0.withMemoryRebound(to: CChar.self, capacity: 1) {
            ptr in String.init(validatingUTF8: ptr)
        }
    }
    return optionalString ?? "N/A"
}

1
এই একটির অ-ইউআইকিট নির্ভর না হওয়ার যুক্ত বোনাস রয়েছে
বিশিরলে

লজ্জাজনক, এই সমাধানটি দুর্দান্ত দেখাচ্ছে। তবে আমি এটি সুইফট 5 এ কাজ করতে পারি না কোনও পরামর্শ?
হিউম্যান

@ হিউম্যান আমি কোড স্নিপেটটি সুইফট 5-এ আপডেট করেছি।
নিউনি

নোট করুন যে এটি আইফোন 6 এস উদাহরণস্বরূপ ফেরত দেয় না, এটি আইফোন 8,1 প্রদান করে।
জর্ডান এইচ

একটি আইফোন 6 এর জন্য আইফোন 7 রিটার্ন করে তাই এটি ব্যবহারের বিরুদ্ধে পরামর্শ দিন।
j1234

6

আপনি যখন সুইফট 3 ব্যবহার করছেন তখন গৃহীত উত্তরের সাথে কিছু সমস্যা আছে! এই উত্তর (NAZIK থেকে অনুপ্রাণিত) সুইফট 3 এবং নতুন আইফোন মডেলগুলির সাথে কাজ করে:

import UIKit


public extension UIDevice {
var modelName: String {
    #if (arch(i386) || arch(x86_64)) && os(iOS)
        let DEVICE_IS_SIMULATOR = true
    #else
        let DEVICE_IS_SIMULATOR = false
    #endif

    var machineString = String()

    if DEVICE_IS_SIMULATOR == true
    {
        if let dir = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
            machineString = dir
        }
    }
    else {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        machineString = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8 , value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }
    }
    switch machineString {
    case "iPod4,1":                                 return "iPod Touch 4G"
    case "iPod5,1":                                 return "iPod Touch 5G"
    case "iPod7,1":                                 return "iPod Touch 6G"
    case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
    case "iPhone4,1":                               return "iPhone 4s"
    case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
    case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
    case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
    case "iPhone7,2":                               return "iPhone 6"
    case "iPhone7,1":                               return "iPhone 6 Plus"
    case "iPhone8,1":                               return "iPhone 6s"
    case "iPhone8,2":                               return "iPhone 6s Plus"
    case "iPhone8,4":                               return "iPhone SE"
    case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
    case "iPhone9,2", "iPhone 9,4":                 return "iPhone 7 Plus"
    case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
    case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
    case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
    case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
    case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
    case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
    case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
    case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
    case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
    case "iPad6,3", "iPad6,4":                      return "iPad Pro (9.7 inch)"
    case "iPad6,7", "iPad6,8":                      return "iPad Pro (12.9 inch)"
    case "AppleTV5,3":                              return "Apple TV"
    default:                                        return machineString
    }
}
}

6

সুইফট ৩.০ বা উচ্চতর

import UIKit

class ViewController: UIViewController {

    let device = UIDevice.current

    override func viewDidLoad() {
        super.viewDidLoad()

        let model = device.model
        print(model) // e.g. "iPhone"

        let modelName = device.modelName
        print(modelName) // e.g. "iPhone 6"  /* see the extension */

        let deviceName = device.name
        print(deviceName) // e.g. "My iPhone"

        let systemName = device.systemName
        print(systemName) // e.g. "iOS"

        let systemVersion = device.systemVersion
        print(systemVersion) // e.g. "10.3.2"

        if let identifierForVendor = device.identifierForVendor {

            print(identifierForVendor) // e.g. "E1X2XX34-5X6X-7890-123X-XXX456C78901"
        }
    }
}

এবং নিম্নলিখিত এক্সটেনশন যুক্ত করুন

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)))
        }

        switch identifier {

        case "iPod5,1":                                 return "iPod Touch 5"
        case "iPod7,1":                                 return "iPod Touch 6"
        case "iPhone3,1", "iPhone3,2", "iPhone3,3":     return "iPhone 4"
        case "iPhone4,1":                               return "iPhone 4s"
        case "iPhone5,1", "iPhone5,2":                  return "iPhone 5"
        case "iPhone5,3", "iPhone5,4":                  return "iPhone 5c"
        case "iPhone6,1", "iPhone6,2":                  return "iPhone 5s"
        case "iPhone7,2":                               return "iPhone 6"
        case "iPhone7,1":                               return "iPhone 6 Plus"
        case "iPhone8,1":                               return "iPhone 6s"
        case "iPhone8,2":                               return "iPhone 6s Plus"
        case "iPhone9,1", "iPhone9,3":                  return "iPhone 7"
        case "iPhone9,2", "iPhone9,4":                  return "iPhone 7 Plus"
        case "iPhone8,4":                               return "iPhone SE"
        case "iPad2,1", "iPad2,2", "iPad2,3", "iPad2,4":return "iPad 2"
        case "iPad3,1", "iPad3,2", "iPad3,3":           return "iPad 3"
        case "iPad3,4", "iPad3,5", "iPad3,6":           return "iPad 4"
        case "iPad4,1", "iPad4,2", "iPad4,3":           return "iPad Air"
        case "iPad5,3", "iPad5,4":                      return "iPad Air 2"
        case "iPad6,11", "iPad6,12":                    return "iPad 5"
        case "iPad2,5", "iPad2,6", "iPad2,7":           return "iPad Mini"
        case "iPad4,4", "iPad4,5", "iPad4,6":           return "iPad Mini 2"
        case "iPad4,7", "iPad4,8", "iPad4,9":           return "iPad Mini 3"
        case "iPad5,1", "iPad5,2":                      return "iPad Mini 4"
        case "iPad6,3", "iPad6,4":                      return "iPad Pro 9.7 Inch"
        case "iPad6,7", "iPad6,8":                      return "iPad Pro 12.9 Inch"
        case "iPad7,1", "iPad7,2":                      return "iPad Pro 12.9 Inch 2. Generation"
        case "iPad7,3", "iPad7,4":                      return "iPad Pro 10.5 Inch"
        case "AppleTV5,3":                              return "Apple TV"
        case "i386", "x86_64":                          return "Simulator"
        default:                                        return identifier
        }
    }
}

ডিভাইসনাম = ডিভাইস.নম প্রিন্ট (ডিভাইসনাম) দিন। 'নাম' ত্রুটির অস্পষ্ট ব্যবহার পেয়ে
পুশপ্যাঙ্ক

4

এখানে জোর করে মোড়ানো এবং সুইফট ৩.০ ছাড়াই একটি পরিবর্তন করা হয়েছে:

import Foundation
import UIKit


public enum Model : String {
    case simulator = "simulator/sandbox",
    iPod1          = "iPod 1",
    iPod2          = "iPod 2",
    iPod3          = "iPod 3",
    iPod4          = "iPod 4",
    iPod5          = "iPod 5",
    iPad2          = "iPad 2",
    iPad3          = "iPad 3",
    iPad4          = "iPad 4",
    iPhone4        = "iPhone 4",
    iPhone4S       = "iPhone 4S",
    iPhone5        = "iPhone 5",
    iPhone5S       = "iPhone 5S",
    iPhone5C       = "iPhone 5C",
    iPadMini1      = "iPad Mini 1",
    iPadMini2      = "iPad Mini 2",
    iPadMini3      = "iPad Mini 3",
    iPadAir1       = "iPad Air 1",
    iPadAir2       = "iPad Air 2",
    iPhone6        = "iPhone 6",
    iPhone6plus    = "iPhone 6 Plus",
    iPhone6S       = "iPhone 6S",
    iPhone6Splus   = "iPhone 6S Plus",
    iPhoneSE       = "iPhone SE",
    iPhone7        = "iPhone 7",
    iPhone7plus    = "iPhone 7 Plus",
    unrecognized   = "?unrecognized?"
}

public extension UIDevice {
    public var type: Model {
        var systemInfo = utsname()
        uname(&systemInfo)
        let modelCode = withUnsafePointer(to: &systemInfo.machine) {
            $0.withMemoryRebound(to: CChar.self, capacity: 1) {
                ptr in String.init(validatingUTF8: ptr)

            }
        }
        var modelMap : [ String : Model ] = [
            "i386"      : .simulator,
            "x86_64"    : .simulator,
            "iPod1,1"   : .iPod1,
            "iPod2,1"   : .iPod2,
            "iPod3,1"   : .iPod3,
            "iPod4,1"   : .iPod4,
            "iPod5,1"   : .iPod5,
            "iPad2,1"   : .iPad2,
            "iPad2,2"   : .iPad2,
            "iPad2,3"   : .iPad2,
            "iPad2,4"   : .iPad2,
            "iPad2,5"   : .iPadMini1,
            "iPad2,6"   : .iPadMini1,
            "iPad2,7"   : .iPadMini1,
            "iPhone3,1" : .iPhone4,
            "iPhone3,2" : .iPhone4,
            "iPhone3,3" : .iPhone4,
            "iPhone4,1" : .iPhone4S,
            "iPhone5,1" : .iPhone5,
            "iPhone5,2" : .iPhone5,
            "iPhone5,3" : .iPhone5C,
            "iPhone5,4" : .iPhone5C,
            "iPad3,1"   : .iPad3,
            "iPad3,2"   : .iPad3,
            "iPad3,3"   : .iPad3,
            "iPad3,4"   : .iPad4,
            "iPad3,5"   : .iPad4,
            "iPad3,6"   : .iPad4,
            "iPhone6,1" : .iPhone5S,
            "iPhone6,2" : .iPhone5S,
            "iPad4,1"   : .iPadAir1,
            "iPad4,2"   : .iPadAir2,
            "iPad4,4"   : .iPadMini2,
            "iPad4,5"   : .iPadMini2,
            "iPad4,6"   : .iPadMini2,
            "iPad4,7"   : .iPadMini3,
            "iPad4,8"   : .iPadMini3,
            "iPad4,9"   : .iPadMini3,
            "iPhone7,1" : .iPhone6plus,
            "iPhone7,2" : .iPhone6,
            "iPhone8,1" : .iPhone6S,
            "iPhone8,2" : .iPhone6Splus,
            "iPhone8,4" : .iPhoneSE,
            "iPhone9,1" : .iPhone7,
            "iPhone9,2" : .iPhone7plus,
            "iPhone9,3" : .iPhone7,
            "iPhone9,4" : .iPhone7plus,
            ]

        guard let safeModelCode = modelCode else {
            return Model.unrecognized
        }

        guard let modelString = String.init(validatingUTF8: safeModelCode) else {
            return Model.unrecognized
        }

        guard let model = modelMap[modelString] else {
            return Model.unrecognized
        }

        return model
    }
}

3

ডিভাইস সম্পর্কিত তথ্য পার্স করতে এবং নামটি পেতে আপনি বিডিএলোক্যালাইজড ডিভাইসস মডেলস কাঠামোটি ব্যবহার করতে পারেন ।

তারপরে UIDevice.currentDevice.productNameআপনার কোডটিতে কেবল কল করুন।


2

হার্ডওয়্যার স্ট্রিং পাওয়ার জন্য নীচে কোডটি দেওয়া হয়েছে তবে কোন ডিভাইসটি তা জানতে আপনাকে এই হার্ডওয়্যার স্ট্রিংটির তুলনা করতে হবে। আমি এর জন্য একটি ক্লাস তৈরি করেছি যার মধ্যে প্রায় সব ডিভাইস স্ট্রিং রয়েছে (আমরা নতুন ডিভাইসগুলির সাথে স্ট্রিং আপ টু ডেট রাখছি)। এটি ব্যবহার করা সহজ দয়া করে চেক করুন

সুইফট : গিটহাব / ডিভাইসগুরু

উদ্দেশ্য-সি : গিটহাব / ডিভাইস ইউটিল

public func hardwareString() -> String {
  var name: [Int32] = [CTL_HW, HW_MACHINE]
  var size: Int = 2
  sysctl(&name, 2, nil, &size, &name, 0)
  var hw_machine = [CChar](count: Int(size), repeatedValue: 0)
  sysctl(&name, 2, &hw_machine, &size, &name, 0)

  let hardware: String = String.fromCString(hw_machine)!
  return hardware
}

2

আপনি যদি প্রতিবার অ্যাপল কোনও ডিভাইস পরিবারে একটি নতুন মডেল যুক্ত করেন তবে আপনার কোডটি আপডেট রাখতে না চাইলে কেবল আপনাকে মডেল কোডটি ফিরিয়ে দেওয়ার নীচের পদ্ধতিটি ব্যবহার করুন।

func platform() -> String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let modelCode = withUnsafeMutablePointer(&systemInfo.machine) {
            ptr in String.fromCString(UnsafePointer<CChar>(ptr))
        }

        return String.fromCString(modelCode!)!
}

2

সুইট 3.1

কেবল আপনার নাম ডাকার জন্য আমার দুটি সেন্ট:

    func platform() -> String {
    var systemInfo = utsname()
    uname(&systemInfo)
    let size = Int(_SYS_NAMELEN) // is 32, but posix AND its init is 256....

    let s = withUnsafeMutablePointer(to: &systemInfo.machine) {p in

        p.withMemoryRebound(to: CChar.self, capacity: size, {p2 in
            return String(cString: p2)
        })

    }
    return s
}

অন্যদের মতো, তবে সি / সুইফট এবং পিছনের সমস্ত জটিলতা সম্পর্কে কিছুটা পরিষ্কার ):

"X86_64" এর মতো মানগুলি ফেরৎ দেয়


2

একটি সুইফট 'সুইচ-কেস' ব্যবহার করে:

func platformString() -> String {

    var devSpec: String

    switch platform() {

    case "iPhone1,2": devSpec = "iPhone 3G"
    case "iPhone2,1": devSpec = "iPhone 3GS"
    case "iPhone3,1": devSpec = "iPhone 4"
    case "iPhone3,3": devSpec = "Verizon iPhone 4"
    case "iPhone4,1": devSpec = "iPhone 4S"
    case "iPhone5,1": devSpec = "iPhone 5 (GSM)"
    case "iPhone5,2": devSpec = "iPhone 5 (GSM+CDMA)"
    case "iPhone5,3": devSpec = "iPhone 5c (GSM)"
    case "iPhone5,4": devSpec = "iPhone 5c (GSM+CDMA)"
    case "iPhone6,1": devSpec = "iPhone 5s (GSM)"
    case "iPhone6,2": devSpec = "iPhone 5s (GSM+CDMA)"
    case "iPhone7,1": devSpec = "iPhone 6 Plus"
    case "iPhone7,2": devSpec = "iPhone 6"
    case "iPod1,1": devSpec = "iPod Touch 1G"
    case "iPod2,1": devSpec = "iPod Touch 2G"
    case "iPod3,1": devSpec = "iPod Touch 3G"
    case "iPod4,1": devSpec = "iPod Touch 4G"
    case "iPod5,1": devSpec = "iPod Touch 5G"
    case "iPad1,1": devSpec = "iPad"
    case "iPad2,1": devSpec = "iPad 2 (WiFi)"
    case "iPad2,2": devSpec = "iPad 2 (GSM)"
    case "iPad2,3": devSpec = "iPad 2 (CDMA)"
    case "iPad2,4": devSpec = "iPad 2 (WiFi)"
    case "iPad2,5": devSpec = "iPad Mini (WiFi)"
    case "iPad2,6": devSpec = "iPad Mini (GSM)"
    case "iPad2,7": devSpec = "iPad Mini (GSM+CDMA)"
    case "iPad3,1": devSpec = "iPad 3 (WiFi)"
    case "iPad3,2": devSpec = "iPad 3 (GSM+CDMA)"
    case "iPad3,3": devSpec = "iPad 3 (GSM)"
    case "iPad3,4": devSpec = "iPad 4 (WiFi)"
    case "iPad3,5": devSpec = "iPad 4 (GSM)"
    case "iPad3,6": devSpec = "iPad 4 (GSM+CDMA)"
    case "iPad4,1": devSpec = "iPad Air (WiFi)"
    case "iPad4,2": devSpec = "iPad Air (Cellular)"
    case "iPad4,4": devSpec = "iPad mini 2G (WiFi)"
    case "iPad4,5": devSpec = "iPad mini 2G (Cellular)"

    case "iPad4,7": devSpec = "iPad mini 3 (WiFi)"
    case "iPad4,8": devSpec = "iPad mini 3 (Cellular)"
    case "iPad4,9": devSpec = "iPad mini 3 (China Model)"

    case "iPad5,3": devSpec = "iPad Air 2 (WiFi)"
    case "iPad5,4": devSpec = "iPad Air 2 (Cellular)"

    case "i386": devSpec = "Simulator"
    case "x86_64": devSpec = "Simulator"

    default: devSpec = "Unknown"
    }

    return devSpec
}

2

আমার সহজ সমাধান ডিভাইস দ্বারা একত্রে নতুন ডিভাইস সমর্থন iPhone 8এবং iPhone XSwift 3:

public 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)))
        }

        switch identifier {
        case "iPhone3,1", "iPhone3,2", "iPhone3,3", "iPhone4,1":
            return "iPhone 4"

        case "iPhone5,1", "iPhone5,2", "iPhone5,3", "iPhone5,4", "iPhone6,1", "iPhone6,2", "iPhone8,4":
            return "iPhone 5"

        case "iPhone7,2", "iPhone8,1", "iPhone9,1", "iPhone9,3", "iPhone10,1", "iPhone10,4":
            return "iPhone 6,7,8"

        case "iPhone7,1", "iPhone8,2", "iPhone9,2", "iPhone9,4", "iPhone10,2", "iPhone10,5":
            return "iPhone Plus"

        case "iPhone10,3", "iPhone10,6":
            return "iPhone X"

        case "i386", "x86_64":
            return "Simulator"
        default:
            return identifier
        }
    }
}

আর ব্যবহার করুন:

switch UIDevice.current.modelName {
  case "iPhone 4":
  case "iPhone 5":
  case "iPhone 6,7,8":
  case "iPhone Plus":
  case "iPhone X":
  case "Simulator":
  default:
}

2

এই উত্তর এবং এই উত্তর উপর ভিত্তি করে । আমি একটি সার্বজনীন বক্তব্য তৈরি করেছি

এটি কীভাবে ব্যবহার করা যায়

let boolean: Bool = UIDevice.isDevice(ofType: .iPhoneX)
// true or false

let specificDevice: DeviceModel.Model = UIDevice.modelType
// iPhone6s, iPhoneX, iPad etc...

let model: DeviceModel = UIDevice.model
// .simulator(let specificDevice), .real(let specificDevice),
// .unrecognizedSimulator(let string), .unrecognized(let string)

let modelName: String = UIDevice.model.name
// iPhone 6, iPhone X, etc...

এটি গিস্টের ভিতরে কোড

public extension UIDevice {
    public static var modelCode: String {
        if let simulatorModelIdentifier = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] { return simulatorModelIdentifier }
        var systemInfo = utsname()
        uname(&systemInfo)
        return withUnsafeMutablePointer(to: &systemInfo.machine) {
            ptr in String(cString: UnsafeRawPointer(ptr).assumingMemoryBound(to: CChar.self))
        }
    }

    public static var model: DeviceModel {
        // Thanks https://stackoverflow.com/a/26962452/5928180
        var systemInfo = utsname()
        uname(&systemInfo)
        let modelCode = withUnsafeMutablePointer(to: &systemInfo.machine) {
            ptr in String(cString: UnsafeRawPointer(ptr).assumingMemoryBound(to: CChar.self))
        }

        // Thanks https://stackoverflow.com/a/33495869/5928180
        if modelCode == "i386" || modelCode == "x86_64" {
            if let simulatorModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"], let model = DeviceModel.Model(modelCode: simulatorModelCode) {
                return DeviceModel.simulator(model)
            } else if let simulatorModelCode = ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] {
                return DeviceModel.unrecognizedSimulator(simulatorModelCode)
            } else {
                return DeviceModel.unrecognized(modelCode)
            }
        } else if let model = DeviceModel.Model(modelCode: modelCode) {
            return DeviceModel.real(model)
        } else {
            return DeviceModel.unrecognized(modelCode)
        }
    }

    public static var modelType: DeviceModel.Model? {
        return UIDevice.model.model
    }

    public static func isDevice(ofType model: DeviceModel.Model) -> Bool {
        return UIDevice.modelType == model
    }
}


public enum DeviceModel {
    case simulator(Model)
    case unrecognizedSimulator(String)
    case real(Model)
    case unrecognized(String)

    public enum Model: String {
        case iPod1            = "iPod 1"
        case iPod2            = "iPod 2"
        case iPod3            = "iPod 3"
        case iPod4            = "iPod 4"
        case iPod5            = "iPod 5"
        case iPad2            = "iPad 2"
        case iPad3            = "iPad 3"
        case iPad4            = "iPad 4"
        case iPhone4          = "iPhone 4"
        case iPhone4S         = "iPhone 4S"
        case iPhone5          = "iPhone 5"
        case iPhone5S         = "iPhone 5S"
        case iPhone5C         = "iPhone 5C"
        case iPadMini1        = "iPad Mini 1"
        case iPadMini2        = "iPad Mini 2"
        case iPadMini3        = "iPad Mini 3"
        case iPadAir1         = "iPad Air 1"
        case iPadAir2         = "iPad Air 2"
        case iPadPro9_7       = "iPad Pro 9.7\""
        case iPadPro9_7_cell  = "iPad Pro 9.7\" cellular"
        case iPadPro10_5      = "iPad Pro 10.5\""
        case iPadPro10_5_cell = "iPad Pro 10.5\" cellular"
        case iPadPro12_9      = "iPad Pro 12.9\""
        case iPadPro12_9_cell = "iPad Pro 12.9\" cellular"
        case iPhone6          = "iPhone 6"
        case iPhone6plus      = "iPhone 6 Plus"
        case iPhone6S         = "iPhone 6S"
        case iPhone6Splus     = "iPhone 6S Plus"
        case iPhoneSE         = "iPhone SE"
        case iPhone7          = "iPhone 7"
        case iPhone7plus      = "iPhone 7 Plus"
        case iPhone8          = "iPhone 8"
        case iPhone8plus      = "iPhone 8 Plus"
        case iPhoneX          = "iPhone X"

        init?(modelCode: String) {
            switch modelCode {
            case "iPod1,1":    self = .iPod1
            case "iPod2,1":    self = .iPod2
            case "iPod3,1":    self = .iPod3
            case "iPod4,1":    self = .iPod4
            case "iPod5,1":    self = .iPod5
            case "iPad2,1":    self = .iPad2
            case "iPad2,2":    self = .iPad2
            case "iPad2,3":    self = .iPad2
            case "iPad2,4":    self = .iPad2
            case "iPad2,5":    self = .iPadMini1
            case "iPad2,6":    self = .iPadMini1
            case "iPad2,7":    self = .iPadMini1
            case "iPhone3,1":  self = .iPhone4
            case "iPhone3,2":  self = .iPhone4
            case "iPhone3,3":  self = .iPhone4
            case "iPhone4,1":  self = .iPhone4S
            case "iPhone5,1":  self = .iPhone5
            case "iPhone5,2":  self = .iPhone5
            case "iPhone5,3":  self = .iPhone5C
            case "iPhone5,4":  self = .iPhone5C
            case "iPad3,1":    self = .iPad3
            case "iPad3,2":    self = .iPad3
            case "iPad3,3":    self = .iPad3
            case "iPad3,4":    self = .iPad4
            case "iPad3,5":    self = .iPad4
            case "iPad3,6":    self = .iPad4
            case "iPhone6,1":  self = .iPhone5S
            case "iPhone6,2":  self = .iPhone5S
            case "iPad4,1":    self = .iPadAir1
            case "iPad4,2":    self = .iPadAir2
            case "iPad4,4":    self = .iPadMini2
            case "iPad4,5":    self = .iPadMini2
            case "iPad4,6":    self = .iPadMini2
            case "iPad4,7":    self = .iPadMini3
            case "iPad4,8":    self = .iPadMini3
            case "iPad4,9":    self = .iPadMini3
            case "iPad6,3":    self = .iPadPro9_7
            case "iPad6,11":   self = .iPadPro9_7
            case "iPad6,4":    self = .iPadPro9_7_cell
            case "iPad6,12":   self = .iPadPro9_7_cell
            case "iPad6,7":    self = .iPadPro12_9
            case "iPad6,8":    self = .iPadPro12_9_cell
            case "iPad7,3":    self = .iPadPro10_5
            case "iPad7,4":    self = .iPadPro10_5_cell
            case "iPhone7,1":  self = .iPhone6plus
            case "iPhone7,2":  self = .iPhone6
            case "iPhone8,1":  self = .iPhone6S
            case "iPhone8,2":  self = .iPhone6Splus
            case "iPhone8,4":  self = .iPhoneSE
            case "iPhone9,1":  self = .iPhone7
            case "iPhone9,2":  self = .iPhone7plus
            case "iPhone9,3":  self = .iPhone7
            case "iPhone9,4":  self = .iPhone7plus
            case "iPhone10,1": self = .iPhone8
            case "iPhone10,2": self = .iPhone8plus
            case "iPhone10,3": self = .iPhoneX
            case "iPhone10,6": self = .iPhoneX
            default:           return nil
            }
        }
    }

    public var name: String {
        switch self {
        case .simulator(let model):         return "Simulator[\(model.rawValue)]"
        case .unrecognizedSimulator(let s): return "UnrecognizedSimulator[\(s)]"
        case .real(let model):              return model.rawValue
        case .unrecognized(let s):          return "Unrecognized[\(s)]"
        }
    }

    public var model: DeviceModel.Model? {
        switch self {
        case .simulator(let model):         return model
        case .real(let model):              return model
        case .unrecognizedSimulator(_):     return nil
        case .unrecognized(_):              return nil
        }
    }
}

2

মডেলের নাম পাওয়ার জন্য সহজ উপায় (বিপণনের নাম)

ব্যক্তিগত এপিআই -[UIDevice _deviceInfoForKey:] সাবধানে ব্যবহার করুন, আপনাকে অ্যাপল প্রত্যাখ্যান করবে না,

// works on both simulators and real devices, iOS 8 to iOS 12
NSString *deviceModelName(void) {
    // For Simulator
    NSString *modelName = NSProcessInfo.processInfo.environment[@"SIMULATOR_DEVICE_NAME"];
    if (modelName.length > 0) {
        return modelName;
    }

    // For real devices and simulators, except simulators running on iOS 8.x
    UIDevice *device = [UIDevice currentDevice];
    NSString *selName = [NSString stringWithFormat:@"_%@ForKey:", @"deviceInfo"];
    SEL selector = NSSelectorFromString(selName);
    if ([device respondsToSelector:selector]) {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
        modelName = [device performSelector:selector withObject:@"marketing-name"];
#pragma clang diagnostic pop
    }
    return modelName;
}

কীভাবে আমি কী "বিপণন-নাম" পেয়েছি?

একটি সিমুলেটারে চলমান, NSProcessInfo.processInfo.environment"সিমিউলেটর_ক্যাপাবিলিটিস" নামে একটি কী রয়েছে, যার মান একটি প্লিস্ট ফাইল। তারপরে আপনি প্লিস্ট ফাইলটি খুলুন, আপনি মডেল নামের কী "বিপণন-নাম" পাবেন।


আমি ব্যক্তিগত এপিআইগুলি ব্যবহার করার পরামর্শ দেব না
জুলিয়াস

@ জুলিয়াস আপনি ঠিক বলেছেন এটি সর্বদা কাজ করে এবং নতুন অ্যাপল ডিভাইস প্রকাশের সাথে আপনার কোড আপডেট করার দরকার নেই।
ডনসং

1

সুইফ্ট 3 এ এটি হবে

 UIDevice.current.model

2
যে কোনও সিমুলেটারের সাথে চালালে আমি ফিরে আসি ফলাফলটি কেবল "আইফোন"।
উইলিয়াম টি।

1
এই সমাধানটি "আইফোন" বা "আইপড টাচ" হিসাবে সবেমাত্র মডেলটি দেয়। "আইফোন 6 এস" এর মতো নির্দিষ্ট ডিভাইস নয়

1
struct utsname systemInfo;
uname(&systemInfo);

NSString* deviceModel = [NSString stringWithCString:systemInfo.machine
                          encoding:NSUTF8StringEncoding];

2
যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না।
জে ছোমেল

1
extension UIDevice {

    public static let hardwareModel: String = {
        var path = [CTL_HW, HW_MACHINE]
        var n = 0
        sysctl(&path, 2, nil, &n, nil, 0)
        var a: [UInt8] = .init(repeating: 0, count: n)
        sysctl(&path, 2, &a, &n, nil, 0)
        return .init(cString: a)
    }()
}

UIDevice.hardwareModel // → iPhone9,3

1

একটি সহায়ক গ্রন্থাগার আছে

সুইফট 5

পোড 'ডিভাইসকিট', '~> ২.০'

সুইফট 4.0 - সুইফট 4.2

শুঁটি 'ডিভাইসকিট', '~> 1.3'

আপনি যদি কেবল মডেলটি নির্ধারণ করতে চান এবং সেই অনুসারে কিছু তৈরি করতে চান।

আপনি এটির মতো ব্যবহার করতে পারেন:

let isIphoneX = Device().isOneOf([.iPhoneX, .simulator(.iPhoneX)])

একটি অনুষ্ঠানে:

func isItIPhoneX() -> Bool {
    let device = Device()
    let check = device.isOneOf([.iPhoneX, .iPhoneXr , .iPhoneXs , .iPhoneXsMax ,
                                .simulator(.iPhoneX), .simulator(.iPhoneXr) , .simulator(.iPhoneXs) , .simulator(.iPhoneXsMax) ])
    return check
}

আপনি কি নিশ্চিত যে @ ওলভারিয়ান? আমি আমার প্রকল্পে ইতিমধ্যে এটি ব্যবহার করছি।
বুড়াক ডিজলেক

হ্যাঁ তুমিই ঠিক. আমি ভুলে গিয়েছিলাম আমি এর জন্য একটি লাইব্রেরি ব্যবহার করেছি। এখন ঠিক আছে।
বুড়াক ডিজলেক

0
struct DeviceType {
        static let IS_IPHONE_4_OR_LESS = UIDevice.current.userInterfaceIdiom == .phone && Constants.SCREEN_MAX_LENGTH < 568
        static let IS_IPHONE_5 = UIDevice.current.userInterfaceIdiom == .phone && Constants.SCREEN_MAX_LENGTH == 568
        static let IS_IPHONE_6 = UIDevice.current.userInterfaceIdiom == .phone && Constants.SCREEN_MAX_LENGTH == 667
        static let IS_IPHONE_6P = UIDevice.current.userInterfaceIdiom == .phone && Constants.SCREEN_MAX_LENGTH == 736
        static let IS_IPAD = UIDevice.current.userInterfaceIdiom == .pad && Constants.SCREEN_MAX_LENGTH == 1024
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.