Getting Apple Device Information on Swift
SwiftのコードでApple製品のデバイスの情報を取得する方法をメモしておく。
下記の内容は以下のSwift Packageを実装する際に使用している:
機種ID (Model Identifier)を取得する [iOS, macOS]
iOS
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)
print(code) // -> iPhone13,2
Mac
var size: Int = 0
sysctlbyname("hw.model", nil, &size, nil, 0)
var machine = [CChar](repeating: 0, count: Int(size))
sysctlbyname("hw.model", &machine, &size, nil, 0)
let code: String = String(cString:machine)
print(code) // -> MacBookAir10,1
CPUの型番を取得する [macOS]
var size: Int = 0
sysctlbyname("machdep.cpu.brand_string", nil, &size, nil, 0)
var machine = [CChar](repeating: 0, count: Int(size))
sysctlbyname("machdep.cpu.brand_string", &machine, &size, nil, 0)
let cpuInfo: String = String(cString:machine)
print(cpuInfo) // -> Intel(R) Core(TM) i5-5250 CPU @ 1.60GHz
CPUの物理コア数を取得する [iOS, macOS]
var core: Int32 = 0
var size = MemoryLayout<Int32>.size
sysctlbyname("hw.physicalcpu", &core, &size, nil, 0)
print(core) // -> 2
CPUのコア数を取得する [iOS, macOS]
Macの場合は論理コア数が返ってくる("hw.ncpu"
と同じ値)。iOSの場合は上記と同じ数字が返ってくる。
let core = ProcessInfo.processInfo.processorCount
print(core) // -> 4
CPUのクロック周波数を取得する [macOS (Intel)]
単位はHzで返ってくる。
Apple Silicon Macの場合、sysctlbyname
でクロック周波数を取得できない。
var freq: Int64 = 0
var size = MemoryLayout<Int64>.size
sysctlbyname("hw.cpufrequency", &freq, &size, nil, 0)
print(freq) // -> 1600000000
高性能コアと高効率コアのコア数を取得する [iOS, macOS (Apple Silicon)]
A10以降のiOSデバイスやApple Silicon Macは、big.LITTLEのSoCであるため、高性能コアと高効率コアが存在する。
高性能コア
var cores: Int64 = 0
var size = MemoryLayout<Int64>.size
if sysctlbyname("hw.perflevel0.physicalcpu", &cores, &size, nil, 0) != 0 {
return nil
}
print(cores) // -> 8
高効率コア
var cores: Int64 = 0
var size = MemoryLayout<Int64>.size
if sysctlbyname("hw.perflevel1.physicalcpu", &cores, &size, nil, 0) != 0 {
return nil
}
print(cores) // -> 4
GPUの型番を取得する [iOS, macOS]
Metalが使用するデフォルトのGPUを取得する。iGPUとdGPUが搭載されているMacBookなどの場合は、dGPUがデフォルトである。
import Metal
guard let device = MTLCreateSystemDefaultDevice() else {
fatalError( "Failed to get the system's default Metal device." )
}
print(device.name) // -> Intel(R) Iris Plus Graphics 655
RAMの容量を取得する [iOS, macOS]
単位はB (バイト)で返ってくる。また、UInt64で返ってくるのでIntとして使う場合はキャストする。
let ram = ProcessInfo.processInfo.physicalMemory
print(ram) // -> 2071019520
参考
- 【Swift】iOSデバイスのモデル名を取得するだけのFrameworkを作った
- Gathering system information in swift with sysctl
- Accessing macOS System Information
- Getting the Default GPU - Apple Developer Documentation
sysctl
sysctlbyname
はC言語の関数で、システムの情報を取得できるものである。
int sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen);
戻り値は、成功したときに0
、そうでないときは-1
である。
ターミナル上でsysctl -A
を実行すると(おそらく)取得できる値の一覧を見ることができる。また、man 3 sysctl
でマニュアルを見ることもできる。