diff --git a/ios-native/SemosanWidget/SemosanLiveActivity.swift b/ios-native/SemosanWidget/SemosanLiveActivity.swift index 051a194..e5a7581 100644 --- a/ios-native/SemosanWidget/SemosanLiveActivity.swift +++ b/ios-native/SemosanWidget/SemosanLiveActivity.swift @@ -33,17 +33,25 @@ private struct LiveTimerText: View { var body: some View { Group { if state.isRunning, let epoch = state.timerStartEpoch { - Text(Date(timeIntervalSince1970: epoch / 1000), style: .timer) - .monospacedDigit() + let startDate = Date(timeIntervalSince1970: epoch / 1000) + TimelineView(.periodic(from: .now, by: 1.0)) { tl in + let elapsed = max(0, Int(tl.date.timeIntervalSince(startDate))) + Text(formatExpanded(elapsed)) + .font(.custom("Lexend-SemiBold", size: fontSize)) + .kerning(kerning) + .foregroundColor(C.timerGreen) + .minimumScaleFactor(0.6) + .lineLimit(1) + } } else { Text(formatExpanded(state.elapsedSeconds)) + .font(.custom("Lexend-SemiBold", size: fontSize)) + .kerning(kerning) + .foregroundColor(C.timerGreen) + .minimumScaleFactor(0.6) + .lineLimit(1) } } - .font(.custom("Lexend-SemiBold", size: fontSize)) - .kerning(kerning) - .foregroundColor(C.timerGreen) - .minimumScaleFactor(0.6) - .lineLimit(1) } } diff --git a/ios/SemosanWidget/SemosanLiveActivity.swift b/ios/SemosanWidget/SemosanLiveActivity.swift index d497c83..e5a7581 100644 --- a/ios/SemosanWidget/SemosanLiveActivity.swift +++ b/ios/SemosanWidget/SemosanLiveActivity.swift @@ -33,19 +33,25 @@ private struct LiveTimerText: View { var body: some View { Group { if state.isRunning, let epoch = state.timerStartEpoch { - // 실행 중: 시스템 클록 기반 네이티브 타이머 (JS 업데이트 불필요) - Text(Date(timeIntervalSince1970: epoch / 1000), style: .timer) - .monospacedDigit() + let startDate = Date(timeIntervalSince1970: epoch / 1000) + TimelineView(.periodic(from: .now, by: 1.0)) { tl in + let elapsed = max(0, Int(tl.date.timeIntervalSince(startDate))) + Text(formatExpanded(elapsed)) + .font(.custom("Lexend-SemiBold", size: fontSize)) + .kerning(kerning) + .foregroundColor(C.timerGreen) + .minimumScaleFactor(0.6) + .lineLimit(1) + } } else { - // 일시정지: JS에서 받은 정적 값 표시 Text(formatExpanded(state.elapsedSeconds)) + .font(.custom("Lexend-SemiBold", size: fontSize)) + .kerning(kerning) + .foregroundColor(C.timerGreen) + .minimumScaleFactor(0.6) + .lineLimit(1) } } - .font(.custom("Lexend-SemiBold", size: fontSize)) - .kerning(kerning) - .foregroundColor(C.timerGreen) - .minimumScaleFactor(0.6) - .lineLimit(1) } }