跳转至

iOS 电池状态获取

我们使用 Swift 调用 iOS 提供的电池 API 来获取电池状态和电量:

  • 调用 UIDevice.current.isBatteryMonitoringEnabled = true 确保电池状态可获取。
  • 通过 UIDevice.current.batteryState 拿到电池状态
  • 通过 UIDevice.current.batteryLevel 拿到电量

进一步创建 BatteryStatus 类:

Swift
1
2
3
4
5
6
7
8
class BatteryStatus {
    var isCharging: Bool? {
        return ...
    }
    var value: Float? {
        return ...
    }
}
  • isCharging 属性判断设备是否正在充电,null 表示无法获取设备电池状态
  • value 为一个 0.0 到 1.0 的小数,表示设备的电量,null 表示无法获取设备电池状态

使用 SwiftUI 构建页面,完整的 ContentView.swift 呈现如下:

Swift
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import SwiftUI
import UIKit

class BatteryStatus {
    var isCharging: Bool? {
        UIDevice.current.isBatteryMonitoringEnabled = true
        if UIDevice.current.batteryState == .unknown {
            return nil
        } else if UIDevice.current.batteryState == .charging || UIDevice.current.batteryState == .full {
            return true
        } else {
            return false
        }
    }

    var value: Float? {
        UIDevice.current.isBatteryMonitoringEnabled = true
        if UIDevice.current.batteryState == .unknown {
            return nil
        } else {
            return UIDevice.current.batteryLevel
        }
    }
}

struct ContentView: View {
    let batteryStatus = BatteryStatus()
    var body: some View {
        HStack {
            if batteryStatus.isCharging == nil {
                Image(systemName: "questionmark")
            } else if batteryStatus.isCharging! {
                Image(systemName: "bolt.fill")
            }
            if batteryStatus.value == nil {
                Image(systemName: "questionmark")
            } else {
                Text("\(Int(batteryStatus.value! * 100))")
                    .bold()
            }
        }
        .padding()
    }
}

在 iOS 真机上运行,得到下面的结果:

附:Xcode 创建 SwiftUI 项目