내용으로 건너뛰기

Android Play Store 구매내역 검토 지침

GitHub

안드로이드 앱이 구글 플레이에서 승인되려면, 인앱 구매 및 구독이 있는 앱의 경우 구글 정책에 준수해야 합니다. 이 가이드는 승인 검토를 성공적으로 통과하기 위해 필요한 모든 것을 다룹니다.

성공적인 출시 경로

제목: 성공적인 출시 경로
  1. 구글 플레이 앱을 출시하기 전에 signed Android 앱 번들을 빌드하세요.

    새로운 구글 플레이 앱은 Android 앱 번들 (.aab)로 업로드해야 하며, 시드 로드된 디버그 APK가 아닙니다.

    애플리케이션 versionCode 업로드 키가 증가하는 경우에

    안드로이드 앱 번들 흐름

  2. Play Console에서 앱 레코드를 생성하세요

    개발자 계정이 아직 없으시면 Play Console 가입. 그런 다음 홈 > 앱 만들기, 언어, 앱/게임 종류, 무료/유료 설정, 지원 이메일, 그리고 필수 선언을 수락하세요.

    유료/무료 설정을 신중하게 선택하세요. 구글은 유료 앱을 무료로 변경할 수 있지만, 무료로 제공된 앱은 유료로 변경할 수 없습니다.

    Play Console에서 앱 만들기

  3. 앱 콘텐츠 및 스토어 목록 완료

    제품 검토 이전에, 다음 Play Console 선언을 완료하세요:

    • 개인 정보 보호 정책
    • 광고
    • 앱 접근
    • 대상 청중 및 콘텐츠
    • 콘텐츠 등급
    • 데이터 안전
    • 적용 가능한敏감한 권한 선언
  4. Play-설치된 테스트 트랙을 실행하십시오

    시작하여 내부 테스트 빠른 QA를 위해. 만약 개발자 계정이 2023년 11월 13일 이후에 개인 계정으로 생성되었다면, 또한 최소 12명의 동의한 테스터가 14일 연속으로 참여한 닫힌 테스트를 완료해야 합니다. 14일 연속 닫힌 테스트 빠른 QA를 위해 내부 테스트를 시작하여

    Play Console 내부 테스트

  5. Billing이 끝까지 검증

    Google Play에서 앱을 설치하고, 로컬로 내보낸 APK가 아닌, 앱을 설치한 후 확인하세요:

    • Play에서 제품이 올바르게 로드
    • 구매 시트에 테스트 구매 라이선스 테스터에게
    • 구매 후
    • 구매 후 권한이 활성화

구매 후 복원 및 구독 관리 흐름이 작동

Google Play Billing Requirements

구글 플레이 결제 요구 사항

제목: 필수 결제 시스템

디지털 상품 및 서비스를 위한 경우, 당신은 Google Play의 결제 시스템을 사용해야 합니다:

디지털 상품 (Play 결제 시스템 사용 필수):

  • 프리미엄 기능의 구독
  • 인앱 화폐 또는 크레딧
  • 디지털 콘텐츠 (전자책, 음악, 비디오)
  • 게임 업그레이드 및 파워업
  • 앱 언락 및 프리미엄 티어

물리적 상품 (Play 결제 시스템 사용 불가):

  • 물리적 상품
  • 실제 서비스
  • 비영리 단체에 대한 단기 기부

:::note 구독 설정 Play Console에서 현재 구독 -> 기본 계획 -> 제안 모델을 사용하여 Android 구독을 구성합니다. 구독 -> 기본 계획 -> 제안 모델. native-purchases기본 계획 ID를 Native Purchases에 전달합니다. planIdentifier. :::

자연 구매와 함께 Native Purchases 구현

자연 구매와 함께 Native Purchases 구현
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Ensure billing is available on the device
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) throw new Error('Google Play Billing not available');
// Fetch subscription products (Store data is required—never hardcode pricing)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
// Plan identifiers are the Base Plan IDs you create in Google Play Console
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan', // REQUIRED on Android, ignored on iOS
productType: PURCHASE_TYPE.SUBS,
});
console.log('Purchase token for server validation:', transaction.purchaseToken);

구매자 정보의 투명성 및 공개 요구 사항

투명성 및 공개 요건

투명성 및 공개 요건 섹션

제목: '사전 요금 공개' 섹션

구글 플레이에서는 구매 전에 모든 비용에 대한 명확한 공개를 요구합니다:

필수 요소:

  • 사용자의 지역 통화로 정확한 가격
  • billing 주기 (월, 년 등)
  • 구독에 포함된 항목
  • 소개 요금의 총 비용
  • 요금이 발생할 때

UI 디자인 최적화

예시: 위반되지 않은 UI:

function SubscriptionCard({ product }) {
return (
<div className="subscription-card">
<h3>{product.title}</h3>
{/* Show intro offer if available */}
{product.introductoryPrice && (
<div className="intro-offer">
<p className="intro-price">{product.introductoryPriceString}</p>
<p className="intro-period">
for {product.introductoryPricePeriod}
</p>
</div>
)}
{/* Regular price */}
<div className="regular-price">
<p className="price">{product.priceString}</p>
<p className="period">per {product.subscriptionPeriod}</p>
</div>
{/* Clear description */}
<p>{product.description}</p>
{/* Renewal terms */}
<p className="terms">
Renews automatically. Cancel anytime in Google Play.
</p>
<button onClick={() => handlePurchase(product)}>
Subscribe Now
</button>
</div>
);
}

자동 갱신 공개

Auto-Renewal Disclosure

구글이 구독이 자동 갱신되기 전에 다음과 같은 것을 요구합니다.

  • 갱신이 발생할 것을 명확하게 알리는 알림
  • 갱신 가격의 nhắc음
  • 취소하기를 쉽게 할 수 있는 방법

플랫폼 간 가격 명확성

Cross-Platform Pricing Clarity

가격은 세금, 지역 통화, 또는 스토어 경제로 인해 달라질 수 있지만, 구매 UI는 이러한 차이점을 숨기거나 구글 플레이가 부과하는 갱신 비용과 다른 갱신 비용을 암시해서는 안 됩니다.

Cross-Platform Pricing Clarity

개인 정보 보호 정책 요구 사항

개인 정보 보호 정책 요구 사항

필수 개인 정보 보호 정책

필수 개인 정보 보호 정책

앱에 내 앱 구매가 포함되어 있다면, 다음을 반드시 수행해야 합니다:

  1. 플레이 스토어 목록에 링크

    • 플레이 콘솔에 개인 정보 보호 정책 URL 추가
    • 공개적으로 접근 가능해야 함
    • 앱의 언어와 동일한 언어로 작성해야 함
  2. 앱 내에 링크

    • 앱 설정에서 개인 정보 보호 정책 표시
    • 사용자 데이터를 수집하기 전에 표시해야 함
    • 쉽게 발견할 수 있도록 하세요.

예시 구현:

function SettingsScreen() {
const openPrivacyPolicy = () => {
window.open('https://yourapp.com/privacy', '_blank');
};
const openTerms = () => {
window.open('https://yourapp.com/terms', '_blank');
};
return (
<div>
<h2>Settings</h2>
<button onClick={openPrivacyPolicy}>
Privacy Policy
</button>
<button onClick={openTerms}>
Terms of Service
</button>
<button onClick={() => NativePurchases.manageSubscriptions()}>
Manage Subscriptions
</button>
</div>
);
}

문서 보안 섹션

문서 보안 섹션 제목

구글 플레이에서는 데이터 안전 섹션에서 자세한 설명이 필요합니다.

IAP 앱의 경우 다음을 선언해야 합니다.

  • 구매 기록 수집
  • 전자 메일 주소(영수증)
  • 기기 ID(위조 방지)
  • 결제 정보 처리
  • 분석 데이터 수집

법적 의무입니다. 앱 제거로 이어질 수 있는 오류된 선언이 있습니다.

앱 콘텐츠 선언

앱 콘텐츠 선언 섹션

구글 플레이 리뷰는 바이너리만을 위한 것이 아닙니다. 프로덕션 릴리즈 전에 정책 및 프로그램 > 앱 콘텐츠에서 선언을 완료하세요. 정책 및 프로그램 > 앱 콘텐츠.

주의할 점은 최소입니다:

  • 개인 정보 보호 정책: 플레이 콘솔에서 공공 URL, 필요할 때는 앱 내부의 진입점
  • 광고: 앱이 광고를 포함하는지 선언하세요.
  • 앱 접근: 리뷰어에게 작업을 위한 자격 증명이나 앱 내부의 테스트 경로를 제공하세요. 만약 어떤 화면이 제한되어 있다면.
  • 대상 ауд리언스 및 콘텐츠: 앱의 실제 대상 ауд리언스를 맞춰라
  • 콘텐츠 등급: IARC 설문조사를 완료하여 앱이 등급이 없는 것으로 표시되지 않도록 하라
  • 데이터 안전: 데이터 수집, 공유 및 보안 관행을 정확하게 선언하라

일반 거절 사유

공통 거부 사유

1. 결제 구현이 누락되거나 잘못되었습니다.

구분: "1. 결제 구현이 누락되거나 잘못되었습니다."

실패하는 이유:

  • 디지털 상품을 위한 Google Play Billing을 사용하지 않음
  • 구매 API가 deprecated됨
  • 구독을 위한 커스텀 결제 솔루션을 구현함

예방책:

// ✅ Correct: Use native-purchases (uses Google Play Billing)
await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
// ❌ Wrong: Custom payment processor for subscriptions
// await CustomPayment.charge(user, 9.99);

2. 가격이 불분명하거나 숨겨져 있습니다.

구분: "2. 가격이 불분명하거나 숨겨져 있습니다."

실패하는 이유:

  • 구매 클릭 후 가격만 표시
  • 사전 요금이 공개되지 않음
  • 비밀스러운 구독 조건

예방책:

function PurchaseScreen({ product }) {
return (
<div>
{/* Show ALL costs upfront */}
<h2>Premium Subscription</h2>
<div className="pricing">
<p className="price">{product.priceString}/month</p>
<p className="taxes">Taxes may apply based on location</p>
</div>
<div className="features">
<h3>Includes:</h3>
<ul>
<li>Ad-free experience</li>
<li>Unlimited cloud storage</li>
<li>Priority support</li>
</ul>
</div>
<div className="terms">
<p>
Subscription renews automatically unless cancelled at least
24 hours before the end of the current period.
</p>
<p>
Manage or cancel in Google Play Subscriptions.
</p>
</div>
<button onClick={handlePurchase}>
Start Subscription
</button>
</div>
);
}

3. 속임수 구독 패턴

3. 유혹적인 구독 패턴

3. 유혹적인 구독 패턴 섹션

  • 실패하는 이유:
  • 프리미엄 옵션 미리 선택
  • 비용이 저렴한 대안 숨기기
  • 취소하기 어려운 환경 조성

설명 Best Practices

마케팅 지침

예방 조치:

  • 모든 구독 계층을 동일하게 표시하세요
  • 취소가 명확하고 접근성이 좋은지 확인하세요
  • 카운트다운 타이머나 가짜 부족함을 피하세요
  • 비싼 옵션을 밀어붙이지 말고 어두운 패턴을 피하세요

4. 불완전한 테스트

제목 "4. 불완전한 테스트"

왜 실패하는가:

  • 구매 시 앱이 충돌하는 경우
  • 상품이 로드되지 않는 경우
  • 구매 확인이 표시되지 않습니다.
  • 구매 후 프리미엄 기능이 잠금되지 않습니다.
  • 테스트는 플레이 설치된 테스트 트랙 대신 사이드 로드된 빌드로만 수행되었습니다.

예방 조치:

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Comprehensive testing before submission
async function testPurchaseFlow() {
try {
// 1. Test product loading
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly', 'premium_yearly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Products loaded:', products.length);
// 2. Test purchase flow
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('✓ Purchase completed', transaction.transactionId);
// 3. Verify entitlements
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
if (
purchases.some(
(purchase) =>
purchase.productIdentifier === 'premium_monthly' &&
['PURCHASED', '1'].includes(purchase.purchaseState ?? '') &&
purchase.isAcknowledged,
)
) {
console.log('✓ Premium features unlocked');
}
// 4. Test restore
await NativePurchases.restorePurchases();
console.log('✓ Restore works');
} catch (error) {
console.error('✗ Test failed:', error);
}
}

컨텍스트: Capgo 마케팅 웹사이트. 역할: UI 레이블. 보이는 곳: page agents/[slug].astro. 메시지 키 `agents_page_copy_label` (Agents Page Copy Label).

5. 개인 정보 보호 정책 위반

제목: '5. 개인 정보 보호 정책 위반'

  • 왜 실패하는가:
  • 앱 내 개인 정보 보호 정책 링크가 없습니다.
  • 개인 정보 보호 정책이 접근할 수 없습니다.
  • 데이터 수집이 공개되지 않았습니다.

예방대책:

  • Play Store 목록에 개인 정보 보호 정책 추가
  • 앱 설정에서 링크 포함
  • 데이터 안전 섹션 정확하게 채우기
  • 새로운 데이터 수집 추가 시 정책 업데이트

대안 결제 프로그램

대안 결제 프로그램 섹션

구글의 대안 결제 프로그램은 지역에 따라 다르며 변경될 수 있습니다. 표준 구글 플레이 결제 외에 다른 결제를 원한다면, 구현하기 전에 즉시 Play Console에서 정확한 시장 적합성, 필요한 API, 공개 언어를 확인하세요.

구독 관리

구독 관리

사용자가 해야 할 일:

  • 활성 구독을 쉽게 확인할 수 있습니다.
  • 지원팀에 연락하지 않고 취소할 수 있습니다.
  • 취소가 유효한지 이해할 수 있습니다.

취소가 유효한지 이해할 수 있습니다.

import { NativePurchases } from '@capgo/native-purchases';
function ManageSubscriptionButton() {
const openManagement = async () => {
try {
// Opens Google Play subscription management
await NativePurchases.manageSubscriptions();
} catch (error) {
// Fallback to direct URL
const playStoreUrl = 'https://play.google.com/store/account/subscriptions';
window.open(playStoreUrl, '_blank');
}
};
return (
<button onClick={openManagement}>
Manage Subscription in Google Play
</button>
);
}

구분 제목 “취소 기간”

  • 취소가 유효할 때는 언제인가요?
  • 기간이 끝날 때까지 사용자가 접근권한을 유지할 수 있나요?
  • 부분 환불이 가능하나요?
function CancellationInfo() {
return (
<div className="cancellation-info">
<h3>Cancellation Policy</h3>
<ul>
<li>Cancel anytime in Google Play</li>
<li>Access continues until end of billing period</li>
<li>No refunds for partial periods</li>
<li>Resubscribe anytime to regain access</li>
</ul>
<button onClick={() => NativePurchases.manageSubscriptions()}>
Manage in Google Play
</button>
</div>
);
}

제출 전 확인 목록

제출 전 확인 목록

제출 전 확인 목록

  1. Billing 구현을 확인하세요

    • Google Play Billing (native-purchases)을 사용하는 경우
    • Play Console에서 생성한 모든 구독 제품
    • 기본 계획 및 제안이 올바르게 구성되어 있나요?
    • 제품이 활성화되어 있고 공개되어 있나요?
    • 모든 목적지 국가에 대한 가격 설정
  2. 테스트 구매 흐름

    • 라이선스 테스트 계정 만들기
    • Play 테스트 트랙에서 빌드를 설치
    • 각 구독 계층을 테스트
    • 제품이 올바르게 로드되는지 확인
    • 구매 완료를 테스트
    • 구매 테스트 구매 광고가 나타나는지 확인
    • 프리미엄 기능이 해제되는지 확인
    • 구독 복원 테스트
    • 다양한 기기에서 테스트
  3. 전체 복사본 검토

    • 구매 전에 가격이 명확하게 표시됩니다
    • 전체 비용이 사전에 공개됩니다
    • 구독 조건이 명확합니다
    • 취소 절차가 설명되어 있습니다
    • 허위 광고 없음
  4. 앱 콘텐츠 및 개인 정보

    • Play Console에서 개인 정보 정책 연결
    • 앱 내에서 개인 정보 정책 접근 가능
    • 광고 선언 완료
    • 앱 접근 방법이 추가되었습니다 (앱이 게이트로 잠금되어 있을 때)
    • 데이터 안전 섹션 정확하게 완료되었습니다.
    • 권한이 정당화되고 문서화되었습니다.
  5. 콘텐츠 등급 및 관객

    • 콘텐츠 등급 설문조사 완료
    • 목표 관객과 콘텐츠 섹션 완료
    • 등급이 실제 콘텐츠와 일치하도록 보장합니다.
    • 설문조사에서 인앱 구매를 선언합니다.
  6. 스토어 목록 준비

    • 앱 설명이 정확합니다.
    • 짧은 설명은 80자 이내입니다.
    • 전체 설명은 4000자 이내입니다.
    • 최소 2개의 전화 스크린샷이 업로드되었습니다.
    • 1024x500 특징 그래픽 업로드
    • 현재 버전의 스크린샷을 보여줍니다
    • 필요한 모든 자산이 업로드되었습니다

리뷰 타임라인

리뷰 타임라인

신규 개인 계정에 대한 프로덕션 접근: 일반적으로 7일 이내에 적용되며 첫 번째 프로덕션 리뷰: 일부 경우 지불 또는 정책과 관련된 질문이 제기될 때 수일이 걸릴 수 있습니다. Updates: 업데이트: Appeals: 일주일 동안 계획하고 정확한 수정 및 리뷰어 지시서를 제공하십시오.

:::tip Rolling Reviews Google은 애플과 달리 앱을 지속적으로 검토합니다. 앱이 리뷰 기간 중에 언제든지 출시될 수 있으며, 고정된 시간에 출시되지 않습니다. :::

제출하기 전에 테스트하십시오.

제출하기 전에 테스트하십시오

라이선스 테스트

라이선스 테스트
  1. 테스트 계정 추가:

    • Play 콘솔로 이동하십시오.
    • 설정 > 라이선스 테스트
    • 테스트 계정 추가:
  2. Gmail 계정 추가

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
// Test purchases with license test account
async function testInSandbox() {
const { isBillingSupported } = await NativePurchases.isBillingSupported();
if (!isBillingSupported) {
console.error('Billing not supported in this environment');
return;
}
// Fetch products (returns test pricing when using a license tester)
const { products } = await NativePurchases.getProducts({
productIdentifiers: ['premium_monthly'],
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test products:', products);
// Make test purchase (no charge)
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: 'premium_monthly',
planIdentifier: 'monthly-plan',
productType: PURCHASE_TYPE.SUBS,
});
console.log('Test purchase complete:', transaction.transactionId);
}
  1. 인증 테스트 배너:
    • 테스트 계정으로 구매할 때
    • “테스트 구매” 알림을 볼 수 있어야 합니다.
    • 실제 요금이 발생하지 않습니다.

내부 테스트 및 폐쇄 테스트 트랙

내용 제목: 내부 테스트 및 폐쇄 테스트 트랙

프로덕션 출시 이전:

  1. 빠른 QA를 위해 내부 테스트 트랙을 만들거나 더 광범위한 테스트를 위해 폐쇄 테스트 트랙을 만들 수 있습니다. 트랙 트랙
  2. Google Play Store 리뷰 .aab 및 테스트 릴리즈를 업로드하고
  3. 테스터 이메일 주소를 추가하고 옵인 링크를 공유하세요
  4. Google Play에서 빌드를 설치하도록 테스터에게 지시하세요
  5. Play 설치된 빌드에서 Google Play Billing이 작동하는지 확인하세요
  6. 2023년 11월 13일 이후에 개발자 계정이 생성된 경우, 최소 12명의 테스터를 14일 연속으로 폐쇄 테스트에 옵인시켜야 합니다.

Google Play Billing을 확인하기 위한 Play 설치된 테스트 빌드는 디버그 빌드가 아닙니다.

자연스러운 Native 구매

자연스러운 Native 구매

모든 구매 상태를 처리하세요

모든 구매 상태를 처리하세요
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function handlePurchase(productId: string, planIdentifier?: string) {
try {
setLoading(true);
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: productId,
planIdentifier,
productType: planIdentifier ? PURCHASE_TYPE.SUBS : PURCHASE_TYPE.INAPP,
});
console.log('Purchase token:', transaction.purchaseToken ?? transaction.receipt);
// Success - check entitlements from the store
const { purchases } = await NativePurchases.getPurchases({
productType: planIdentifier ? PURCHASE_TYPE.SUBS : PURCHASE_TYPE.INAPP,
});
const isOwned = purchases.some(
(purchase) =>
purchase.productIdentifier === productId &&
(purchase.purchaseState === 'PURCHASED' || purchase.purchaseState === '1') &&
purchase.isAcknowledged,
);
if (isOwned) {
unlockPremiumFeatures();
showSuccess('Premium activated!');
}
} catch (error: any) {
// Handle specific error cases
switch (error.code) {
case 'USER_CANCELLED':
// User backed out - no error needed
console.log('Purchase cancelled');
break;
case 'ITEM_ALREADY_OWNED':
// They already own it - restore instead
showInfo('You already own this! Restoring...');
await NativePurchases.restorePurchases();
break;
case 'ITEM_UNAVAILABLE':
showError('This subscription is currently unavailable. Please try again later.');
break;
case 'NETWORK_ERROR':
showError('Network error. Please check your connection and try again.');
break;
default:
showError('Purchase failed. Please try again.');
console.error('Purchase error:', error);
}
} finally {
setLoading(false);
}
}

구매내역 복원하기 구현

구매내역 복원하기 구현 섹션
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
function RestorePurchasesButton() {
const [loading, setLoading] = useState(false);
const handleRestore = async () => {
setLoading(true);
try {
await NativePurchases.restorePurchases();
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const hasSubscription = purchases.some(
(purchase) => purchase.productType === 'subs' && purchase.isAcknowledged,
);
if (hasSubscription) {
unlockPremiumFeatures();
showSuccess('Subscriptions restored!');
return;
}
// Check one-time unlocks if needed
const { purchases: iaps } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.INAPP,
});
const hasInApp = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
if (hasInApp) {
unlockPremiumFeatures();
showSuccess('Previous purchases restored!');
return;
}
showInfo('No previous purchases found.');
} catch (error) {
showError('Failed to restore purchases. Please try again.');
} finally {
setLoading(false);
}
};
return (
<button onClick={handleRestore} disabled={loading}>
{loading ? 'Restoring...' : 'Restore Purchases'}
</button>
);
}

구글 플레이 스토어 승인

구독 상태 확인
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function checkSubscriptionStatus() {
try {
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const subscription = purchases.find(
(purchase) =>
purchase.productIdentifier === 'premium_monthly' &&
(purchase.purchaseState === 'PURCHASED' || purchase.purchaseState === '1') &&
purchase.isAcknowledged,
);
if (!subscription) {
showPaywall();
return;
}
console.log('Subscription active:', {
productId: subscription.productIdentifier,
expiresAt: subscription.expirationDate,
willRenew: subscription.willCancel === false,
purchaseToken: subscription.purchaseToken,
});
unlockPremiumFeatures();
} catch (error) {
console.error('Failed to check subscription:', error);
}
}

앱이 승인되지 않은 경우

정책 위반 사례

정책 위반 사례

결제 정책:

구글 플레이 빌링 사용하지 않음

  • 구글 플레이 스토어 리뷰
  • 위조된 구독 약관
  • 숨겨진 비용

사용자 데이터 정책:

  • 결제 정책 누락
  • 정확하지 않은 데이터 안전성 선언
  • 허용된 권한 초과
  1. 위반 통지서를 검토하세요

    • 특정 정책을 읽으세요
    • 구글이 표시한 내용을 이해하세요
    • 제공된 예시를 확인하세요
  2. 문제를 해결하십시오

    • 원인에 대하여, 아닌 증상에 대하여 해결하십시오
    • 수정 후 완전히 테스트하십시오
    • 수정한 모든 변경 사항을 문서화하십시오
  3. 적용 가능한 경우 항의 제출하십시오

    해명 및 항의 절차

    Subject: Policy Violation Appeal - [App Name]
    Dear Google Play Review Team,
    I have received notification that my app violates [Policy X.Y].
    I have made the following changes to comply:
    1. [Specific change made]
    2. [Specific change made]
    3. [Specific change made]
    The updated version [version number] addresses all concerns raised.
    Test account for verification:
    Email: test@example.com
    Password: TestPass123
    Thank you for your consideration.

    문서화 예제 요청하십시오

  4. 다시 제출하거나 업데이트 하십시오

    • 수정한 버전 업로드하십시오
    • 리뷰를 다시 제출하십시오
    • 플레이 콘솔에서 상태를 모니터링하십시오

추가 리소스

추가 리소스 섹션

플레이 스토어 검토를 위한 네비게이션 섹션

우리 팀과 상담 전화 예약 구글 플레이 스토어 리뷰 준비 완료

  • 테스트 트랙 설정 및 테스터 모집
  • IAP 구현 리뷰
  • 데이터 안전 및 개인 정보 보호 준수
  • 거절 사유 해결 및 항소
  • 앱 제출 완료
  • Capgo의 전문가들은 수백 개의 앱을 성공적으로 구글 플레이 스토어 제출을 도와 왔으며 현재 요구 사항을 안내해 드릴 수 있습니다.

지원

구현 도움이 필요하신가요?

IAP를 위한 안드로이드 플레이 스토어 리뷰 지침서에서 계속

IAP를 위한 안드로이드 플레이 스토어 리뷰 지침서에서 계속

안드로이드 플레이 스토어 리뷰 지침서에서 IAP를 위한 계속 안드로이드 플레이 스토어 리뷰 지침서에서 IAP를 위한 계속 안드로이드 플레이 스토어 리뷰 지침서에서 IAP를 위한 계속 Using @capgo/native-purchases native 기능을 사용하는 @capgo/native-purchases 에서 native 기능을 사용합니다. 암호화 암호화 구현 세부 사항을 위해 준수 준수 구현 세부 사항을 위해 Capgo 보안 스캐너 Capgo 보안 스캐너의 제품 워크플로우를 위해, 및 Capgo 보안 Capgo 보안의 제품 워크플로우를 위해