mycode/myApp/HaruDanim/Shared/TrackingActivityAttributes.swift
songyc macbook e1537b32f3 feat(widget): stop button on Live Activity lock-screen banner
- 잠금화면 실시간 현황(라이브 액티비티)에 종료 수단이 없다는 보고 → 배너 오른쪽에 노란 정지 버튼 추가. 워치·⑥ 위젯과 같은 검증된 경로(NowRunningStopButton → RunActionIntent 토글) 재사용이라 위험 낮음 판단 후 진행
- ContentState에 actionID(optional) 추가 — 앱 업데이트 전 인플라이트 액티비티(키 없음)도 안전 디코딩(WatchSnapshot 선례), 없으면 버튼 없이 기존 표시
- LockScreenActivityView를 NowRunningWidget.swift로 이동 — @main 파일은 앱 타깃에서 제외라 앱 내 위젯 미리보기(-widgetPreview)에서 배너를 렌더하기 위함(동작 불변). 미리보기 최상단에 배너 박스 신설
- 다이나믹 아일랜드 스모크 확인(상태 필드 추가 회귀 없음 — 콤팩트 정상 표시). 실기기 확인 항목: 잠금화면에서 정지 버튼 탭 시 즉시 종료
- 도움말 '다이나믹 아일랜드·잠금화면' 문구에 정지 버튼 안내 추가(ko/en/ja, stale 정리), CLAUDE.md §9 갱신. Debug/Store 빌드 성공, 카탈로그 9종 클린

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014CkLDi8Lr21vGqo4SjZaTp
2026-07-19 04:46:38 +09:00

47 lines
1.8 KiB
Swift

//
// TrackingActivityAttributes.swift
// Haru_Danim
//
// Live Activity . .
//
import Foundation
import ActivityKit
import SwiftUI
nonisolated struct TrackingActivityAttributes: ActivityAttributes {
nonisolated struct ContentState: Codable, Hashable {
/// (: / )
var actionName: String
var symbolName: String
var colorHex: String
var startedAt: Date
/// (+1, +2 )
var extraCount: Int
/// Action.uuid (RunActionIntent) .
/// optional : ( )
/// (WatchSnapshot.runningActionID )
var actionID: String? = nil
}
}
extension TrackingActivityAttributes.ContentState {
var tintColor: Color {
let cleaned = colorHex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
var value: UInt64 = 0
Scanner(string: cleaned).scanHexInt64(&value)
return Color(
red: Double((value >> 16) & 0xFF) / 255,
green: Double((value >> 8) & 0xFF) / 255,
blue: Double(value & 0xFF) / 255
)
}
/// . ClosedRange ,
/// 30 1
/// ( )
var timerRange: ClosedRange<Date> {
startedAt...startedAt.addingTimeInterval(60 * 60 * 24 * 365)
}
}