Lompat ke konten

Pedoman Ulasan Aplikasi App Store iOS untuk IAP

__CAPGO_KEEP_0__

Proses Ulasan Aplikasi App Store iOS

Selesaikan Pengaturan App Store Connect

Judul Bagian “Selesaikan Pengaturan App Store Connect”

Sebelum Apple memeriksa alur pembelian Anda, pastikan catatan aplikasi itu sendiri sudah lengkap:

  • Tambahkan URL Kebijakan Privasi di App Store Connect
  • Tambahkan URL Bantuan yang mengarah ke informasi kontak yang nyata untuk pengguna
  • Selesaikan pengaturan usia kuesioner sehingga aplikasi dapat dipublikasikan
  • Tambah Detail Kontak Ulasan Aplikasi dan catatan reviewer yang jelas
  • Jika login diperlukan, berikan akun demo yang tidak berakhir selama proses tinjauan
Metadata Daftar Aplikasi App Store dengan tautan ke kebijakan dan dukungan
  • Gunakan screenshot saat ini dari build asli yang sedang diperiksa
  • Untuk iPhone, 1290 x 2796 (6.7 inci) adalah ukuran default paling mudah
  • Jika aplikasi Anda berjalan di iPad, unggah screenshot iPad juga
  • Ukuran iPad besar yang diterima saat ini termasuk 2064 x 2752 (13 inci) dan 2048 x 2732 (12.9 inci)
  • Jangan pernah meregangkan screenshot iPhone untuk memalsukan dukungan iPad

Lakukan Uji Coba Perjalanan Peninjau di TestFlight

Judul Bagian “Lakukan Uji Coba Perjalanan Peninjau di TestFlight”

Jalankan jalur yang tepat yang akan diikuti oleh Apple pada perangkat nyata:

  • Pasang versi terbaru dari TestFlight
  • Masuk dengan akun tinjauan yang Anda rencanakan untuk menyediakan
  • Dapatkan akses ke paywall tanpa gerakan tersembunyi atau menu debug
  • Lakukan alur pembelian, restorasi, dan pengelolaan langganan
  • Verifikasi bahwa aplikasi masih berperilaku dengan benar jika izin di tolak

Apple memerlukan diskusi harga yang jelas sebelum pembelian apapun:

Elemen Wajib:

  • Tampilkan harga yang tepat sebelum tombol pembelian
  • Tampilkan frekuensi tagihan (misalnya, “$9.99/bulan”)
  • Jelaskan dengan jelas apa yang didapatkan oleh pengguna untuk uang mereka
  • Tunjukkan kapan biaya akan terjadi

Penolakan Umum:

“Subscription pricing must be clear and upfront.”

:::peringatan Konsistensi Harga Semua harga harus sesuai di:

  • Daftar metadata App Store
  • Tampilan pembelian di aplikasi
  • Tampilan manajemen langganan

Bahkan perbedaan $1 antara daftar metadata ($4.99) dan aplikasi ($5.99) akan memicu penolakan otomatis. :::

Pengenalan Rencana Langganan

Pengaturan Rencana Langganan

Pengungkapan yang Wajib:

  • Semua tingkat langganan yang tersedia ditampilkan bersamaan
  • Penggabungan yang jelas fitur per tingkat
  • Tidak ada pengaturan otomatis ke tingkat premium melalui trik UI
  • Instruksi pembatalan yang mudah ditemukan

Pedoman Desain UI: Hal-Hal yang Dapat Dilakukan dan Tidak Dapat Dilakukan

Paywall dengan fitur restore pembelian dan tautan hukum

Contoh UI yang Kompatibel:

import { NativePurchases } from '@capgo/native-purchases';
function SubscriptionScreen() {
return (
<div>
<h2>Choose Your Plan</h2>
{/* Show all tiers equally */}
<PlanCard
title="Basic"
price="$4.99/month"
features={['Feature A', 'Feature B']}
/>
<PlanCard
title="Premium"
price="$9.99/month"
features={['All Basic', 'Feature C', 'Feature D']}
highlighted={false} // Don't force premium
/>
{/* Clear cancellation info */}
<Text>
Cancel anytime in Settings > Subscriptions.
No refunds for partial periods.
</Text>
</div>
);
}

Implementasi yang Diperlukan:

Setiap aplikasi dengan IAP harus menyediakan cara bagi pengguna untuk memulihkan pembelian sebelumnya tanpa harus menghubungi dukungan.

import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function restorePurchases() {
try {
await NativePurchases.restorePurchases();
const { purchases } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.SUBS,
});
const activeSub = purchases.find(
(purchase) => purchase.isActive && purchase.expirationDate,
);
if (activeSub) {
unlockPremiumFeatures();
showMessage('Purchases restored successfully!');
return;
}
const { purchases: iaps } = await NativePurchases.getPurchases({
productType: PURCHASE_TYPE.INAPP,
});
const hasIap = iaps.some((purchase) => purchase.productIdentifier === 'premium_unlock');
showMessage(
hasIap ? 'Premium purchase restored!' : 'No previous purchases found.',
);
} catch (error) {
showError('Failed to restore purchases. Please try again.');
}
}
// Add a visible "Restore Purchases" button
<Button onClick={restorePurchases}>
Restore Purchases
</Button>

1. Aplikasi Bajik atau Fungsi yang Rusak

Judul Bagian “1. Aplikasi Bajik atau Fungsi yang Rusak”

Mengapa Gagal:

  • Aplikasi gagal meluncur
  • Aliran pembelian gagal untuk diselesaikan
  • Fitur yang ditampilkan dalam screenshot tidak berfungsi

Pencegahan:

  • Test pada perangkat nyata (bukan hanya simulator)
  • Test semua aliran langganan secara end-to-end
  • Verifikasi validasi bukti pembayaran berfungsi
  • Periksa penanganan kesalahan jaringan

Mengapa Gagal:

  • Layar tangkapan menampilkan fitur yang tidak ada di build saat ini
  • Deskripsi menyebutkan fungsi yang tidak ada
  • Harga di metadata berbeda dari harga di aplikasi

Daftar Periksa Metadata

Pencegahan:

// Document exactly what's in each tier
const SUBSCRIPTION_FEATURES = {
basic: ['Ad-free', 'Cloud sync', 'Basic themes'],
premium: ['Ad-free', 'Cloud sync', 'All themes', 'Priority support']
};
// Use these in both your app AND App Store description

Mengapa Gagal:

  • Mengajukan kamera/lokasi/kesehatan tanpa penjelasan
  • Permintaan izin yang disembunyikan di beberapa layar
  • Penjelasan izin yang kabur atau umum

Pencegahan:

Perbarui Info.plist dengan penjelasan yang jelas:

Salinan izin yang terlalu kabur untuk tinjauan Salinan izin dengan penjelasan yang lebih jelas
<key>NSCameraUsageDescription</key>
<string>Camera access is needed to scan product barcodes for quick subscription upgrades.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Location helps us show relevant local content in your Premium subscription.</string>

Mengapa Gagal:

  • Klaim seperti “Aplikasi #1 di Dunia” tanpa bukti
  • Fitur “Tidak Terbatas” yang memiliki batasan rahasia
  • Taktik Kebutuhan Darurat Palsu (“Hanya 2 tempat yang tersedia!”)

Contoh Panduan Deskripsi

Panduan Deskripsi Tambahan

Pencegahan:

  • Jelaskan secara spesifik dan faktual dalam deskripsi
  • Hindari superlatif tanpa bukti
  • Jangan memaksa pengguna dengan kekurangan palsu

5. Proses Pembatalan Tersembunyi

Judul Bagian 5. Proses Pembatalan Tersembunyi

Mengapa Gagal:

  • Tidak ada penjelasan tentang cara pembatalan
  • Tombol pembatalan disembunyikan atau tersembunyi
  • Proses pembatalan multi-langkah tanpa alur asli Apple

Pencegahan:

// Always inform users about cancellation
function SubscriptionInfo() {
return (
<div>
<h3>How to Cancel</h3>
<ol>
<li>Open iPhone Settings</li>
<li>Tap your name at the top</li>
<li>Tap Subscriptions</li>
<li>Select this app and tap Cancel</li>
</ol>
<p>Or manage directly in the App Store app.</p>
<Button onClick={openSubscriptionManagement}>
Manage Subscription in Settings
</Button>
</div>
);
}
async function openSubscriptionManagement() {
// Direct link to iOS subscription management
await NativePurchases.showManageSubscriptions();
}

Privasi & Penggunaan Data (Bagian 5.1.1)

Judul Bagian Privasi & Penggunaan Data (Bagian 5.1.1)

Apple telah memperketat persyaratan privasi pada tahun 2025

Untuk Setiap Izin:

  1. Mengapa Anda membutuhkannya (contoh penggunaan spesifik)
  2. Kapan data akan digunakan
  3. Bagaimana data disimpan/dibagikan
  4. Apakah itu opsional atau wajib
async function requestCameraPermission() {
// Show explanation BEFORE requesting
await showDialog({
title: 'Camera Access',
message: 'We need camera access to let you scan barcodes for quick product lookup. Your photos are never uploaded or stored.',
buttons: ['Not Now', 'Allow']
});
// Then request permission
const result = await Camera.requestPermissions();
return result.camera === 'granted';
}

Pastikan label privasi App Store Anda akurat menggambarkan:

  • Pengumpulan riwayat pembelian
  • Alamat email (untuk faktur)
  • ID perangkat (untuk pencegahan penipuan)
  • Data penggunaan (untuk analisis)

Label privasi yang tidak akurat adalah alasan penolakan yang umum pada tahun 2025. Audit pengumpulan data dengan hati-hati.

Daftar Periksa Sebelum Pengiriman

  1. Tes Semua Aliran Pembelian

    • Beli setiap tingkat langganan
    • Tes uji coba gratis
    • Pastikan penawaran awal berlaku dengan benar
    • Test restore pembelian
    • Pastikan Bagikan Keluarga (jika diaktifkan)
    • Test pada perangkat berbagai jenis
  2. Pastikan Konsistensi Harga

    • Periksa metadata App Store sesuai dengan harga dalam aplikasi
    • Pastikan semua mata uang benar
    • Konfirmasi durasi trial gratis sesuai dengan deskripsi
    • Periksa ketentuan penawaran awal akurat
  3. Ulas Semua Salinan

    • Hapus teks tempat
    • Pastikan klaim dapat diuji
    • Periksa tata bahasa dan ejaan
    • Pastikan deskripsi sesuai dengan build saat ini
    • Hapus pengacuan kompetitor
  4. Test Akses Hak

    • Minta hak akses yang diperlukan saja
    • Tunjukkan penjelasan yang jelas sebelum meminta
    • Test aliran 'Tolak' (aplikasi masih harus berfungsi)
    • Verifikasi deskripsi Info.plist yang jelas
  5. Siapkan Akun Uji

    • Buat akun tinjauan yang tetap valid selama tinjauan
    • Dokumentasi kredit login di Informasi Tinjauan Aplikasi
    • Verifikasi bahwa reviewer dapat mencapai paywall dan menyelesaikan aliran pembelian
    • Termasuk akun tambahan atau switch aplikasi khusus di bidang Catatan jika diperlukan __CAPGO_KEEP_0__
  6. Periksa Metadata

    • Layar tangkapan layar sesuai dengan UI saat ini
    • URL dukungan mencakup informasi kontak yang sebenarnya
    • URL kebijakan privasi telah diisi
    • Peringkat usia sesuai dengan konten di dalam build
    • Video pratinjau aplikasi (jika ada) menampilkan versi saat ini
    • Deskripsi secara akurat menggambarkan fitur-fitur
    • Kebijakan privasi dapat diakses dalam aplikasi dan dari daftar aplikasi
  7. Tulis Catatan Ulasan Rinci

    Contact:
    Name: Jane Developer
    Email: review@yourapp.com
    Phone: +1 555-0100
    Test Account:
    Email: reviewer@test.com
    Password: TestPass123!
    This account does not expire during review.
    Testing Instructions:
    1. Log in with test account above
    2. Tap "Upgrade to Premium" button
    3. Select "Monthly Premium" subscription
    4. Complete purchase (no charge in sandbox)
    5. Verify premium features unlock
    Note: Subscription pricing is clearly shown before purchase.
    Cancellation instructions are in Settings > Account.

Lihat Garis Waktu Ulasan

Jadwal Ulasan

Jadwal Ulasan App Store

Ulasan Standar: 24-48 jam Masa Sibuk: 3-5 hari (rilis libur App Store) Akhir Pekan: Tidak ada ulasan diproses Ulasan Dipercepat: Tersedia untuk perbaikan bug kritikal (permintaan melalui App Store Connect)

Status umum yang akan Anda lihat di App Store Connect:

  • Waiting for Review
  • In Review
  • Pending Developer Release
  • Rejected

1. Klarifikasi Langganan

  • Perbandingan rencana samping-samping diperlukan
  • Tidak ada “pola gelap” yang menyembunyikan opsi yang lebih murah
  • Rute penurunan/peningkatan yang jelas

2. Akurasi Metadata

  • Screenshoot harus sesuai dengan build yang sedang dinilai
  • Jika dukungan iPad diaktifkan, maka tangkapan layar iPad diperlukan
  • URL dukungan dan kebijakan privasi harus sudah aktif sebelum pengiriman

3. Kualitas Detail Privasi dan Ulasan

  • Pengungkapan privasi harus sesuai dengan apa yang SDK Anda sebenarnya kumpulkan
  • Informasi kontak dan catatan App Review harus lengkap pada pengiriman pertama
  • Kredensial demo harus tetap valid selama jendela tinjauan penuh

4. Kesiapan Pengiriman

  • Apple memperbarui persyaratan minimum SDK secara teratur, jadi pastikan deadline saat ini sebelum mengunggah rilis build
  • TestFlight adalah tempat yang paling aman untuk memverifikasi jalur reviewer yang tepat sebelum Anda mengirimkan

Praktik Terbaik untuk Plugin Pembelian Asli

Praktik Terbaik untuk Plugin Pembelian Asli
import { NativePurchases, PURCHASE_TYPE } from '@capgo/native-purchases';
async function handlePurchase(productId: string) {
try {
const transaction = await NativePurchases.purchaseProduct({
productIdentifier: productId,
productType: PURCHASE_TYPE.SUBS,
});
// Success
await validateReceiptOnServer(transaction.receipt);
showSuccess('Subscription activated!');
unlockFeatures();
} catch (error: any) {
// Handle specific error cases
if (error.code === 'USER_CANCELLED') {
// User cancelled - don't show error
console.log('Purchase cancelled by user');
} else if (error.code === 'PAYMENT_PENDING') {
showInfo('Payment is pending. Please check back later.');
} else if (error.code === 'PRODUCT_ALREADY_PURCHASED') {
// Restore instead
await NativePurchases.restorePurchases();
} else {
// Show user-friendly error
showError('Unable to complete purchase. Please try again.');
}
}
}

Tampilkan Status Pengisian

Mengimplementasikan Tampilan Pengisian
function PurchaseButton({ productId }: { productId: string }) {
const [loading, setLoading] = useState(false);
const handlePurchase = async () => {
setLoading(true);
try {
await NativePurchases.purchaseProduct({ productIdentifier: productId });
} finally {
setLoading(false);
}
};
return (
<button onClick={handlePurchase} disabled={loading}>
{loading ? 'Processing...' : 'Subscribe Now'}
</button>
);
}

Tampilkan Ketentuan dengan Jelas

Mengimplementasikan Tampilan Ketentuan
function SubscriptionTerms() {
return (
<div className="terms">
<p>
Subscription automatically renews unless cancelled at least 24 hours
before the end of the current period.
</p>
<p>
Your account will be charged for renewal within 24 hours prior to
the end of the current period.
</p>
<p>
Subscriptions may be managed by the user and auto-renewal may be
turned off in Account Settings after purchase.
</p>
<p>
<a href="/terms">Terms of Service</a> |
<a href="/privacy">Privacy Policy</a>
</p>
</div>
);
}

Jika Aplikasi Anda Ditolak

Mengimplementasikan Ketentuan

Mengatasi Langkah-Langkah

Mengimplementasikan Langkah-Langkah
  1. Baca penolakan dengan teliti

    • Perhatikan pedoman spesifik yang disebutkan (misalnya, 3.1.1, 5.1.1)
    • Pahami secara tepat apa yang ditandai oleh Apple
  2. Perbaiki masalah secara menyeluruh

    • Jangan hanya memperbaiki - perbaiki penyebab akar
    • Uji perbaikan secara menyeluruh
    • Dokumentasikan perubahan yang Anda buat
  3. Balas di Resolution Center

    Thank you for your feedback. I have addressed the issue:
    Issue: Subscription pricing not clear upfront
    Fix: Added explicit pricing display on subscription selection
    screen showing "$9.99/month" before purchase button. Also added
    cancellation instructions on the same screen.
    The changes are in this submission and can be tested using the
    provided test account.
  4. Kirim kembali dengan cepat

    • Kirim kembali biasanya diperiksa lebih cepat
    • Biasanya dalam waktu 24 jam

Jika Anda yakin penolakan itu salah:

Proses Penjelasan App Store

  1. Klik “Banding” di App Store Connect
  2. Sampaikan bukti yang jelas:
    • Fotokopi layar menunjukkan kelayakan
    • Pengacuan ke pedoman spesifik
    • Pengertian bagaimana Anda memenuhi persyaratan
  3. Tunjukkan profesional dan fakta
  4. Termasuk akun uji jika fungsi sulit ditemukan

Contoh Permintaan Dokumen

Jika Anda masih mengalami masalah:

Sulit dengan tinjauan aplikasi atau memerlukan bantuan yang disesuaikan? Buku janji panggilan dengan tim kami untuk dukungan yang didedikasikan dengan:

  • Ulasan dan optimasi implementasi IAP
  • Persiapan dan strategi tinjauan App Store
  • Ulasan checklist pengiriman
  • Penyelesaian penolakan dan banding
  • Lengkapkan pengujian dan validasi

Para ahli kami telah berhasil membantu ratusan aplikasi lolos review!