chore(release): privacy manifests for all 4 bundles + lower minimum OS to 26.0/10.0

유료 앱 출시 패키지 점검에서 발견한 두 가지 보완:

1) PrivacyInfo.xcprivacy 추가 (iOS 앱·위젯 확장·워치 앱·워치 위젯 확장) —
   required-reason API 선언(ITMS-91053 대응): UserDefaults 카테고리에
   CA92.1(앱 자체 설정) + 1C8F.1(App Group 공유), 수집 데이터·트래킹 없음
   (ASC '데이터 수집 안 함' 선택과 일치). 파일 타임스탬프·부팅 시간·디스크
   용량·키보드 목록 API는 전수 grep으로 미사용 확인. 앱 타깃이 위젯 폴더를,
   워치 앱 타깃이 워치위젯 폴더를 동기화(미리보기 화면용)하고 있어 매니페스트가
   이중 복사되던 충돌은 membershipException 2건으로 해소 — 번들마다 자기
   매니페스트 1개씩 포함됨을 빌드 산출물로 확인.

2) 배포 타깃 하향: iOS/iPadOS 26.5 → 26.0 (리퀴드 글라스 glassEffect가 26.0
   하한이라 그 이상 낮출 수 없음), watchOS 26.0 → 10.0. 컴파일러 availability
   검사가 오류 0건으로 통과 = 해당 버전 지원 보증. 검증: Debug·Store·워치 스킴
   빌드 성공, MinimumOSVersion 각인(26.0/10.0) 확인, watchOS 11.5 시뮬레이터
   실기동(기존 최소치로는 설치 불가였던 OS) + 26.2 시뮬레이터 실기동, 아이폰
   시뮬레이터 부팅 확인. Series 4·5·SE(1세대) 등 watchOS 10~11 워치 사용자와
   iOS 26.0~26.4 기기가 지원 범위에 들어옴.

CLAUDE.md §1에 최소 OS와 매니페스트 완비 상태 기록.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
This commit is contained in:
songyc macbook 2026-07-15 19:05:09 +09:00
parent 6738fe4b7e
commit f05e6113a1
6 changed files with 120 additions and 10 deletions

View File

@ -11,12 +11,12 @@
| 항목 | 내용 |
|---|---|
| 앱 이름 | 하루 다님 (스플래시 멘트: "당신의 하루에 다녀가다") |
| 플랫폼 | iOS (iPhone) + iPadOS(사이드바·일기) + watchOS 앱/컴플리케이션 + 홈·잠금화면 위젯 |
| 플랫폼 | iOS (iPhone) + iPadOS(사이드바·일기) + watchOS 앱/컴플리케이션 + 홈·잠금화면 위젯. **최소 iOS/iPadOS 26.0**(리퀴드 글라스 API 하한) / **watchOS 10.0**(watchOS 11.5·26.2 시뮬레이터 실기동 검증) |
| 기본 언어 | 한국어. 설정에서 영어/일본어 전환 (String Catalog `IOS/Localizable.xcstrings`) |
| 번들 ID | `com.yechan.HaruDanim` / App Group `group.com.yechan.HaruDanim` / CloudKit `iCloud.com.yechan.HaruDanim` |
| 수익 모델 | 부분 유료화. 무료 한도(행동 10·목표 2·목표당 다짐 3) + 프리미엄 결제 시 해제 |
| 결제 상품 | `com.yechan.HaruDanim.premium.monthly`(월 5,000원) / `.yearly`(년 50,000원) / `.lifetime`(80,000원) — 임시 가격, App Store Connect 등록은 아직 안 됨 |
| 남은 배포 작업 | App Store Connect 상품 3종 등록(구독 그룹 + 비소모성, 유료 앱 계약), **CloudKit 프로덕션 스키마 배포**(대시보드 Deploy Schema to Production — DiaryTemplate 등 새 레코드 타입/필드는 개발 환경에만 자동 생성되므로 출시 전 필수), 실기기 검증(펜슬 필기감·캘린더 권한), App Store 배포. 코드 측 잔여 없음 — `ITSAppUsesNonExemptEncryption=NO` 등록 완료, 결제 화면 약관 링크 완료(개인정보처리방침 `Docs/PRIVACY.md` ko/en/ja는 `github.com/notalentprogrammer/HaruDanim` main의 PRIVACY.md로 게시됨, 이용약관은 Apple 표준 EULA URL). ASC 등록 시 앱 설명에도 두 링크 기재 + '앱 개인정보 보호'는 "데이터 수집 안 함" 선택 |
| 남은 배포 작업 | App Store Connect 상품 3종 등록(구독 그룹 + 비소모성, 유료 앱 계약), **CloudKit 프로덕션 스키마 배포**(대시보드 Deploy Schema to Production — DiaryTemplate 등 새 레코드 타입/필드는 개발 환경에만 자동 생성되므로 출시 전 필수), 실기기 검증(펜슬 필기감·캘린더 권한), App Store 배포. 코드 측 잔여 없음 — `ITSAppUsesNonExemptEncryption=NO` 등록 완료, **개인정보 매니페스트(PrivacyInfo.xcprivacy) 4개 번들 완비**(UserDefaults CA92.1·1C8F.1, 수집·트래킹 없음 — 위젯·워치위젯 폴더 것은 앱·워치 앱 타깃에서 membershipException으로 중복 복사 제외), 결제 화면 약관 링크 완료(개인정보처리방침 `Docs/PRIVACY.md` ko/en/ja는 `github.com/notalentprogrammer/HaruDanim` main의 PRIVACY.md로 게시됨, 이용약관은 Apple 표준 EULA URL). ASC 등록 시 앱 설명에도 두 링크 기재 + '앱 개인정보 보호'는 "데이터 수집 안 함" 선택 |
---

View File

@ -108,6 +108,7 @@
Info.plist,
InfoPlist.xcstrings,
Localizable.xcstrings,
PrivacyInfo.xcprivacy,
);
target = 725A9E832FFCC65000846FFB /* Haru_Danim */;
};
@ -119,6 +120,7 @@
Info.plist,
InfoPlist.xcstrings,
Localizable.xcstrings,
PrivacyInfo.xcprivacy,
);
target = 7263D0DF3000433300EA47FC /* Haru_DanimWatch Watch App */;
};
@ -531,7 +533,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.5;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
@ -588,7 +590,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 26.5;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
@ -714,7 +716,7 @@
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
WATCHOS_DEPLOYMENT_TARGET = 10.0;
};
name = Debug;
};
@ -750,7 +752,7 @@
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
WATCHOS_DEPLOYMENT_TARGET = 10.0;
};
name = Release;
};
@ -786,7 +788,7 @@
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
WATCHOS_DEPLOYMENT_TARGET = 10.0;
};
name = Debug;
};
@ -822,7 +824,7 @@
SWIFT_UPCOMING_FEATURE_MEMBER_IMPORT_VISIBILITY = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = 4;
WATCHOS_DEPLOYMENT_TARGET = 26.0;
WATCHOS_DEPLOYMENT_TARGET = 10.0;
};
name = Release;
};
@ -836,7 +838,7 @@
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Widgets/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "하루 다님 위젯";
IPHONEOS_DEPLOYMENT_TARGET = 26.5;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
@ -862,7 +864,7 @@
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = Widgets/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = "하루 다님 위젯";
IPHONEOS_DEPLOYMENT_TARGET = 26.5;
IPHONEOS_DEPLOYMENT_TARGET = 26.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 개인정보 매니페스트 (required reason API 선언 — ITMS-91053 대응)
이 앱은 데이터를 수집·추적하지 않으며, UserDefaults만 required-reason API에 해당:
CA92.1 = 앱 자신만 접근하는 설정 저장 / 1C8F.1 = 같은 App Group의 앱·확장 간 공유 -->
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
<string>1C8F.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 개인정보 매니페스트 (required reason API 선언 — ITMS-91053 대응)
이 앱은 데이터를 수집·추적하지 않으며, UserDefaults만 required-reason API에 해당:
CA92.1 = 앱 자신만 접근하는 설정 저장 / 1C8F.1 = 같은 App Group의 앱·확장 간 공유 -->
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
<string>1C8F.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 개인정보 매니페스트 (required reason API 선언 — ITMS-91053 대응)
이 앱은 데이터를 수집·추적하지 않으며, UserDefaults만 required-reason API에 해당:
CA92.1 = 앱 자신만 접근하는 설정 저장 / 1C8F.1 = 같은 App Group의 앱·확장 간 공유 -->
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
<string>1C8F.1</string>
</array>
</dict>
</array>
</dict>
</plist>

View File

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- 개인정보 매니페스트 (required reason API 선언 — ITMS-91053 대응)
이 앱은 데이터를 수집·추적하지 않으며, UserDefaults만 required-reason API에 해당:
CA92.1 = 앱 자신만 접근하는 설정 저장 / 1C8F.1 = 같은 App Group의 앱·확장 간 공유 -->
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array/>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
<string>1C8F.1</string>
</array>
</dict>
</array>
</dict>
</plist>