mycode/myApp/HaruDanim/IOS/Core/SettingsCloudSync.swift
songyc macbook 2fb7b3c75a feat(settings): '짧은 기록 무시'를 iCloud 키-값 저장소로 전 기기 동기화 (1.1)
- 검사가 종료 실행 기기 기준이라 기기별 값이면 교차 사용(아이패드 시작→아이폰 종료)에서
  결과가 갈리던 문제 해소 — 값 자체를 모든 기기에서 통일
- SettingsCloudSync: 시작 시 iCloud 값 채택(없으면 로컬 값 시드), 외부 변경·포그라운드 복귀 때
  pull, 설정 변경 때 push(동일 값 가드). App Group 저장은 유지(위젯·인텐트 읽기 경로 무변경),
  CloudKit 스키마·프리미엄 토글과 무관 — ubiquity-kvstore 엔타이틀먼트만 추가
- 설정: 측정 섹션을 나눠 '짧은 기록 무시' 바로 밑에 전 기기 공통 안내 푸터,
  '장시간 측정 알림'은 기기별 유지 명시. 도움말도 갱신, en/ja 번역(missing 0·stale 0, 실렌더 확인)
- whats-new-1.1 3개 언어에 항목 추가, CLAUDE.md §6.8 갱신

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVeduv1eNdXjk1ay4tSgBg
2026-07-30 02:03:29 +09:00

71 lines
3.1 KiB
Swift

//
// SettingsCloudSync.swift
// Haru_Danim
//
// " " iCloud - (: )
// - (§6.8),
// .
// - CloudKit ( + cloudSync ) ·
// iCloud . .
// - : iCloud (App Group) , .
// · , push .
//
import UIKit
@MainActor
final class SettingsCloudSync {
static let shared = SettingsCloudSync()
/// (Int )
private let syncedKeys = [SettingsKeys.minSessionSeconds]
private var observers: [any NSObjectProtocol] = []
/// 1
func start() {
guard observers.isEmpty else { return }
let kvs = NSUbiquitousKeyValueStore.default
let center = NotificationCenter.default
observers.append(center.addObserver(
forName: NSUbiquitousKeyValueStore.didChangeExternallyNotification,
object: kvs, queue: nil
) { _ in
Task { @MainActor in SettingsCloudSync.shared.pull(seedIfMissing: false) }
})
observers.append(center.addObserver(
forName: UIApplication.willEnterForegroundNotification,
object: nil, queue: nil
) { _ in
Task { @MainActor in
NSUbiquitousKeyValueStore.default.synchronize()
SettingsCloudSync.shared.pull(seedIfMissing: false)
}
})
kvs.synchronize()
pull(seedIfMissing: true)
}
/// iCloud (App Group). 1 iCloud
/// ( ).
private func pull(seedIfMissing: Bool) {
let kvs = NSUbiquitousKeyValueStore.default
for key in syncedKeys {
if let remote = kvs.object(forKey: key) as? Int {
if AppGroup.defaults.object(forKey: key) as? Int != remote {
AppGroup.defaults.set(remote, forKey: key)
}
} else if seedIfMissing, let local = AppGroup.defaults.object(forKey: key) {
kvs.set(local, forKey: key)
}
}
}
/// ( )
func push(_ value: Int, forKey key: String) {
let kvs = NSUbiquitousKeyValueStore.default
guard kvs.object(forKey: key) as? Int != value else { return }
kvs.set(value, forKey: key)
kvs.synchronize()
}
}