- 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
133 lines
3.8 KiB
Plaintext
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
|
|
}
|
|
}
|