내용으로 건너뛰기

iOS 구독 그룹 만들기

GitHub

iOS 앱에서 여러 구독 수준을 관리하고 조직하기 위해 구독 그룹이 필수적입니다. 구독 그룹이 작동하는 방식을 이해하는 것은 업그레이드, 다운그레이드 및 크로스 그레이드 기능을 구현하는 데 중요합니다.

구독 그룹이란 무엇인가요?

구독 그룹이란 무엇인가요?

구독 그룹은 사용자가 선택할 수 있는 관련된 구독의 집합입니다. 사용자는 한 그룹 내에서 한 번에 하나의 구독만 구독할 수 있습니다. 구독을 변경할 때 Apple은 자동으로 전환을 처리합니다.

구독 그룹이 중요한 이유는 무엇인가요?

구독 그룹이 중요한 이유는 무엇인가요?

구독 그룹은 다음과 같은 기능을 제공합니다:

  • 가격 계층 구조기본, 프리미엄 및 최고급 계획을 제공합니다.
  • 다양한 기간: 월, 년, 영구 옵션
  • 업그레이드/다운그레이드 로직: 구독 변경을 자동으로 처리
  • 간소화된 관리: 관련 구독을 그룹화

구독 등급

구독 등급

그룹 내에서 각 구독은 가장 높은 가치 (등급 1) 에서 가장 낮은 가치 (등급 n) 로 등급을 매겨야 합니다. 이 등급은 구독 변경을 분류하는 데 사용됩니다.

구독 그룹 계층

등급 예시

등급 1

등급 1 최고 가치

  • 1년 99.99 달러/년 프리미엄
  • 1달러 19.99 달러/월 최고

레벨 2 중간 가치

  • 1년 49.99 달러/년 표준
  • 1달러 9.99 달러/월 프리미엄

레벨 3 가장 낮은 가치

  • 1년 29.99 달러/년 기본
  • 1달러 4.99 달러/월 표준

구독 변경 유형

구독 변경 유형

애플은 구독 등급에 따라 자동으로 세 가지 유형의 구독 변경을 처리합니다.

행동: 즉시 적용 사용자는 부분 환불을 받습니다.

__CAPGO_KEEP_0__

  • __CAPGO_KEEP_1__ __CAPGO_KEEP_2__
  • __CAPGO_KEEP_3__ __CAPGO_KEEP_4__ 남은 시간
  • 새로운 구독은 즉시 시작됩니다.

예시:

// User currently has: Standard Monthly (Level 2)
// User upgrades to: Premium Annual (Level 1)
// Result: Immediate access to Premium, refund for unused Standard time

2. 다운그레이드

제목 "2. 다운그레이드"

하위 등급의 구독으로 이동 (예: 등급 1 → 등급 2). 행동: 다음 재정의 날짜에 적용

다음 재정의 날짜에 적용됩니다.

  • 2. Downgrade Section titled “2. Downgrade”
  • 현재 구독이 기간이 끝날 때까지 유지됩니다.
  • 만료 후 자동으로 새로운 구독이 시작됩니다.

예시:

// User currently has: Premium Annual (Level 1)
// User downgrades to: Standard Monthly (Level 2)
// Result: Premium access continues until annual renewal date, then switches

같은 등급의 구독으로 전환 기간에 따라 행동이 달라집니다:.

다른 기간

→ 하향 조정과 같이 행동 다른 기간 하향 조정과 같이 행동

  • 다음 갱신 날짜부터 적용됩니다.
  • 예시: 월간 프리미엄 (레벨 1) → 연간 프리미엄 (레벨 1)

같은 기간 → 다음과 같이 동작합니다. 업그레이드

  • 즉시 적용됩니다.
  • 예시: 프리미엄 월간 (레벨 1) → 최고 월간 (레벨 1)

구독 그룹 만들기

구독 그룹 만들기
  1. 구독으로 이동

    애플 스토어 연결에서 앱을 선택하고 수익화 > 구독.

  2. 그룹 만들기

    클릭 + “구독 그룹” 옆의 다음 버튼을 클릭하여 새로운 그룹을 만들 수 있습니다.

  3. 그룹 이름

    이 그룹에 포함된 구독을 반영하는 설명적인 이름을 선택하세요.

    • “프리미엄 접근권”
    • “클라우드 스토리지 플랜”
    • “프로 기능”
  4. 구독 추가

    그룹을 만들고 나서, 개별 구독을 추가하세요. 각 구독은 등급을 가집니다.

  5. 등급 설정

    가장 높은 가격의 구독(1)부터 가장 낮은 가격의 구독까지 등급을 정렬하세요. 고려할 점은:

    • 연간 계획은 일반적으로 월간 계획보다 높게 등급付け됩니다.
    • 가격이 높은 계층은 가격이 낮은 계층보다 위에 등급付け됩니다.
    • 최고/최상위 계층은 가장 높게 등급付け됩니다.

앱에 사용하는 방법

앱에 사용하는 방법

native-purchases 플러그인은 자동으로 구독 그룹 논리를 처리합니다.

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Fetch all subscriptions in a group
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_annual', 'ultimate_monthly'],
productType: PURCHASE_TYPE.SUBS,
});
// Display current subscription using StoreKit transactions
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const activeSubs = purchases.filter((purchase) => purchase.isActive);
// Detect pending downgrade/cancellation (StoreKit sets willCancel === true)
const pendingChange = purchases.find((purchase) => purchase.willCancel === true);
if (pendingChange) {
console.log('Subscription will stop auto-renewing on', pendingChange.expirationDate);
}
// Purchase (StoreKit handles upgrades/downgrades automatically)
await NativePurchases.purchaseProduct({
productIdentifier: 'premium_annual',
productType: PURCHASE_TYPE.SUBS,
});
// Listen for StoreKit updates (fires on upgrades/downgrades/refunds)
NativePurchases.addListener('transactionUpdated', (transaction) => {
console.log('Subscription updated:', transaction);
});

구독 변경을 처리하는 방법

구독 변경을 처리하는 방법

변경 유형을 감지하는 방법

변경 유형을 감지하는 방법
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Get current subscription info
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const currentSubscription = purchases.find(
(purchase) => purchase.subscriptionState === 'subscribed',
);
if (currentSubscription) {
// StoreKit reports if user cancelled auto-renew
if (currentSubscription.willCancel) {
console.log(
`User cancelled. Access remains until ${currentSubscription.expirationDate}`,
);
}
if (currentSubscription.isUpgraded) {
console.log('User recently upgraded to this plan.');
}
}
// Listen for automatic upgrades/downgrades
NativePurchases.addListener('transactionUpdated', (transaction) => {
console.log('Subscription changed!', transaction);
if (transaction.subscriptionState === 'revoked') {
revokeAccess();
} else if (transaction.isActive) {
unlockPremiumFeatures();
}
});

사용자 커뮤니케이션

사용자 커뮤니케이션 섹션

변화 동작을 항상 명확하게 전달하세요:

업그레이드 경우:

“프리미엄 기능에 즉시 접근하실 수 있습니다. 현재 구독을 프로레이트합니다.”

다운그레이드 경우:

“프리미엄 접근권한을 [갱신일]까지 유지하시고, 그 후 표준으로 전환됩니다.”

크로스 그레이드 경우:

“다음 갱신일인 [날짜]부터 연간 결제로 변경됩니다.”

애플의 App Store Server Notifications v2 또는 자체 수신증명 백엔드와 StoreKit 변경 사항을 데이터베이스에 반영하세요. 서버 알림을 데이터베이스에 반영하기 위해 pair하세요. transactionUpdated 클라이언트와 백엔드가 동기화되도록 리스너를 사용하세요.

Best Practices

Best Practices

그룹 조직

그룹 조직
  • 관련된 구독을 동일한 그룹에 유지하세요.
  • 비관련된 기능을 섞지 마세요 (예: 저장소 및 광고 제거)
  • 다른 기능 세트에 대한 별도의 그룹을 생성하세요.

레벨 랭킹 전략

레벨 랭킹 전략
  • 년간 계획 → 동일한 티어의 월간 계획보다 높은 레벨
  • 고가의 티어 → 높은 레벨
  • 가격만 고려하지 말고 가치도 생각해봐
  • 현재 구독을 명확하게 표시해
  • 그룹 내 모든 옵션을 표시해
  • 즉시 적용 vs. 갱신 시 변경된 점을 명확하게 표시해
  • 플랜 간 쉽게-switching을 허용해
  • 업그레이드 시나리오 모두 테스트해
  • 다운그레이드 시나리오 모두 테스트해
  • 크로스 그레이드 동작을 검증해
  • 체크 웹 훅 작동 여부

일반적인 상황

기본적인 상황

상황 1: 3 단계 월간 계획

상황 1: 3 단계 월간 계획
Level 1: Ultimate Monthly ($19.99)
Level 2: Premium Monthly ($9.99)
Level 3: Basic Monthly ($4.99)
  • 기본 → 프리미엄: 즉시 업그레이드
  • 프리미엄 → 최고급: 즉시 업그레이드
  • 최고급 → 프리미엄: 갱신 시 다운그레이드
  • 기본 → 최고급: 즉시 업그레이드

상황 2: 혼합 지속 기간 계획

상황 2: 혼합 지속 기간 계획
Level 1: Premium Annual ($99.99/year)
Level 2: Premium Monthly ($9.99/month)
  • 월간 → 연간: 갱신 시 교환
  • 연간 → 월간: 갱신 시 다운그레이드

Scenario 3: 다중 계층 다중 기간

Scenario 3: 다중 계층 다중 기간
Level 1: Ultimate Annual ($199/year)
Level 2: Ultimate Monthly ($19.99/month)
Level 3: Premium Annual ($99/year)
Level 4: Premium Monthly ($9.99/month)
Level 5: Basic Annual ($49/year)
Level 6: Basic Monthly ($4.99/month)

이 설정은 최대 유연성을 제공하면서도 명확한 업그레이드/다운그레이드 논리를 유지합니다.

문제 해결

문제 해결

구독이 그룹에 나타나지 않습니다:

  • 그룹에 할당되어 있는지 확인하세요
  • 최소 '제출 준비' 상태 이상인지 확인하세요
  • 제품 ID가 정확한지 확인하세요.

업그레이드/다운그레이드 동작이 잘못된 경우:

  • 등급 순위 검토 (1 = 가장 높은 등급)
  • 구독 계층이 합리적인지 확인하세요.
  • 레벨이 올바르게 설정되어 있는지 확인하세요.

다른 그룹의 제품:

  • 사용자는 동시에 여러 그룹에 구독할 수 있습니다.
  • 관련 제품을 같은 그룹에 유지하는 것이 의도된 것입니다.

getActiveProducts에서 여러 구독이 표시되는 경우:

  • 구독이 다른 그룹에 있는지 확인하세요.
  • 사용자가 가족 공유를 통해 구독하고 있는지 확인하세요.
  • 앱 스토어 연결에서 구독 상태를 검토하세요.

추가 리소스

추가 리소스 섹션

자세한 내용은 iOS 구독 그룹에 대한 공식 애플 문서.

Create iOS Subscription Group에서 계속

Create iOS Subscription Group에서 계속하는 섹션

Create iOS Subscription Group을 사용하는 경우 Create iOS Subscription Group을 사용하여 스토어 승인 및 배포를 계획하는 경우 Create iOS Subscription Group을 Using @capgo/native-purchases Using @capgo/native-purchases에서 @capgo/__CAPGO_KEEP_1__-in-app-review Using @capgo/native-purchases에서 @capgo/capacitor-in-app-review Capgo의 구현 세부 정보에 대해 @capgo/capacitor-in-app-review에서 Capgo의 @capgo/capacitor-in-app-review 사용 Capgo의 native 기능에 대해 @capgo/capacitor-in-app-review 사용 Capgo의 @capgo/capacitor-native-market Capgo의 구현 세부 정보에 대해 @capgo/capacitor-native-market, 그리고 Capgo의 @capgo/capacitor-native-market 사용 Capgo의 native 기능에 대해 @capgo/capacitor-native-market 사용