【Swift】デバイスのバッテリー残量や充電状態を取得する方法!
この記事からわかること
- Swiftでデバイス(iPhone)のバッテリー残量を取得する方法
- UIDeviceの使い方とbatteryLevelプロパティ
- 充電状態を識別するには?
- Swift UIで変化を観測するには?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:14.3.1
- iOS:16.4
バッテリー残量を取得する
Swiftでデバイスのバッテリー残量を取得するにはUIDevice
クラスのbatteryLevel
から参照することが可能です。しかしそのためにはisBatteryMonitoringEnabled
にtrue
を渡してバッテリーの監視を有効にしておく必要があります。
// バッテリーの監視を有効にする
UIDevice.current.isBatteryMonitoringEnabled = true
var batteryLevel = UIDevice.current.batteryLevel // 0.67 ← 67%の場合
print("\(Int(batteryLevel * 100))%") // 67%
バッテリー残量を取得できるbatteryLevel
はFloat
型で0%であれば0.0
、100%であれば1.0
になります。バッテリーの監視を有効にしていない場合は-1.0
になります。
var batteryLevel: Float { get }
充電中かどうかを識別する
デバイスが充電中かどうかを識別するにはUIDevice
クラスのbatteryState
プロパティからBatteryState
型で取得し、switch
で分岐させることで識別することが可能です。
let status: UIDevice.BatteryState = UIDevice.current.batteryState
switch status {
case .unknown:
print("不明")
case .unplugged:
print("プラグがささってない")
case .charging:
print("充電中")
case .full:
print("フル充電完了")
default:
print("不明")
}
UIDeviceクラスでは他にもデバイスの種類を識別したりすることが可能です。UIDeviceクラスの他の使い方は以下の記事を参考にしてください。
Swift UIで充電中のバッテリー情報を表示する
Swift UIでデバイスのバッテリー状態を観測し、画面に表示する実装をしてみました。バッテリー残量の変化とともに画面の数値も更新され、充電中であることを識別できるようになっています。
import SwiftUI
import Combine
class ViewModel: ObservableObject {
// 充電中かどうか
@Published var text = ""
// バッテリー残量
@Published var batteryLevel: Float = 0
private let device = UIDevice.current
private var cancellable = Set<AnyCancellable>()
init() {
device.isBatteryMonitoringEnabled = true
device.publisher(for: \.batteryState)
.sink { [weak self] status in
guard let self else { return }
switch status {
case .unknown:
text = "不明"
case .unplugged:
text = "プラグがささってない"
case .charging:
text = "充電中"
case .full:
text = "フル充電完了"
default:
text = "不明"
}
}
.store(in: &cancellable)
device.publisher(for: \.batteryLevel)
.map { $0 * 100 }
.assign(to: &$batteryLevel)
}
}
struct ContentView: View {
@ObservedObject var viewModel = ViewModel()
var body: some View {
VStack {
Text("\(Int(viewModel.batteryLevel))%")
Text(viewModel.text)
}
}
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。