0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwiftでAppleのデバイス情報を取得する方法

Last updated at Posted at 2024-11-19

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

参考

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でマニュアルを見ることもできる。

sysctlbyname (3) manページ

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?