LoginSignup
1
0

More than 5 years have passed since last update.

SystemConfigurationフレームワークを使ってMACアドレスを取得する

Posted at

MACアドレスを取得する方法には、いろいろな方法がありますが、今回はmacOSのSystemConfigurationフレームワークを使って取得する方法を試してみました。
なお、iOSでは現在はMACアドレスを取得することができないようになっているので、この方法も使えません。

手順

SystemConfigurationフレームワークを使って取得するには、次のような手順を踏みます。

  1. SCNetworkServiceCopyAll関数を使ってSCNetworkServiceCopyAllの配列を取得する。
  2. SCNetworkServiceGetEnabled関数を使って有効かどうかを判定する。無効なときはパス。
  3. SCNetworkServiceGetInterface関数をSCNetworkInterfaceを取得する。
  4. SCNetworkInterfaceGetHardwareAddressString関数を使ってMACアドレスを取得する。
  5. 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を使った方法
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0