[macOS] AppInfo + MAC/IP Address

swift macos appinfo ip

NBBundle.infoDictionary 래핑

import Foundation
import SystemConfiguration

//MARK: - Convertors

infix operator >> { associativity right precedence 90 }
func >> <T, R>(x: T, f: (T) -> R) -> R {
    return f(x)
}

private func string(object: AnyObject?) -> String? {
    return object as? String
}

private func stringToInt(object: AnyObject?) -> Int? {
    return Int(object as! String)
}

private func int(object: AnyObject?) -> Int? {
    return object as? Int
}

private func array<T>(object: AnyObject?) -> Array<T>? {
    return object as? Array
}

public struct AppInfo {
    private static let bundleInfo = NSBundle.mainBundle().infoDictionary!
    
    public static var macAddressSeparator = ":"
    
    public static var CFBundleIdentifier: String? {
        return bundleInfo["CFBundleIdentifier"] >> string
    }
    
    public static var DTPlatformName: String? {
        return bundleInfo["DTPlatformName"] >> string
    }
    
    public static var UIMainStoryboardFile: String? {
        return bundleInfo["UIMainStoryboardFile"] >> string
    }
    
    public static var CFBundleVersion: Int? {
        return bundleInfo["CFBundleVersion"] >> stringToInt
    }
    
    public static var CFBundleSignature: String? {
        return bundleInfo["CFBundleSignature"] >> string
    }
    
    public static var CFBundleExecutable: String? {
        return bundleInfo["CFBundleExecutable"] >> string
    }
    
    public static var LSRequiresIPhoneOS: Int? {
        return bundleInfo["LSRequiresIPhoneOS"] >> int
    }
    
    public static var CFBundleName: String? {
        return bundleInfo["CFBundleName"] >> string
    }
    
    public static var CFBundleDisplayName: String? {
        return bundleInfo["CFBundleDisplayName"] >> string
    }
    
    public static var UILaunchStoryboardName: String? {
        return bundleInfo["UILaunchStoryboardName"] >> string
    }
    
    public static var CFBundleSupportedPlatforms: Array<String>? {
        return bundleInfo["CFBundleSupportedPlatforms"] >> array
    }
    
    public static var CFBundlePackageType: String? {
        return bundleInfo["CFBundlePackageType"] >> string
    }
    
    public static var CFBundleNumericVersion: Int? {
        return bundleInfo["CFBundleNumericVersion"] >> int
    }
    
    public static var CFBundleInfoDictionaryVersion: String? {
        return bundleInfo["CFBundleInfoDictionaryVersion"] >> string
    }
    
    public static var UIRequiredDeviceCapabilities: Array<String>? {
        return bundleInfo["UIRequiredDeviceCapabilities"] >> array
    }
    
    public static var UISupportedInterfaceOrientations: Array<String>? {
        return bundleInfo["UISupportedInterfaceOrientations"] >> array
    }
    
    public static var CFBundleInfoPlistURL: String? {
        return bundleInfo["CFBundleInfoPlistURL"] >> string
    }
    
    public static var CFBundleDevelopmentRegion: String? {
        return bundleInfo["CFBundleDevelopmentRegion"] >> string
    }
    
    public static var DTSDKName: String? {
        return bundleInfo["DTSDKName"] >> string
    }
    
    public static var UIDeviceFamily: Array<Int>? {
        return bundleInfo["UIDeviceFamily"] >> array
    }
    
    public static var CFBundleShortVersionString: String? {
        return bundleInfo["CFBundleShortVersionString"] >> string
    }
    
    public static var hostName: String = {
        return NSHost.currentHost().localizedName!
    }()

    public static var macAddress: String! = {
        let matchingDict = IOServiceMatching("IOEthernetInterface") as NSMutableDictionary
        // Note that another option here would be:
        // matchingDict = IOBSDMatching("en0");
        // but en0: isn't necessarily the primary interface, especially on systems with multiple Ethernet ports.
        
        matchingDict["IOPropertyMatch"] = [ "IOPrimaryInterface" : true]
        
        var matchingServices : io_iterator_t = 0
        guard IOServiceGetMatchingServices(kIOMasterPortDefault, matchingDict, &matchingServices) == KERN_SUCCESS else {
            return nil
        }
        
        var macAddress : [UInt8] = []
        
        var intfService = IOIteratorNext(matchingServices)
        while intfService != 0 {
            
            var controllerService : io_object_t = 0
            if IORegistryEntryGetParentEntry(intfService, "IOService", &controllerService) == KERN_SUCCESS {
                
                if let dataUM = IORegistryEntryCreateCFProperty(controllerService, "IOMACAddress", kCFAllocatorDefault, 0) {
                    let data = dataUM.takeRetainedValue() as! NSData
                    macAddress = [0, 0, 0, 0, 0, 0]
                    data.getBytes(&macAddress, length: macAddress.count)
                }
                IOObjectRelease(controllerService)
            }
            
            IOObjectRelease(intfService)
            intfService = IOIteratorNext(matchingServices)
        }
        
        IOObjectRelease(matchingServices)
        
        let macAddressString = macAddress.map({ String(format:"%02x", $0) }).joinWithSeparator(AppInfo.macAddressSeparator)
        
        return macAddressString.uppercaseString
    }()
    
    public static var ipAddresses: [String] = {
        return NSHost.currentHost().addresses
    }()

    public static var ipAddress: String = {
        let addresses = AppInfo.ipAddresses
        for address in addresses {
            if address.characters.contains(".") {
                return address
            }
        }
        return addresses.first!
    }()
    
    public static var workGroup: String = {
        let store = SCDynamicStoreCreate(nil, kSCPropNetSMBWorkgroup, nil, nil)
        let key = SCDynamicStoreKeyCreateNetworkGlobalEntity(nil, kSCDynamicStoreDomainState, kSCEntNetSMB)
        
        guard let global = SCDynamicStoreCopyValue(store, key) as? [NSObject: AnyObject],
            workgroup = global[kSCPropNetSMBWorkgroup] as? String else {
            return ""
        }
        
        return workgroup
    }()
}

유승훈 7년전 질문


댓글 0

댓글작성

목록보기