I'm working on a watchOS app using SwiftUI that updates its UI based on regular, time-driven logic. On a real Apple Watch, after the app has been running for ~1 minute, the device enters Always-On / power-saving display mode (screen dimmed, wrist down). From that point on, SwiftUI UI updates become noticeably delayed. The underlying logic continues to run correctly, but the UI only redraws sporadically and often "catches up" once the screen becomes fully active again. The app is running in workout mode, which keeps it alive and maintains WatchConnectivity, but this does not prevent UI redraw throttling. Below is a minimal reproducible example that demonstrates the issue.
PlaybackModel.swift
import SwiftUI
@MainActor
final class PlaybackModel: ObservableObject {
@Published var beat: Int = 0
private var timer: Timer?
func start() {
timer?.invalidate()
timer = Timer.scheduledTimer(withTimeInterval: 0.5, repeats: true) { _ in
Task { @MainActor in
self.beat += 1
}
}
}
func stop() {
timer?.invalidate()
}
}
ContentView.swift (watchOS)
import SwiftUI
struct ContentView: View {
@StateObject private var model = PlaybackModel()
var body: some View {
VStack {
Text("Beat: \(model.beat)")
.font(.largeTitle)
}
.onAppear {
model.start()
}
.onDisappear {
model.stop()
}
}
}
Observed Behavior
• The beat value continues to increase reliably.
• After the watch enters Always-On / power-saving mode, SwiftUI redraws are delayed or skipped.
• When the screen becomes fully active again, the UI catches up.
Questions: • Is this UI redraw throttling in Always-On / power-saving mode an unavoidable system limitation on watchOS? • Is there any supported way to keep consistent SwiftUI update frequency while the app is visible but dimmed?