【iOS】プラットフォーム情報取得4~Swift編~【2018年版】

devdevdev.hatenablog.com
↑3年半ぶりに更新。Swiftで書き直したのとiPhoneX / iPad Proまで入ってるのと、ちょこっと機能追加!



import UIKit

public struct Device {

    static let iPhoneX = "iPhone X"
    static let iPad = "iPad"
    static let iPodTouch = "iPod Touch"
    static let iPhone = "iPhone"

    static var deviceInfo: String {
        var size: Int = 0
        sysctlbyname("hw.machine", nil, &size, nil, 0)
        var machine = [CChar](repeating: 0, count: Int(size))
        sysctlbyname("hw.machine", &machine, &size, nil, 0)
        let code: String = String(cString: machine)

        let deviceCodeDic: [String: String] = [
            /* Simulator */
            "i386": "Simulator",
            "x86_64": "Simulator",
            /* iPod */
            "iPod1,1": "iPod Touch 1th",            // iPod Touch 1th Generation
            "iPod2,1": "iPod Touch 2th",            // iPod Touch 2th Generation
            "iPod3,1": "iPod Touch 3th",            // iPod Touch 3th Generation
            "iPod4,1": "iPod Touch 4th",            // iPod Touch 4th Generation
            "iPod5,1": "iPod Touch 5th",            // iPod Touch 5th Generation
            "iPod7,1": "iPod Touch 6th",            // iPod Touch 6th Generation
            /* iPhone */
            "iPhone1,1": "iPhone 2G",                 // iPhone 2G
            "iPhone1,2": "iPhone 3G",                 // iPhone 3G
            "iPhone2,1": "iPhone 3GS",                // iPhone 3GS
            "iPhone3,1": "iPhone 4",                  // iPhone 4 GSM
            "iPhone3,2": "iPhone 4",                  // iPhone 4 GSM 2012
            "iPhone3,3": "iPhone 4",                  // iPhone 4 CDMA For Verizon,Sprint
            "iPhone4,1": "iPhone 4S",                 // iPhone 4S
            "iPhone5,1": "iPhone 5",                  // iPhone 5 GSM
            "iPhone5,2": "iPhone 5",                  // iPhone 5 Global
            "iPhone5,3": "iPhone 5c",                 // iPhone 5c GSM
            "iPhone5,4": "iPhone 5c",                 // iPhone 5c Global
            "iPhone6,1": "iPhone 5s",                 // iPhone 5s GSM
            "iPhone6,2": "iPhone 5s",                 // iPhone 5s Global
            "iPhone7,1": "iPhone 6 Plus",             // iPhone 6 Plus
            "iPhone7,2": "iPhone 6",                  // iPhone 6
            "iPhone8,1": "iPhone 6S",                 // iPhone 6S
            "iPhone8,2": "iPhone 6S Plus",            // iPhone 6S Plus
            "iPhone8,4": "iPhone SE", // iPhone SE
            "iPhone9,1": "iPhone 7",                  // iPhone 7 A1660,A1779,A1780
            "iPhone9,3": "iPhone 7",                  // iPhone 7 A1778
            "iPhone9,2": "iPhone 7 Plus",             // iPhone 7 Plus A1661,A1785,A1786
            "iPhone9,4": "iPhone 7 Plus",             // iPhone 7 Plus A1784
            "iPhone10,1": "iPhone 8",                  // iPhone 8 A1863,A1906,A1907
            "iPhone10,4": "iPhone 8",                  // iPhone 8 A1905
            "iPhone10,2": "iPhone 8 Plus",             // iPhone 8 Plus A1864,A1898,A1899
            "iPhone10,5": "iPhone 8 Plus",             // iPhone 8 Plus A1897
            "iPhone10,3": "iPhone X",                  // iPhone X A1865,A1902
            "iPhone10,6": "iPhone X",                  // iPhone X A1901

            /* iPad */
            "iPad1,1": "iPad 1 ",                   // iPad 1
            "iPad2,1": "iPad 2 WiFi",               // iPad 2
            "iPad2,2": "iPad 2 Cell",               // iPad 2 GSM
            "iPad2,3": "iPad 2 Cell",               // iPad 2 CDMA (Cellular)
            "iPad2,4": "iPad 2 WiFi",               // iPad 2 Mid2012
            "iPad2,5": "iPad Mini WiFi",            // iPad Air WiFi
            "iPad2,6": "iPad Mini Cell",            // iPad Mini GSM (Cellular)
            "iPad2,7": "iPad Mini Cell",            // iPad Mini Global (Cellular)
            "iPad3,1": "iPad 3 WiFi",               // iPad 3 WiFi
            "iPad3,2": "iPad 3 Cell",               // iPad 3 CDMA (Cellular)
            "iPad3,3": "iPad 3 Cell",               // iPad 3 GSM (Cellular)
            "iPad3,4": "iPad 4 WiFi",               // iPad 4 WiFi
            "iPad3,5": "iPad 4 Cell",               // iPad 4 GSM (Cellular)
            "iPad3,6": "iPad 4 Cell",               // iPad 4 Global (Cellular)
            "iPad4,1": "iPad Air WiFi",             // iPad Air WiFi
            "iPad4,2": "iPad Air Cell",             // iPad Air Cellular
            "iPad4,4": "iPad Mini 2 WiFi",          // iPad mini 2 WiFi
            "iPad4,5": "iPad Mini 2 Cell",          // iPad mini 2 Cellular
            "iPad4,6": "iPad Mini 2 China",         // iPad mini 2 ChinaModel
            "iPad4,7": "iPad Mini 3 WiFi",          // iPad mini 3 WiFi
            "iPad4,8": "iPad Mini 3 Cell",          // iPad mini 3 Cellular
            "iPad4,9": "iPad Mini 3 China",         // iPad mini 3 ChinaModel
            "iPad5,1": "iPad Mini 4 WiFi",          // iPad Mini 4 WiFi
            "iPad5,2": "iPad Mini 4 Cell",          // iPad Mini 4 Cellular
            "iPad5,3": "iPad Air 2 WiFi",           // iPad Air 2 WiFi
            "iPad5,4": "iPad Air 2 Cell",           // iPad Air 2 Cellular
            "iPad6,3": "iPad Pro 9.7inch WiFi",     // iPad Pro 9.7inch WiFi
            "iPad6,4": "iPad Pro 9.7inch Cell",     // iPad Pro 9.7inch Cellular
            "iPad6,7": "iPad Pro 12.9inch WiFi",    // iPad Pro 12.9inch WiFi
            "iPad6,8": "iPad Pro 12.9inch Cell"]    // iPad Pro 12.9inch Cellular

        if let deviceName = deviceCodeDic[code] {
            return deviceName
        } else {
            if code.range(of: "iPod") != nil {
                return iPodTouch
            } else if code.range(of: iPad) != nil {
                return iPad
            } else if code.range(of: iPhone) != nil {
                return iPhone
            } else {
                return "unknownDevice"
            }
        }
    }

    static let baseScreenWidth: CGFloat = 320.0

    static var bounds: CGRect {
        return UIScreen.main.bounds
    }

    static var screenWidth: CGFloat {
        return UIScreen.main.bounds.size.width
    }

    static var screenHeight: CGFloat {
        return UIScreen.main.bounds.size.height
    }

    static var statusBarHeight: CGFloat {
        return UIApplication.shared.statusBarFrame.height
    }

    static var screenRatio: CGFloat {
        return UIScreen.main.bounds.size.width / baseScreenWidth
    }

    static func navBarHeight(navigationController: UINavigationController) -> CGFloat {
        return navigationController.navigationBar.frame.size.height
    }

    static func commonTopHeight(navigationController: UINavigationController) -> CGFloat {
        return navBarHeight(navigationController: navigationController) + statusBarHeight
    }
}