今回作成するアプリ

iPhoneのバッテリー残量と充電マークを、標準で表示されているものとは別に作りたい場合どうすればいいでしょうか?

今回はその方法をご紹介します。

実装

コード

import SwiftUI
import Combine

struct ContentView: View {

    @ObservedObject private var batteryModel = BatteryModel()
    
    var body: some View {
        HStack{
            if batteryModel.isCharging {
                //充電中のとき
                Image(systemName: "battery.100.bolt")
                    .resizable()
                    .scaledToFit()
                    .frame(width: 80)
                    .foregroundColor(.green)
                    
            } else {
                //充電していないとき
                Image(systemName: "battery.100")
                    .resizable()
                    .scaledToFit()
                    .frame(width: 80)
            }
            Text("\(Int(batteryModel.batteryLevel))%")
                .font(.system(size: 40, weight: .bold))
        }
    }
   
}

class BatteryModel: ObservableObject {
    
    //充電中かどうか
    @Published var isCharging = false
    
    //バッテリー残量
    @Published var batteryLevel: CGFloat = 100

    let device = UIDevice.current
    var cancellable = Set<AnyCancellable>()

    init() {
        device.isBatteryMonitoringEnabled = true

        device.publisher(for: \.batteryState)
            .sink { [weak self] status in
                
                guard let self else { return }
                
                if status == .charging{
                    self.isCharging = true
                } else {
                    self.isCharging = false
                }
               
            }
            .store(in: &cancellable)

        device.publisher(for: \.batteryLevel)
            .map { CGFloat($0) * 100 }
            .assign(to: &$batteryLevel)
    }
}

動作

環境

macOS Ventura 13.0.1

Xcode 14.2

iOS 16.2

Simulater iPhone 14 Pro Max

アイキャッチ画像 出典: App.com