mycode/myApp/HaruDanim/HaruDanim.storekit
songyc macbook 1e62c082d3 feat(premium): StoreKit 2 결제 레이어 구현 (실결제 연결 직전 단계)
- StoreKitEntitlementProvider: Transaction.currentEntitlements 기반 실권한
  조회 + Transaction.updates 이벤트 반영. 앱 시작 시 PremiumManager.bootstrap
  으로 주입 (확장 타깃은 기존 PremiumGate 캐시 그대로)
- PremiumStore: 상품 로드/구매/복원 (월·년 구독 + 평생 이용권 3종)
- PremiumView: 실구매 UI (상품 목록·가격·구매 복원, 미로드 시 재시도 폴백)
- DEBUG 강제 프리미엄(-premium, 테스트 토글) 중에는 StoreKit 결과가
  덮어쓰지 않도록 보호
- HaruDanim.storekit 로컬 테스트 구성(월 5,000 / 년 50,000 / 일회성 80,000원,
  ko·en·ja 현지화) + 메인 스킴에 연결 → Xcode 실행으로 결제 흐름 테스트 가능
- 남은 것: App Store Connect에 productID 3종 등록만 하면 실결제 연결 완료

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
2026-07-10 14:49:32 +09:00

133 lines
3.8 KiB
Plaintext

{
"identifier" : "F1A2B3C4-0001-4A2B-9C3D-5E6F7A8B9C0D",
"nonRenewingSubscriptions" : [
],
"products" : [
{
"displayPrice" : "80000",
"familyShareable" : false,
"internalID" : "F1A2B3C4-0002-4A2B-9C3D-5E6F7A8B9C0D",
"localizations" : [
{
"description" : "한 번 결제로 모든 프리미엄 기능을 평생 사용해요",
"displayName" : "평생 이용권",
"locale" : "ko"
},
{
"description" : "Pay once and use all premium features forever",
"displayName" : "Lifetime",
"locale" : "en"
},
{
"description" : "1回の購入ですべてのプレミアム機能をずっと利用できます",
"displayName" : "買い切り",
"locale" : "ja"
}
],
"productID" : "com.yechan.HaruDanim.premium.lifetime",
"referenceName" : "Premium Lifetime",
"type" : "NonConsumable"
}
],
"settings" : {
"_failTransactionsEnabled" : false,
"_locale" : "ko_KR",
"_storefront" : "KOR",
"_storeKitErrors" : [
]
},
"subscriptionGroups" : [
{
"id" : "F1A2B3C4-0003-4A2B-9C3D-5E6F7A8B9C0D",
"localizations" : [
],
"name" : "HaruDanim Premium",
"subscriptions" : [
{
"adHocOffers" : [
],
"codeOffers" : [
],
"displayPrice" : "5000",
"familyShareable" : false,
"groupNumber" : 1,
"internalID" : "F1A2B3C4-0004-4A2B-9C3D-5E6F7A8B9C0D",
"introductoryOffer" : null,
"localizations" : [
{
"description" : "모든 프리미엄 기능을 월 단위로 구독해요",
"displayName" : "월 구독",
"locale" : "ko"
},
{
"description" : "Subscribe to all premium features monthly",
"displayName" : "Monthly",
"locale" : "en"
},
{
"description" : "すべてのプレミアム機能を月単位で購読します",
"displayName" : "月額プラン",
"locale" : "ja"
}
],
"productID" : "com.yechan.HaruDanim.premium.monthly",
"recurringSubscriptionPeriod" : "P1M",
"referenceName" : "Premium Monthly",
"subscriptionGroupID" : "F1A2B3C4-0003-4A2B-9C3D-5E6F7A8B9C0D",
"type" : "RecurringSubscription",
"winbackOffers" : [
]
},
{
"adHocOffers" : [
],
"codeOffers" : [
],
"displayPrice" : "50000",
"familyShareable" : false,
"groupNumber" : 1,
"internalID" : "F1A2B3C4-0005-4A2B-9C3D-5E6F7A8B9C0D",
"introductoryOffer" : null,
"localizations" : [
{
"description" : "모든 프리미엄 기능을 년 단위로 구독해요",
"displayName" : "년 구독",
"locale" : "ko"
},
{
"description" : "Subscribe to all premium features yearly",
"displayName" : "Yearly",
"locale" : "en"
},
{
"description" : "すべてのプレミアム機能を年単位で購読します",
"displayName" : "年額プラン",
"locale" : "ja"
}
],
"productID" : "com.yechan.HaruDanim.premium.yearly",
"recurringSubscriptionPeriod" : "P1Y",
"referenceName" : "Premium Yearly",
"subscriptionGroupID" : "F1A2B3C4-0003-4A2B-9C3D-5E6F7A8B9C0D",
"type" : "RecurringSubscription",
"winbackOffers" : [
]
}
]
}
],
"version" : {
"major" : 4,
"minor" : 0
}
}