How to start and automatically update/end a local live activity?

I'm implementing a timer feature and facing the issue that the live activity I'm starting just continues showing after the timer is complete.

The body of the live activity widget is more or less:

ActivityConfiguration(for: WhendyWidgetAttributes.self) { context in
    VStack {
 
        Text(
            context.state.timerEndDate,
            style: .timer
        )
        // if Date.now < timerEndTime { Text("Done") }
        self.expandedView(state: context.state)
    }
} …

Ideally I could get the activity to show something else when it is done but I don't know how to get it to re-evaluate it's body once the end time is reached.

I create the activity with

let activity = try ActivityKit.Activity.request(
    attributes: attributes,
    content: .init(
        state: .init(timerEndDate: timerEndDate),
        staleDate: timerEndDate
    ),
    pushType: nil
)

Can I schedule the activity to do a refresh it's body (and reevaluating Date.now) once the timerEndDate is reached?

Considered Approaches

trying staleDate

However, the activity never shows that it has become stale. Would it be expected that it shows the stale-ness?

scheduling dismissal

I also thought about starting and immediately stopping the activity with a delayed dismissal, but unfortunately it seems this is limited to a 4 hour window, and I'd like longer timers too.

remote updates

I understand I could use remote notifications to update the live activity, but I'd really like to keep things local as all the functionality is locally plannable.

Background Tasks

I understand these don't run reliably or at a predictable time.

A Timer in the app that updates the content

I think this would only update the activity while the app is in foreground.

How to start and automatically update/end a local live activity?
 
 
Q