552 Stimmen

Wie bestimmt man das aktuelle iPhone/Gerätemodell?

Gibt es einen Weg, um den Gerätemodellnamen (iPhone 4S, iPhone 5, iPhone 5S usw.) in Swift zu erhalten?

Ich weiß, es gibt eine Eigenschaft namens UIDevice.currentDevice().model, aber sie gibt nur den Gerätetyp zurück (iPod touch, iPhone, iPad, iPhone Simulator, usw.).

Ich weiß auch, dass es in Objective-C leicht mit dieser Methode gemacht werden kann:

#import 

struct utsname systemInfo;
uname(&systemInfo);

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

Aber ich entwickle meine iPhone-App in Swift, kann mir also bitte jemand helfen, dies auf äquivalente Weise in Swift zu lösen?

162voto

clearlight Punkte 11235

Dieses Swift 3.0-Beispiel gibt das aktuelle Gerätemodell als eine enum-Konstante zurück (um direkte Vergleiche mit Zeichenfolgenliterale zu vermeiden). Der rohe Wert der enum ist eine String, die den menschenlesbaren iOS-Gerätenamen enthält. Da es sich um Swift handelt, enthält die Liste der erkannten Geräte nur Modelle, die neu genug sind, um iOS-Versionen zu unterstützen, die Swift enthalten. Das folgende Verwendungsbeispiel nutzt die Implementierung am Ende dieser Antwort:

    switch UIDevice().type {
    case .iPhone5:
              print("Kein 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("Lege deinen Daumen auf den " + 
                     UIDevice().type.rawValue + " TouchID-Sensor")
    case .unrecognized:
              print("Gerätemodell nicht erkannt");
    default:
              print(UIDevice().type.rawValue + " wird von dieser App nicht unterstützt");
    }

Deine App sollte für neue Geräteversionen und auch wenn Apple neue Modelle für die gleiche Gerätefamilie hinzufügt, auf dem neuesten Stand gehalten werden. Zum Beispiel sind iPhone3,1 iPhone3,2 iPhone3,4 alle "iPhone 4". Vermeide das Schreiben von Code, der nicht für neue Modelle berücksichtigt wird, sodass deine Algorithmen nicht unerwartet fehlschlagen, um ein neues Gerät zu konfigurieren oder zu reagieren. Du kannst dich zu strategischen Zeiten auf diese gepflegte Liste der iOS Gerätemodelle beziehen, um deine App zu aktualisieren.

iOS enthält geräteunabhängige Schnittstellen zur Erkennung von Hardwarefähigkeiten und Parametern wie Bildschirmgröße. Die generalisierten Schnittstellen, die Apple zur Verfügung stellt, sind in der Regel die sichersten und am besten unterstützten Mechanismen, um das Verhalten einer App dynamisch an verschiedene Hardware anzupassen. Dennoch kann der folgende Code für Prototyping, Debugging, Testen oder immer dann nützlich sein, wenn Code eine spezifische Gerätefamilie ansprechen muss. Diese Technik kann auch nützlich sein, um das aktuelle Gerät anhand seines gebräuchlichen/öffentlichen Namens zu beschreiben.

Swift 3

// 1. Außerhalb der Klassendefinition (oder in einer eigenen Datei) deklarieren.
// 2. UIKit muss in der Datei, in der dieser Code hinzugefügt wird, enthalten sein.
// 3. Erweitert die UIDevice-Klasse, ist daher überall in der App verfügbar.
//
// Verwendungsbeispiel:
//
//    if UIDevice().type == .simulator {
//       print("Du führst auf dem Simulator aus... langweilig!")
//    } else {
//       print("Wow! Läuft auf einem \(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
    }
}

144voto

Jens Schwarzer Punkte 2680

Noch eine/eine weitere einfache Alternative (Modellkennung Referenz unter https://www.theiphonewiki.com/wiki/Models):

Aktualisierte Antwort für Swift 3/4/5 einschließlich Zeichenfolgenabschneiden und Simulatorunterstützung:

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

40voto

Raymond Liao Punkte 1769

Ich habe eine weitere Beispiel-Erweiterung auf UIDevice erstellt, um das Simulator-Modellkennzeichen basierend auf @HAS's Antwort einzuschließen. Es funktioniert gut mit Swift3.2 und höher (einschließlich Swift 4.x, Swift 5):

let modelName = UIDevice.current.modelName

Neue Modelle hinzugefügt: iPod touch (7. Generation), iPhone SE (2. Generation), iPhone 12 mini, iPhone 12, iPhone 12 Pro, iPhone 12 Pro Max, iPad Pro (12,9 Zoll) (4. Generation)

import UIKit

public extension UIDevice {

    /// parst den Gerätenamen als Standardnamen
    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 "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 "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 "iPhone12,8":                              return "iPhone SE (2nd generation)"
        case "iPhone13,1":                              return "iPhone 12 mini"
        case "iPhone13,2":                              return "iPhone 12"
        case "iPhone13,3":                              return "iPhone 12 Pro"
        case "iPhone13,4":                              return "iPhone 12 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 Zoll"
        case "iPad6,7", "iPad6,8":                      return "iPad Pro 12.9 Zoll"
        case "iPad7,1", "iPad7,2":                      return "iPad Pro (12,9 Zoll) (2. Generation)"
        case "iPad7,3", "iPad7,4":                      return "iPad Pro (10,5 Zoll)"
        case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4":return "iPad Pro (11 Zoll)"
        case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8":return "iPad Pro (12,9 Zoll) (3. Generation)"
        case "iPad8,11", "iPad8,12":                    return "iPad Pro (12,9 Zoll) (4. Generation)"
        case "AppleTV5,3":                              return "Apple TV"
        case "AppleTV6,2":                              return "Apple TV 4K"
        case "AudioAccessory1,1":                       return "HomePod"
        default:                                        return identifier
        }
    }
}

32voto

neoneye Punkte 47046

Swift 5

/// Erhalten Sie die Hardwareplattform des Geräts aus dem Unix-Befehl `uname()`
///
/// Beispiele für mögliche Rückgabewerte
///  - `"iPhone8,1"` = iPhone 6s
///  - `"iPad6,7"` = iPad Pro (12,9 Zoll)
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"
}

18voto

isoiphone Punkte 312

Verwendung von Swift 3 (Xcode 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
    }

Hinweis: Gemäß der Antwort im offiziellen Entwicklerforum ist es sicher, Tupel auf diese Weise zu verwenden. Die Speicherausrichtung für das große Int8-Tupel wird genauso sein, als ob es ein großes Int8-Array wäre. d.h.: zusammenhängend und nicht gepolstert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X