【Swift】デバイスのバッテリー残量や充電状態を取得する方法!

この記事からわかること

  • Swiftデバイス(iPhone)バッテリー残量取得する方法
  • UIDevice使い方batteryLevelプロパティ
  • 充電状態識別するには?
  • Swift UI変化観測するには?

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

公式リファレンス:UIDeviceクラス

環境

バッテリー残量を取得する

Swiftでデバイスのバッテリー残量を取得するにはUIDeviceクラスのbatteryLevelから参照することが可能です。しかしそのためにはisBatteryMonitoringEnabledtrueを渡してバッテリーの監視を有効にしておく必要があります。

// バッテリーの監視を有効にする
UIDevice.current.isBatteryMonitoringEnabled = true
var batteryLevel = UIDevice.current.batteryLevel // 0.67 ← 67%の場合
print("\(Int(batteryLevel * 100))%") // 67%

バッテリー残量を取得できるbatteryLevelFloat型で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でデバイスのバッテリー状態を観測し、画面に表示する実装をしてみました。バッテリー残量の変化とともに画面の数値も更新され、充電中であることを識別できるようになっています。

【Swift】デバイスのバッテリー残量や充電状態を取得する方法!
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)
        }
    }
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index