// // LiveActivityManager.swift // Keging // // 다이나믹 아일랜드 Live Activity — 현재 횟수·수축/이완 국면 표시 // import ActivityKit import Foundation @MainActor final class LiveActivityManager { static let shared = LiveActivityManager() private var activity: Activity? private init() {} /// 앱 시작 시 호출 — 강제 종료 등으로 남은 이전 Live Activity를 정리한다 /// (안 하면 운동 중 강제 종료 시 다이나믹 아일랜드가 몇 시간 동안 유령으로 남음) func cleanupStaleActivities() { for stale in Activity.activities { Task { await stale.end(nil, dismissalPolicy: .immediate) } } activity = nil } /// 없으면 시작, 있으면 갱신 — 국면 전환마다 이 하나만 호출 func sync(phase: KegelPhase, rep: Int, totalReps: Int, phaseEnd: Date) { let state = KegingActivityAttributes.ContentState( phase: phase, rep: rep, totalReps: totalReps, phaseStart: Date(), phaseEnd: phaseEnd ) if let activity { Task { await activity.update(ActivityContent(state: state, staleDate: nil)) } } else { guard ActivityAuthorizationInfo().areActivitiesEnabled else { return } activity = try? Activity.request( attributes: KegingActivityAttributes(startedAt: Date()), content: ActivityContent(state: state, staleDate: nil) ) } } func end() { guard let activity else { return } self.activity = nil Task { await activity.end(nil, dismissalPolicy: .immediate) } } }