본문 바로가기

iOS 자동 갱신 구독 생성하기

GitHub

자동 갱신 구독은 iOS 앱에서 콘텐츠, 서비스 또는 프리미엄 기능에 대한 반복 액세스를 제공합니다. 이 가이드에서는 App Store Connect에서 구독을 만드는 방법을 안내합니다.

자동 갱신 구독은 사용자가 취소할 때까지 매 결제 주기마다 자동으로 갱신됩니다. 다음과 같은 경우에 적합합니다:

  • 프리미엄 콘텐츠 및 기능
  • 광고 없는 환경
  • 클라우드 저장소 및 동기화
  • 스트리밍 서비스
  • 전문가용 도구 및 유틸리티

구독을 만들기 전에 다음을 완료해야 합니다:

  1. 구독 그룹 생성 구독 항목을 체계적으로 관리하려면
  2. Apple Developer Program 멤버십이 활성 상태여야 합니다
  3. App Store Connect에서 은행 및 세금 정보를 완료하세요
  1. Subscriptions로 이동

    App Store Connect에서 앱을 선택한 후 다음으로 이동하세요 수익화 > 구독.

    기존 구독 그룹을 선택하거나 필요 시 새 그룹을 만드세요.

    subscriptions로 이동

  2. 새 구독 생성

    Members 섹션에서 + 구독 그룹 옆 아이콘을 눌러 새 구독을 추가하세요.

  3. 기본 정보 입력

    참조 이름: 내부용 설명 이름 (고객에게는 표시되지 않음)

    • 예시: “Premium Monthly”, “Ultimate Annual”, “Basic Plan”

    Product ID: 이 구독의 고유 식별자 (나중에 변경할 수 없음)

    • 형식: com.yourcompany.yourapp.premium_monthly
    • 의미를 알 수 있는 소문자 이름에 언더스코어(_)를 사용하세요
    • native-purchases 플러그인 구성에 필요합니다

    구독 상세 정보 입력

  4. 기간 설정

    사용 가능한 옵션에서 구독 기간을 선택하세요:

    • 1주일
    • 1개월
    • 2개월
    • 3개월
    • 6개월
    • 1년

    설정한 기간에 따라 사용자 결제 주기가 결정됩니다.

  5. 가격 설정

    클릭 구독 가격 추가 가격을 설정하려면:

    기본 지역: 주요 시장을 선택하세요 (보통 본인 국가)

    가격: 구독 가격을 설정하세요

    • Apple이 다른 통화로 자동 변환합니다
    • Apple의 가격 티어 중에서 선택하세요
    • 체감 가치와 시장 가격을 고려하세요

    가격 설정하기

  6. 가족 공유 (선택 사항)

    최대 6명의 가족 구성원이 구독을 이용할 수 있는 가족 공유 활성화 여부를 결정하세요.

    다음의 경우 활성화하세요:

    • 콘텐츠가 가족용으로 적합한 경우
    • 가치 제안을 높이고 싶은 경우
    • 비즈니스 모델이 이를 지원하는 경우

    다음의 경우 활성화하지 마세요:

    • 구독이 개인 사용 전용인 경우
    • 콘텐츠가 사용자 맞춤형인 경우
    • 사용자당 수익을 극대화하려는 경우
  7. 현지화 추가

    앱이 지원하는 모든 언어로 구독 표시 정보를 추가하세요:

    구독 표시 이름: 사용자에게 보여지는 이름 (예: “Premium Monthly”)

    설명: 구독 포함 사항에 대한 간략한 설명

    • 간결하고 혜택 중심으로 작성하세요
    • 주요 기능을 언급하세요
    • 가치 제안을 강조하세요

    현지화를 추가하세요

  8. App Store 프로모션 이미지 (선택 사항)

    이 구독에 사용할 프로모션 이미지를 upload 하세요 (312x390 픽셀):

    • App Store 구독 페이지에 표시됩니다
    • 앱 디자인과 일치해야 합니다
    • 명확성을 위해 구독 이름을 포함하세요
  9. 저장 및 제출

    클릭 저장 구독을 생성하려면

    첫 구독의 경우:

    • 새 앱 버전과 함께 제출해야 합니다
    • 다음 App Store 제출 시 포함하세요
    • 단독으로 제출할 수 없습니다

    추가 구독 시:

    • Subscriptions 페이지에서 바로 제출 가능
    • 새 앱 버전이 필요 없음
    • 첫 구독 승인 후 사용 가능

구독 상태는 다음 중 하나로 표시됩니다:

상태설명테스트 가능 여부
메타데이터 누락설정 미완료예 (sandbox)
제출 준비 완료완료, 미제출예 (sandbox)
심사 대기 중Apple에 제출됨예 (sandbox)
심사 중Apple에서 심사 중예 (sandbox)
승인됨구매 가능지원
거절됨수정 필요예 (sandbox)

생성 후, 앱에서 다음 product ID를 사용하여 구독을 참조하세요:

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Fetch subscription products direct from StoreKit
const { products } = await NativePurchases.getProducts({
productIdentifiers: [
'com.yourcompany.yourapp.premium_monthly',
'com.yourcompany.yourapp.premium_annual',
],
productType: PURCHASE_TYPE.SUBS,
});
products.forEach((product) => {
console.log(`${product.title}: ${product.priceString}`);
console.log(`Duration: ${product.subscriptionPeriod}`);
console.log(`Description: ${product.description}`);
});
// Purchase a subscription (StoreKit 2 automatically handles intro pricing and offers)
try {
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'com.yourcompany.yourapp.premium_monthly',
productType: PURCHASE_TYPE.SUBS,
});
console.log('Transaction ID:', transaction.transactionId);
// StoreKit receipts are included on iOS for server-side validation
await sendReceiptToBackend(transaction.receipt);
} catch (error) {
console.error('Purchase failed:', error);
}
// Check subscription status using the store's data
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const premium = purchases.find(
(purchase) => purchase.productIdentifier === 'com.yourcompany.yourapp.premium_monthly',
);
if (premium?.isActive) {
console.log('Expires:', premium.expirationDate);
console.log('Will renew:', premium.willCancel === false);
console.log('Store state:', premium.subscriptionState);
unlockPremiumFeatures();
} else {
showPaywall();
}

12개월 약정 포함 월간 플랜

“12개월 약정 월간 플랜” 섹션

App Store Connect 구독이 월간 결제 플랜 및 12개월 약정으로 설정된 경우, StoreKit은 해당 제품의 추가 가격 조건을 반환할 수 있습니다. 이 조건을 사용해 구매 전에 월간 요금, 총 약정 금액, 전체 약정 기간을 보여주세요.

const yearlyProduct = products.find(
(product) => product.identifier === 'com.yourcompany.yourapp.premium_annual',
);
const monthlyCommitment = yearlyProduct?.pricingTerms?.find(
(term) => term.billingPlanType === 'monthly',
);
if (yearlyProduct && monthlyCommitment) {
console.log('Monthly charge:', monthlyCommitment.billingDisplayPrice);
console.log('Total commitment:', monthlyCommitment.commitmentInfo?.priceString);
await NativePurchases.purchaseProduct({
productIdentifier: yearlyProduct.identifier,
productType: PURCHASE_TYPE.SUBS,
billingPlanType: 'monthly',
});
}

전체 페이월 및 entitlement 흐름은 다음을 참조하세요: iOS 월간 약정 결제 플랜.

  • 월간 플랜: 진입 장벽이 낮고 습관 형성에 유리함
  • 연간 플랜: 더 높은 가치, 높은 LTV, 낮은 이탈률
  • 다양한 티어 구성: 사용자 세그먼트별 Basic, Premium, Ultimate 제공
  • 경쟁사 분석: 유사 앱의 가격 정책 조사
  • 일관된 명명 규칙 사용: company.app.tier_duration
  • ID에 티어와 기간 포함: premium_monthly, ultimate_annual
  • Product ID 변경 금지 (변경 불가)
  • 팀 내 공유를 위해 모든 Product ID 문서화
  • 가족 중심 앱(게임, 교육, 엔터테인먼트)에 활성화
  • 수익에 미칠 영향 고려
  • 공유 동작을 철저히 테스트
  • 마케팅 시 공유 기능 안내
  • 모든 구독 명칭 및 설명 번역
  • 지역별 가격 차이 고려
  • 지원되는 모든 언어에서 표시 테스트
  • 문화적으로 적절한 마케팅 문구 사용
  • 일관된 비주얼 스타일 유지
  • 구독 명칭 및 핵심 혜택 포함
  • 시즌별 프로모션에 맞춰 업데이트
  • 앱의 전반적인 디자인 언어와 일치

일반적인 구독 패턴

“일반적인 구독 패턴” 섹션
Free App + Premium Subscription
- Basic: Free (limited features)
- Premium Monthly: $4.99
- Premium Annual: $39.99 (save 33%)

멀티 티어 (Good, Better, Best)

“멀티 티어 (Good, Better, Best)” 섹션
- Basic Monthly: $4.99
- Premium Monthly: $9.99
- Ultimate Monthly: $19.99
- Basic Annual: $49.99
- Premium Annual: $99.99
- Ultimate Annual: $199.99

소모품 + 구독 하이브리드

“소모품 + 구독 하이브리드” 섹션
- Credit packs (consumable)
- Monthly subscription (unlimited credits)
- Annual subscription (unlimited + bonus features)

앱에서 구독이 로드되지 않는 경우:

  • Product ID가 정확히 일치하는지 확인 (대소문자 구분)
  • 구독이 구독 그룹에 포함되어 있는지 확인
  • Bundle identifier가 App Store Connect와 일치하는지 확인
  • 상품 생성 후 2~3시간 대기

구독을 제출할 수 없는 경우:

  • 필수 필드 모두 입력 (이름, 설명, 가격)
  • 현지화를 하나 이상 추가
  • 은행/세금 정보 승인 여부 확인
  • 첫 구독인지 확인 (앱 버전 필요)

Family Sharing 토글 비활성화됨:

  • 이미 활성화됨 (비활성화 불가)
  • 구독 상세 정보에서 확인
  • 문제가 지속되면 Apple 지원팀에 문의

가격 티어를 사용할 수 없음:

  • 일부 지역에서는 제한될 수 있음
  • 다른 티어 선택
  • 가격 관련 문의는 Apple에 연락하세요

“Invalid Product ID” 에러 발생 시:

  • 역도메인(reverse domain) 형식인지 확인
  • 공백 또는 특수 문자 포함 여부 확인
  • 오타가 있는지 확인
  • 모든 제품 간의 고유성 확인

자세한 내용은 자동 갱신 구독에 관한 Apple 공식 문서.

iOS 자동 갱신 구독 생성 다음 단계

“iOS 자동 갱신 구독 생성 다음 단계” 섹션

사용 중이라면 iOS 자동 갱신 구독 생성 스토어 승인 및 배포를 계획하려면, 다음 항목과 연결하세요 @capgo/native-purchases 사용하기 @capgo/native-purchases 사용 시 네이티브 기능을 위해, @capgo/capacitor-in-app-review @capgo/capacitor-in-app-review의 구현 세부 사항에 대해서는, @capgo/capacitor-in-app-review 사용하기 @capgo/capacitor-in-app-review 사용하기에서 네이티브 기능은, @capgo/capacitor-native-market @capgo/capacitor-native-market의 구현 세부 사항에 대해서는, 그리고 @capgo/capacitor-native-market 사용하기 @capgo/capacitor-native-market. 사용하기에서 네이티브 기능은