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년전 질문