Live Activity Content Density
Nucleic-Session: B3643133-163C-4C5D-BE20-1A6B7FB83DA9 Co-authored-by: Nucleic <[email protected]>
This commit is contained in:
@@ -90,17 +90,34 @@ final class LiveActivityManager {
|
|||||||
// recovered one still needs the fresh state, so fall through to the update pipeline.
|
// recovered one still needs the fresh state, so fall through to the update pipeline.
|
||||||
if let existing = Activity<NucleicSessionAttributes>.activities.first {
|
if let existing = Activity<NucleicSessionAttributes>.activities.first {
|
||||||
activity = existing
|
activity = existing
|
||||||
|
observePushToken(existing)
|
||||||
enqueue(state)
|
enqueue(state)
|
||||||
} else {
|
} else {
|
||||||
activity = try? Activity.request(
|
// `pushType: .token` opts the activity into APNs updates — the Macs push new
|
||||||
|
// content-state to the token so the glance stays fresh while the phone is locked.
|
||||||
|
let started = try? Activity.request(
|
||||||
attributes: NucleicSessionAttributes(hostName: hostName),
|
attributes: NucleicSessionAttributes(hostName: hostName),
|
||||||
content: ActivityContent(state: state, staleDate: nil))
|
content: ActivityContent(state: state, staleDate: nil),
|
||||||
|
pushType: .token)
|
||||||
|
activity = started
|
||||||
|
if let started { observePushToken(started) }
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
enqueue(state)
|
enqueue(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Forward the activity's APNS update token (and its rotations) to `RemoteStore`.
|
||||||
|
private func observePushToken(_ activity: Activity<NucleicSessionAttributes>) {
|
||||||
|
tokenObservation?.cancel()
|
||||||
|
tokenObservation = Task { [weak self] in
|
||||||
|
for await tokenData in activity.pushTokenUpdates {
|
||||||
|
let hex = tokenData.map { String(format: "%02x", $0) }.joined()
|
||||||
|
self?.onPushToken?(hex, activity.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Hand the newest state to the serial drainer (starting it if idle).
|
/// Hand the newest state to the serial drainer (starting it if idle).
|
||||||
private func enqueue(_ state: NucleicSessionAttributes.ContentState) {
|
private func enqueue(_ state: NucleicSessionAttributes.ContentState) {
|
||||||
pendingState = state
|
pendingState = state
|
||||||
|
|||||||
Reference in New Issue
Block a user