- 배포 타깃 26.0→18.0 (앱·위젯. 워치 10.0 불변) - RadialNavigationView: glassEffect 계열을 @available(iOS 26) 선언 격리 + 18 머티리얼 원 폴백 (배치·연출 동일) - DiaryZoomContainer.Coordinator → 비제네릭 톱레벨 DiaryZoomCoordinator + AnyView 소거 (하한 18 Release wholemodule에서 swift-frontend SILPerformanceInliner 무한 재귀 크래시 실측·우회) - Image(safeSymbol:)/SymbolCompat: 카탈로그의 상위 OS 전용 심볼(18 기준 3개)이 교차 기기에서 빈 아이콘이 되지 않게 사용자 심볼 렌더 48곳+워치 7곳 폴백 - -symbolAuditDump 검증 인자 추가, iOS 18.5 시뮬 QA(빌드·radial 폴백·일기 줌·progressSelfTest 49 ALL PASS) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NNxA172hNDRpDsJ2qztKPf
30 lines
1.2 KiB
Swift
30 lines
1.2 KiB
Swift
//
|
|
// SymbolCompat.swift
|
|
// Haru_Danim
|
|
//
|
|
// 사용자 지정 SF 심볼의 안전 렌더 (1.4 iOS 18 하위 지원).
|
|
// 아이콘 카탈로그에는 상위 OS 전용 신형 심볼(예: SF 7의 broom.fill)이 들어 있어,
|
|
// 26 기기에서 고른 심볼이 iCloud 동기화로 iOS 18 기기(또는 구형 watchOS)에 오면
|
|
// Image(systemName:)이 아무것도 그리지 않는다. 사용자 데이터(행동·목표)에서 온
|
|
// 심볼 이름은 반드시 이 경유지로 렌더할 것 — 코드 리터럴 심볼(전부 구형)은 비대상.
|
|
// 워치 앱·워치 위젯 타깃에는 같은 헬퍼의 사본이 있다(WatchSymbolCompat —
|
|
// 폴더 동기화 그룹 멤버십이 갈려 한 파일을 공유할 수 없음).
|
|
//
|
|
|
|
import SwiftUI
|
|
import UIKit
|
|
|
|
enum SymbolCompat {
|
|
/// 이 OS에 없는 심볼 이름을 안전한 폴백으로 바꾼다
|
|
static func safe(_ name: String) -> String {
|
|
UIImage(systemName: name) != nil ? name : "questionmark.circle.fill"
|
|
}
|
|
}
|
|
|
|
extension Image {
|
|
/// 사용자 데이터의 심볼 렌더 전용 — 이 OS에 없는 이름은 물음표로 대치
|
|
init(safeSymbol name: String) {
|
|
self.init(systemName: SymbolCompat.safe(name))
|
|
}
|
|
}
|