Swift 获取手机机型(已维护到15系列)

1,645 阅读7分钟

获取手机模型信息,已更新到iPhone15系列。

手机机型(eg:iPhone 12)以及机型对应的设备信息(尺寸信息,逻辑尺寸,物理尺寸等信息)。

使用

  1. 遵守协议 iPhoneModelType
  2. 获取实例:let iphone = iPhone()
  3. 获取对应的内容:
let iphone = iPhone()

/// 对角线尺寸

let a = iphone.diagonalSize()

///是否全面屏

let b = iphone.isFullSreen()

/// 是否发布在iPhoneX之后 包含iPhoneX

let c = iphone.isReleasedAtiPhoneX()

/// 逻辑尺寸(pt)

let d = iphone.logicalResolution()

/// 物理尺寸 (px)

let e = iphone.physicalResolution()

/// 缩放因子 (@1x @2x @3x)

let f = iphone.scaleFactor()

/// 处理器(芯片 A14)

let g = iphone.chip()

/// 手机机型

let h = iphone.getModel()

具体实现

public protocol iPhoneModelType {

    func iPhone() -> iPhoneModel

    static func iPhone() -> iPhoneModel

}

extension iPhoneModelType {

    public func iPhone() -> iPhoneModel {

        let model = getIPhoneModel()

        return model

    }

    static public func iPhone() -> iPhoneModel {

        let model = getIPhoneModel()

        return model

    }

}


///获取设备名称

fileprivate func getIPhoneModel() -> iPhoneModel {

    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 "iPhone5,1", "iPhone5,2":              return .iPhone5

    case "iPhone5,3", "iPhone5,4":              return .iPhone5C

    case "iPhone6,1", "iPhone6,2":              return .iPhone5S


    case "iPhone7.2":                           return .iPhone6

    case "iPhone7,1":                           return .iPhone6Plus

    case "iPhone8,1":                           return .iPhone6s

    case "iPhone8,2":                           return .iPhone6Plus
    

    case "iPhone8,4":                           return .iPhoneSE1
    

    case "iPhone9,1","iPhone9,3":               return .iPhone7

    case "iPhone9,2","iPhone9,4":               return .iPhone7Plus


    case "iPhone10,1","iPhone10,4":             return .iPhone8

    case "iPhone10,2","iPhone10,5":             return .iPhone8Plus


    case "iPhone10,3","iPhone10,6":             return .iPhoneX

    case "iPhone11,8":                          return .iPhoneXR

    case "iPhone11,2":                          return .iPhoneXS

    case "iPhone11,6", "iPhone11,4":            return .iPhoneXSMax


    case "iPhone12,1":                          return .iPhone11

    case "iPhone12,3":                          return .iPhone11Pro

    case "iPhone12,5":                          return .iPhone11ProMax

    case "iPhone12,8":                          return .iPhoneSE2


    case "iPhone13,1":                          return .iPhone12Mini

    case "iPhone13,2":                          return .iPhone12

    case "iPhone13,3":                          return .iPhone12Pro

    case "iPhone13,4":                          return .iPhone12ProMax

        
    case "iPhone14,4":                          return .iPhone13Mini

    case "iPhone14,5":                          return .iPhone13

    case "iPhone14,2":                          return .iPhone13Pro

    case "iPhone14,3":                          return .iPhone13ProMax
    
    
    case "iPhone14,6":                          return .iPhoneSE3
    
        
    case "iPhone14,7":                          return .iPhone14

    case "iPhone14,8":                          return .iPhone14Plus

    case "iPhone15,2":                          return .iPhone14Pro

    case "iPhone15,3":                          return .iPhone14ProMax
    
    
    case "iPhone15,4":                          return .iPhone15

    case "iPhone15,5":                          return .iPhone15Plus

    case "iPhone16,1":                          return .iPhone15Pro

    case "iPhone16,2":                          return .iPhone15ProMax


    // Simulator

    case "i386":                                return .simulator

    case "x86_64":                              return .simulator


    default:                                    return .unknown

    }

}


public enum iPhoneModel {

    // 2023年9月12日

    case iPhone15

    case iPhone15Plus

    case iPhone15Pro

    case iPhone15ProMax
    

    // 2022年9月13日,新款iPhone 14、14 plus、14 Pro、14 Pro Max发布

    case iPhone14

    case iPhone14Plus

    case iPhone14Pro

    case iPhone14ProMax


    //2021年9月15日,新款iPhone 13 mini、13、13 Pro、13 Pro Max发布

    case iPhone13ProMax

    case iPhone13Pro

    case iPhone13

    case iPhone13Mini


    case iPhone12ProMax

    case iPhone12Pro

    case iPhone12

    case iPhone12Mini


    case iPhone11ProMax

    case iPhone11Pro

    case iPhone11


    case iPhoneXSMax

    case iPhoneXS

    case iPhoneXR

    case iPhoneX


    case iPhone8Plus

    case iPhone8
    

    case iPhone7Plus

    case iPhone7
    

    case iPhone6sPlus

    case iPhone6s

    case iPhone6Plus

    case iPhone6


    case iPhone5S

    case iPhone5C

    case iPhone5
    
    
    // 2022年3月8日

    case iPhoneSE3


    case iPhoneSE2  // 二代

    case iPhoneSE1 // 一代


    case simulator

    case unknown


    /// 获取手机型号名称 (iPhone 6 Plus)

    public func getName() -> String {

        switch self {

        ///iphone

        case .iPhone5:

            return "iPhone 5"

        case .iPhone5C:

            return "iPhone 5C"

        case .iPhone5S:

            return "iPhone 5S"

        case .iPhone6:

            return "iPhone 6"

        case .iPhone6Plus:

            return "iPhone 6 Plus"

        case .iPhone6s:

            return "iPhone 6s"

        case .iPhone6sPlus:

            return "iPhone 6s Plus"

        case .iPhoneSE1:

            return "iPhone SE1"

        case .iPhone7:

            return "iPhone 7"

        case .iPhone7Plus:

            return "iPhone 7 Plus"

        case .iPhone8:

            return "iPhone 8"

        case .iPhone8Plus:

            return "iPhone 8 Plus"

        case .iPhoneX:

            return "iPhone X"

        case .iPhoneXR:

            return "iPhone XR"

        case .iPhoneXS:

            return "iPhone XS"

        case .iPhoneXSMax:

            return "iPhone XS Max"

        case .iPhone11:

            return "iPhone 11"

        case .iPhone11Pro:

            return "iPhone 11 Pro"

        case .iPhone11ProMax:

            return "iPhone 11 Pro Max"

        case .iPhoneSE2:

            return "iPhone SE2"

        case .iPhone12Mini:

            return "iPhone 12 mini"

        case .iPhone12:

            return "iPhone 12"

        case .iPhone12Pro:

            return "iPhone 12 Pro"

        case .iPhone12ProMax:

            return "iPhone 12 Pro Max"

        case .iPhone13Mini:

            return "iPhone 13 mini"

        case .iPhone13:

            return "iPhone 13"

        case .iPhone13Pro:

            return "iPhone 13 Pro"

        case .iPhone13ProMax:

            return "iPhone 13 Pro Max"

        case .simulator:

            return "Simulator"

        case .unknown:

            return "unknow"

        case .iPhone14:

            return "iPhone 14"

        case .iPhone14Plus:

            return "iPhone 14 Plus"

        case .iPhone14Pro:

            return "iPhone 14 Pro"

        case .iPhone14ProMax:

            return "iPhone 14 Pro Max"
            
        case .iPhoneSE3:

            return "iPhone SE3"

        case .iPhone15:

            return "iPhone 15"

        case .iPhone15Plus:

            return "iPhone 15 Plus"

        case .iPhone15Pro:

            return "iPhone 15 Pro"

        case .iPhone15ProMax:

            return "iPhone 15 Pro Max"

        }

    }
    

    /// 物理分辨率

    public func physicalResolution() -> CGSize? {

        switch self {

        case .unknown, .simulator:

            return nil

        case .iPhone5, .iPhone5C, .iPhone5S, .iPhoneSE1:

            return CGSize(width: 640, height: 1136)

        case .iPhone6, .iPhone6s, .iPhone7, .iPhone8, .iPhoneSE2, .iPhoneSE3:

            return CGSize(width: 750, height: 1334)

        case .iPhone6Plus, .iPhone6sPlus, .iPhone7Plus, .iPhone8Plus:

            return CGSize(width: 1242, height: 2208)
            

        case .iPhoneX, .iPhoneXS, .iPhone11Pro:

            return CGSize(width: 1225, height: 2436)

        case .iPhoneXR, .iPhone11:

            return CGSize(width: 828, height: 1792)

        case .iPhoneXSMax, .iPhone11ProMax:

            return CGSize(width: 1242, height: 2688)


        case .iPhone12Mini, .iPhone13Mini:

            return CGSize(width: 1080, height: 2340)

        case .iPhone12, .iPhone12Pro, .iPhone13, .iPhone13Pro:

            return CGSize(width: 1170, height: 2532)

        case .iPhone12ProMax, .iPhone13ProMax:

            return CGSize(width: 1284, height: 2778)

        case .iPhone14:

            return CGSize(width: 1170, height: 2532)

        case .iPhone14Plus:

            return CGSize(width: 1284, height: 2778)

        case .iPhone14Pro:

            return CGSize(width: 1179, height: 2556)

        case .iPhone14ProMax:

            return CGSize(width: 1290, height: 2796)
            
        case .iPhone15:
            
            return CGSize(width: 1179, height: 2556)

        case .iPhone15Plus:
            
            return CGSize(width: 1290, height: 2796)
            
        case .iPhone15Pro:
            
            return CGSize(width: 1179, height: 2556)
            
        case .iPhone15ProMax:
            
            return CGSize(width: 1290, height: 2796)
        }

    }



    /// 缩放因子

    public func scaleFactor() -> CGFloat? {

        return UIScreen.main.scale

    }



    /// 逻辑分辨率

    public func logicalResolution() -> CGSize? {

        guard let size = physicalResolution() else {

            return nil

        }


        guard let scale = scaleFactor() else {

            return nil

        }


        let tempW = size.width / scale

        let tempH = size.height / scale

        return CGSize(width: tempW, height: tempH)

    }


    /// 对角尺寸(英寸)

    public func diagonalSize() -> CGFloat? {


        switch self {

        case .unknown, .simulator:

            return nil

        case .iPhone5, .iPhone5C, .iPhone5S, .iPhoneSE1:

            return 4

        case .iPhone6, .iPhone6s, .iPhone7, .iPhone8, .iPhoneSE2, .iPhoneSE3:

            return 4.7

        case .iPhone12Mini, .iPhone13Mini:

            return 5.4

        case .iPhone6Plus, .iPhone6sPlus, .iPhone7Plus, .iPhone8Plus:

            return 5.5

        case .iPhoneX, .iPhoneXS, .iPhone11Pro:

            return 5.8

        case .iPhoneXR, .iPhone11, .iPhone12, .iPhone12Pro, .iPhone13, .iPhone13Pro:

            return 6.1

        case .iPhoneXSMax, .iPhone11ProMax:

            return 6.5

        case .iPhone12ProMax, .iPhone13ProMax:

            return 6.7

        case .iPhone14:

            return 6.1

        case .iPhone14Plus:

            return 6.7

        case .iPhone14Pro:

            return 6.1

        case .iPhone14ProMax:

            return 6.7
            
        case .iPhone15:

            return 6.1

        case .iPhone15Plus:

            return 6.7

        case .iPhone15Pro:

            return 6.1

        case .iPhone15ProMax:

            return 6.7

        }

    }


    /// 芯片

    public func chip() -> String? {

        switch self {

        case .unknown, .simulator:

            return nil

        case .iPhone5, .iPhone5C:

            return "A6"

        case .iPhone5S:

            return "A7"

        case .iPhone6, .iPhone6Plus:

            return "A8"

        case .iPhoneSE1, .iPhone6s, .iPhone6sPlus:

            return "A9"

        case .iPhone7, .iPhone7Plus:

            return "A10"

        case .iPhone8, .iPhone8Plus, .iPhoneX:

            return "A11"

        case .iPhoneXR, .iPhoneXS, .iPhoneXSMax:

            return "A12"

        case .iPhoneSE2, .iPhone11, .iPhone11Pro, .iPhone11ProMax:

            return "A13"

        case .iPhone12Mini, .iPhone12, .iPhone12Pro, .iPhone12ProMax:

            return "A14"

        case .iPhone13Mini, .iPhone13, .iPhone13Pro, .iPhone13ProMax:

            return "A15"

        case .iPhone14, .iPhone14Plus:

            return "A15"

        case .iPhone14Pro, .iPhone14ProMax:

            return "A16"
            
        case .iPhoneSE3:

            return "A15"

        case .iPhone15:

            return "A16"

        case .iPhone15Plus:

            return "A16"

        case .iPhone15Pro:

            return "A17"

        case .iPhone15ProMax:

            return "A17"

        }

    }


    /// 是否全面屏

    public func isFullSreen() -> Bool {

        switch self {

        case .iPhone5, .iPhone5C, .iPhone5S:

            return false

        case .iPhone6, .iPhone6s, .iPhone6Plus, .iPhone6sPlus:

            return false

        case .iPhone7, .iPhone7Plus:

            return false

        case .iPhone8, .iPhone8Plus:

            return false

        case .iPhoneSE1, .iPhoneSE2, .iPhoneSE3:

            return false

        default:

            return true

        }

    }


    /// 是否iPhoneX之后发布的手机 (包含iPhoneX)

    public func isReleasedAtiPhoneX() -> Bool {

        switch self {

        case .iPhone5, .iPhone5C, .iPhone5S:

            return false

        case .iPhone6, .iPhone6s, .iPhone6Plus, .iPhone6sPlus:

            return false

        case .iPhone7, .iPhone7Plus:

            return false

        case .iPhone8, .iPhone8Plus:

            return false

        case .iPhoneSE1:

            return false

        default:

            return true

        }

    }

}