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?

2voto

Funktioniert für mich

var sysinfo = utsname()
uname(&sysinfo)
let data = Data(bytes: &sysinfo.machine, count: Int(_SYS_NAMELEN))
let modell = String(cString: [UInt8](data) //iPhone13,1

2voto

Inder Kumar Rathore Punkte 38280

Im Folgenden finden Sie den Code zum Abrufen des Hardware-Strings, aber Sie müssen diese Hardware-Strings vergleichen, um zu wissen, um welches Gerät es sich handelt. Ich habe eine Klasse dafür erstellt, die fast alle Gerätestrings enthält (wir halten die Zeichenfolge auf dem neuesten Stand mit neuen Geräten). Es ist einfach zu verwenden, bitte überprüfen Sie es

Swift : GitHub/DeviceGuru

Objective-C : GitHub/DeviceUtil

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
}

1voto

DawnSong Punkte 3836

Einfachste Möglichkeit, den Modellnamen (Marketingname) zu erhalten

Verwenden Sie die private API -[UIDevice _deviceInfoForKey:] sorgfältig, Sie werden von Apple nicht abgelehnt,

// funktioniert sowohl auf Simulatoren als auch auf echten Geräten, iOS 8 bis iOS 12
NSString *deviceModelName(void) {
    // Für den Simulator
    NSString *modelName = NSProcessInfo.processInfo.environment[@"SIMULATOR_DEVICE_NAME"];
    if (modelName.length > 0) {
        return modelName;
    }

    // Für echte Geräte und Simulatoren, außer Simulatoren, die unter iOS 8.x laufen
    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;
}

Wie habe ich den Schlüssel "marketing-name" bekommen?

Wenn Sie auf einem Simulator laufen, enthält NSProcessInfo.processInfo.environment einen Schlüssel namens "SIMULATOR_CAPABILITIES", dessen Wert eine plist-Datei ist. Wenn Sie dann die plist-Datei öffnen, erhalten Sie den Schlüssel für den Modellnamen "marketing-name".

1voto

Shawn Baek Punkte 1798

Hier ist eine neue Bibliothek zur Erkennung von Apple-Geräten

import DeviceDetector

let detector = DeviceDetector.shared
let deviceName = detector.currentDeviceName
let deviceSet = detector.currentDevice

let information = """
Modell: \(deviceName)
iPhone?: \(detector.isiPhone)
iPad?: \(detector.isiPad)
Notch?: \(detector.hasSafeArea)

4inch?: \(DeviceSet.iPhone4inchSet.contains(deviceSet))
4.7inch?: \(DeviceSet.iPhone4_7inchSet.contains(deviceSet))
iPhoneSE?: \(DeviceSet.iPhoneSESet.contains(deviceSet))
iPhonePlus?: \(DeviceSet.iPhonePlusSet.contains(deviceSet))
iPadPro?: \(DeviceSet.iPadProSet.contains(deviceSet))
"""

Ergebnis Bildbeschreibung hier eingeben

0voto

Milos Punkte 2648
Erweiterung UIDevice {

    Öffentlich statische lassen hardwareModell: String = {
        var pfad = [CTL_HW, HW_MACHINE]
        var n = 0
        sysctl(&pfad, 2, nil, &n, nil, 0)
        var a: [UInt8] = .init(wiederholend: 0, zählen: n)
        sysctl(&pfad, 2, &a, &n, nil, 0)
        return .init(CString: a)
    }()
}

UIDevice.hardwareModel // iPhone9,3

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