MACアドレスを取得する方法には、いろいろな方法がありますが、今回はmacOSのSystemConfigurationフレームワークを使って取得する方法を試してみました。
なお、iOSでは現在はMACアドレスを取得することができないようになっているので、この方法も使えません。
手順
SystemConfigurationフレームワークを使って取得するには、次のような手順を踏みます。
-
SCNetworkServiceCopyAll
関数を使ってSCNetworkServiceCopyAll
の配列を取得する。 -
SCNetworkServiceGetEnabled
関数を使って有効かどうかを判定する。無効なときはパス。 -
SCNetworkServiceGetInterface
関数をSCNetworkInterface
を取得する。 -
SCNetworkInterfaceGetHardwareAddressString
関数を使ってMACアドレスを取得する。 - BSDネーム(「en0」とか)が必要なときは、
SCNetworkInterfaceGetBSDName
関数で取得する。
途中ループがあって、回りくどいのですが、SystemConfigurationフレームワークがなかった頃に使っていたIOKitを使った方法よりもシンプルなコードになります。
コード例
import Foundation
import SystemConfiguration
func printMACAddress() {
let processName = ProcessInfo.processInfo.processName
guard let pref = SCPreferencesCreate(kCFAllocatorDefault, processName as CFString, nil) else {
print("ERROR: Failed to create the SCPreferences object")
return
}
guard let netServices = SCNetworkServiceCopyAll(pref) as? [SCNetworkService] else {
print("ERROR: Failed to obtain network services")
return
}
// 有効なサービスの名前、インターフェイスのBSDネームとMACアドレスを出力する
for netService in netServices {
if SCNetworkServiceGetEnabled(netService) {
if let netInf = SCNetworkServiceGetInterface(netService) {
var serviceName = SCNetworkServiceGetName(netService)
var bsdName = SCNetworkInterfaceGetBSDName(netInf)
var hwAddr = SCNetworkInterfaceGetHardwareAddressString(netInf)
print("\(serviceName): \(bsdName), \(hwAddr)")
}
}
}
}
printMACAddress()
他の方法
他にも次のような方法でもできました。
-
sysctl
関数を使った方法 - ソケットを使った方法
- IOKitを使った方法