mycode/myApp/HaruDanim/IOS/Core/AppRefresh.swift
songyc macbook 957618fccd feat(app): add Home tab refresh button and device-specific help guide
- 모음 탭 왼쪽 위 새로고침 버튼(RefreshButton/AppRefresh): 루트 뷰 identity
  리셋으로 모든 @Query를 재조회(앱 재시작과 같은 효과) + 라이브 액티비티·
  위젯·워치 스냅숏 동기화. 다른 기기의 iCloud 변경이 화면에 늦게 보일 때
  재시작 없이 반영. iPhone·iPad 공통, Release(스토어) 빌드에도 포함
- 설정 → 지원 → 도움말(HelpView): 기본 개념/모음 탭/목표/기록·통계/동기화/
  프리미엄 공통 + iPhone은 화면 구성(탭바·버블 메뉴·다이나믹 아일랜드)과
  애플워치(기록·컴플리케이션·동기화) 섹션, iPad는 일기 섹션. 접이식 주제별
  구성, 새 문자열 59개 en/ja 번역
- 검증 인자: -helpPreview YES

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-13 17:09:11 +09:00

65 lines
2.1 KiB
Swift

//
// AppRefresh.swift
// Haru_Danim
//
// ( )
// - iCloud ,
// . token identity @Query
// ( , ).
// - (CloudSyncMonitor) ·· .
// .
//
import Foundation
import Observation
import SwiftData
import WidgetKit
@MainActor
@Observable
final class AppRefresh {
static let shared = AppRefresh()
/// RootNavigationView .id
private(set) var token = UUID()
private(set) var isRefreshing = false
func refreshNow() {
guard !isRefreshing else { return }
isRefreshing = true
token = UUID()
Task { @MainActor in
//
LiveActivityManager.sync(context: DataStore.shared.mainContext)
WidgetCenter.shared.reloadAllTimelines()
WatchSyncManager.shared.pushSnapshot()
//
try? await Task.sleep(for: .milliseconds(700))
isRefreshing = false
}
}
}
// MARK: - ( )
import SwiftUI
///
struct RefreshButton: View {
private let refresh = AppRefresh.shared
var body: some View {
Button {
refresh.refreshNow()
} label: {
if refresh.isRefreshing {
ProgressView()
} else {
Image(systemName: "arrow.clockwise")
}
}
.disabled(refresh.isRefreshing)
.accessibilityLabel(Text("새로고침"))
}
}