songyc macbook 2dfe8cf44c fix(1.5): ASC 검증 ITMS-90683 — NSHealthUpdateUsageDescription 추가, 빌드 2
- HealthKit 엔타이틀먼트 보유 시 읽기 전용이어도 '쓰기' 사유 키를 업로드 검증이 요구(실측)
- Info.plist에 정직한 읽기 전용 안내 문구 + InfoPlist.xcstrings 3언어
- 전달된 빌드 번호 재사용 불가 → CURRENT_PROJECT_VERSION 2
- Debug/Store 빌드 성공, 산출물 Info.plist에 키 포함 확인

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WtZwRRjbtM9pZJDM4FkTq6
2026-08-22 08:13:18 +09:00

38 lines
2.6 KiB
Plaintext

<?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>
<!-- CloudKit 무음 푸시 수신용 — 다른 기기의 변경을 즉시 가져오기(import) 위해 필수.
이 모드가 없으면 앱 실행/포그라운드 복귀 때만 가져오기가 일어나
iPad·iPhone 간 측정 시작/종료가 화면·새로고침에 반영되지 않았다.
나머지 Info.plist 키는 GENERATE_INFOPLIST_FILE=YES가 생성해 이 파일과 병합한다. -->
<key>UIBackgroundModes</key>
<array>
<string>remote-notification</string>
</array>
<!-- 수출 규정: OS 표준 암호화(HTTPS·iCloud)만 사용 — 면제 대상 선언으로
빌드 업로드 때마다 뜨는 규정 준수 질문을 생략한다 -->
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<!-- 일기 잠금(설정 → 일기, DiaryLock): Face ID 사용 사유 — 이 키가 없으면
Face ID 기기에서 인증 시도가 거부된다. Touch ID·암호는 별도 키 불필요 -->
<key>NSFaceIDUsageDescription</key>
<string>일기 잠금을 해제하는 데 사용돼요.</string>
<!-- 건강 데이터 읽기 사유 (1.5 — 모음 탭 타일·건강 다짐). 읽기 전용이며
값은 기기 밖으로 전송·저장되지 않는다 (심사 5.1.3, PRIVACY.md 건강 문단 참고) -->
<key>NSHealthShareUsageDescription</key>
<string>걸음·운동·수면 같은 건강 데이터를 앱에서 보여주고 다짐 달성 계산에 쓰기 위해 읽어요. 데이터는 이 기기 밖으로 나가지 않아요.</string>
<!-- 건강 데이터 '쓰기' 사유 — 앱은 건강 데이터를 기록·수정하지 않지만(읽기 전용),
HealthKit 엔타이틀먼트가 있으면 ASC 업로드 검증(ITMS-90683)이 이 키를 요구한다
(2026-08-22 실측 — requestAuthorization의 toShare 참조만으로 필요). 쓰기 요청이
없으므로 이 문구가 사용자에게 표시될 일은 없다 -->
<key>NSHealthUpdateUsageDescription</key>
<string>하루 다님은 건강 데이터를 기록하거나 수정하지 않아요 — 읽기 전용으로만 사용해요.</string>
<!-- CFBundleName(맥 메뉴 막대 이름): 생성 Info.plist가 PRODUCT_NAME("Haru_Danim")으로
항상 덮어써 이 파일에 넣어도 무효(검증됨). 실제 표시는 언어별 InfoPlist.strings
(IOS/InfoPlist.xcstrings의 CFBundleName — ko 하루 다님 / en·ja Haru Danim)가 결정하고,
미지원 언어도 개발 언어(ko)로 폴백되므로 원시값이 노출될 일은 없다 -->
</dict>
</plist>