Launch Activity Logic
Nucleic-Session: EBB24271-3AB2-4CBD-A47A-59FC73500371 Co-authored-by: Nucleic <[email protected]>
This commit is contained in:
@@ -189,6 +189,41 @@ final class LiveActivityManager {
|
|||||||
enqueue(state)
|
enqueue(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Start the process-lived observers that make push-to-start work: the device's push-to-start
|
||||||
|
/// token (forwarded to the Macs so they can create the glance over APNs) and adoption of any
|
||||||
|
/// Activity a Mac push-started while the app was closed. Idempotent — safe to call on every
|
||||||
|
/// bridge setup; the guards keep a single observer each.
|
||||||
|
func beginPushToStartObservation() {
|
||||||
|
guard ActivityAuthorizationInfo().areActivitiesEnabled else { return }
|
||||||
|
if pushToStartObservation == nil {
|
||||||
|
pushToStartObservation = Task { [weak self] in
|
||||||
|
for await data in Activity<NucleicSessionAttributes>.pushToStartTokenUpdates {
|
||||||
|
let hex = data.map { String(format: "%02x", $0) }.joined()
|
||||||
|
self?.onPushToStartToken?(hex)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if activityAdoptionObservation == nil {
|
||||||
|
activityAdoptionObservation = Task { [weak self] in
|
||||||
|
for await activity in Activity<NucleicSessionAttributes>.activityUpdates {
|
||||||
|
self?.adopt(activity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Adopt an Activity we didn't create locally — almost always one a Mac push-started while the
|
||||||
|
/// app was closed. Taking ownership wires up its update-token stream (`observePushToken`) so the
|
||||||
|
/// Macs can keep the glance fresh the normal way, and collapses any strays to one. If we already
|
||||||
|
/// track an Activity, leave it: the local `Activity.request` path and `endStrays` already keep a
|
||||||
|
/// single glance, and re-adopting would just churn the token observation.
|
||||||
|
private func adopt(_ activity: Activity<NucleicSessionAttributes>) {
|
||||||
|
guard self.activity == nil else { return }
|
||||||
|
self.activity = activity
|
||||||
|
observePushToken(activity)
|
||||||
|
endStrays(keeping: activity.id)
|
||||||
|
}
|
||||||
|
|
||||||
/// Forward the activity's APNS update token (and its rotations) to `RemoteStore`.
|
/// Forward the activity's APNS update token (and its rotations) to `RemoteStore`.
|
||||||
private func observePushToken(_ activity: Activity<NucleicSessionAttributes>) {
|
private func observePushToken(_ activity: Activity<NucleicSessionAttributes>) {
|
||||||
tokenObservation?.cancel()
|
tokenObservation?.cancel()
|
||||||
|
|||||||
Reference in New Issue
Block a user