Lompat ke konten

Pedoman Ulasan Aplikasi App Store iOS untuk IAP

Proses Tinjauan Aplikasi App Store iOS

Sebelum Anda Mengirimkan

Bab berjudul “Sebelum Anda Mengirimkan”

Selesaikan Pengaturan App Store Connect

Menggunakan aplikasi App Store memerlukan perhatian yang cermat terhadap pedoman Apple, terutama ketika menerapkan pembelian dalam aplikasi dan langganan. Panduan ini mencakup segala yang Anda perlukan untuk melewati tinjauan pada pengajuan pertama Anda.

Section berjudul “Selesai Konfigurasi Setup App Store”

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 sebenarnya untuk pengguna
  • Selesaikan kuesioner peringkat usia agar aplikasi dapat dipublikasikan
  • Tambahkan __CAPGO_KEEP_0__ Detil Kontak Ulasan Aplikasi dan catatan reviewer yang jelas
  • Jika login diperlukan, berikan akun demo yang tidak berakhir selama ulasan
Metadata Daftar Aplikasi App Store dengan tautan kebijakan dan dukungan
  • Gunakan layar nyata dari build yang sebenarnya yang sedang diulas
  • Untuk iPhone, 1290 x 2796 (6.7-inch) adalah ukuran default yang paling mudah
  • Jika aplikasi Anda berjalan di iPad, unggah juga screenshot iPad
  • Ukuran iPad besar yang saat ini diterima termasuk 2064 x 2752 (13-inch) dan 2048 x 2732 (12.9-inch)
  • Jangan pernah meregangkan screenshot iPhone untuk memalsukan dukungan iPad

Lakukan Dry-Run Perjalanan Reviewer di TestFlight

Judul bagian “Lakukan Dry-Run Perjalanan Reviewer di TestFlight”

Lakukan jalur yang tepat yang Apple akan ikuti di perangkat nyata:

  • Pasang versi terbaru dari TestFlight
  • Masuk dengan akun review yang Anda rencanakan untuk menyediakan
  • Capai paywall tanpa gerakan tersembunyi atau menu debug
  • Alur Pembelian, Pengembalian, dan Pengelolaan Langganan
  • Pastikan aplikasi masih berfungsi dengan benar jika izin di tolak

Apple memerlukan diskusi harga yang jelas sebelum pembelian apa pun:

Elemen Wajib:

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

Reaksi Umum:

“Harga langganan harus jelas dan tidak bersembunyi.”

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

  • Daftar metadata toko App Store
  • layar pembelian dalam aplikasi
  • layar pengelolaan langganan

Meskipun perbedaan $1 antara daftar toko ($4.99) dan aplikasi ($5.99) akan menyebabkan penolakan otomatis. :::

Klarifikasi yang Diperlukan:

  • Tunjukkan semua tingkat langganan yang tersedia bersamaan
  • Pembandingan yang jelas fitur per tingkat
  • Tidak ada pengaturan otomatis ke tingkat premium melalui trik UI
  • Instruksi pembatalan yang mudah ditemukan

Pedoman Desain UI yang Baik dan Buruk

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 mengembalikan pembelian sebelumnya tanpa 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>

Mengapa Gagal:

  • Aplikasi gagal ketika dijalankan
  • Alur pembelian gagal untuk diselesaikan
  • Fitur yang ditampilkan dalam screenshot tidak berfungsi

Pencegahan:

  • Uji coba pada perangkat nyata (bukan hanya simulator)
  • Uji coba semua alur langganan secara keseluruhan
  • Verifikasi validasi pembayaran berfungsi
  • Periksa pengelolaan kesalahan jaringan

Mengapa Gagal:

  • Tampilan Screenshot menampilkan fitur yang tidak ada di build saat ini
  • Deskripsi menyebutkan fitur yang tidak ada
  • Harga di metadata berbeda dengan 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
  • Deskripsi izin yang kabur atau umum

Pencegahan:

Perbarui Info.plist dengan penjelasan yang jelas:

Salinan izin yang terlalu kabur untuk disemak 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 tertentu
  • Taktik kebutuhan darurat palsu (“Hanya 2 tempat tersisa!”)

Contoh Panduan Deskripsi

Panduan Deskripsi Tambahan

Pencegahan:

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

Mengapa Gagal:

  • Tidak ada informasi tentang cara membatalkan
  • Tombol pembatalan disembunyikan atau tertutup
  • Proses pembatalan multi-langkah tanpa alur bawaan 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 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)

Alasan penolakan label privasi yang tidak akurat adalah umum pada tahun 2025. Audit kumpulan data dengan hati-hati.

Daftar Periksa Sebelum Pengiriman

  1. Tes Semua Alur Pembelian

    • Beli setiap tingkat langganan
    • Tes uji coba gratis
    • Verifikasi penawaran promosi yang berlaku
    • Tes pembelian kembali
    • Verifikasi Family Sharing (jika diaktifkan)
    • Tes pada perangkat yang berbeda-beda
  2. Verifikasi Konsistensi Harga

    • Periksa metadata Toko Aplikasi yang sesuai dengan harga dalam aplikasi
    • Verifikasi semua mata uang yang benar
    • Konfirmasi durasi uji coba gratis yang sesuai dengan deskripsi
    • Periksa syarat-syarat penawaran awal yang akurat
  3. Ulas Semua Konten

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

    • Minta hanya izin yang diperlukan
    • Tampilkan penjelasan yang jelas sebelum meminta
    • Uji aliran
    • Pastikan deskripsi Info.plist jelas
  5. Siapkan Akun Uji

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

    • Gambar skrin sesuai dengan UI saat ini
    • URL dukungan mencakup informasi kontak yang nyata
    • URL kebijakan privasi telah diisi
    • Peringkat usia sesuai dengan konten di dalam build
    • Video pratinjau aplikasi (jika ada) menampilkan versi saat ini
    • Deskripsi akurat menggambarkan fitur-fitur
    • Kebijakan privasi dapat diakses dalam aplikasi dan dari daftar aplikasi toko
  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.

Lini Waktu Ulasan App Store

Ulasan Standar: 24-48 jam Masa Puncak: 3-5 hari (Rilis App Store liburan) Akhir Pekan: Tidak ada ulasan diproses Review yang Dipercepat: Tersedia untuk perbaikan bug kritikal (minta melalui App Store Connect)

Status yang umum Anda lihat di App Store Connect:

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

Fokus Pengiriman 2026

Fokus Pengiriman 2026

1. Klarifikasi Langganan

  • Diperlukan perbandingan rencana samping-samping
  • Tidak ada pola gelap yang menyembunyikan opsi yang lebih murah
  • Jalur penurunan/peningkatan yang jelas

2. Akurasi Metadata

  • Sketsa layar harus sesuai dengan build yang sedang diperiksa
  • Diperlukan sketsa layar iPad jika dukungan iPad diaktifkan
  • URL dukungan dan kebijakan privasi harus sudah aktif sebelum pengiriman

3. Privasi dan Kualitas Detail Tinjauan

  • Penyataan privasi harus sesuai dengan apa yang dikumpulkan oleh SDK Anda
  • App Review informasi kontak dan catatan harus lengkap pada pengiriman pertama
  • Demo kredit harus tetap valid selama jendela ulasan penuh

4. Kesiapan Pengiriman

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

Praktik Terbaik untuk Plugin Pembelian Asli

Judul Bagian “Praktik Terbaik untuk Plugin Pembelian Asli”

Tetapkan Pengelolaan Kesalahan yang Tepat

Judul Bagian “Tetapkan Pengelolaan Kesalahan yang Tepat”
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.');
}
}
}
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>
);
}
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>
);
}
  1. Baca ulang penolakan yang diberikan

    • Catat 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 utama
    • Uji perbaikan secara menyeluruh
    • Dokumentasikan perubahan yang Anda buat
  3. Bersinergi di Pusat Penyelesaian

    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. Tayangkan kembali dengan segera

    • Biasanya dalam waktu 24 jam
    • Proses Banding

Bagian berjudul “Proses Banding”

Jika Anda yakin penolakan itu salah:

Proses Penjelasan App Store

Proses Penjelasan App Store

  1. Klik “Minta” di App Store Connect
  2. Berikan bukti yang jelas:
    • Layar tangkapan yang menunjukkan kelayakan
    • Referensi ke pedoman spesifik
    • Penjelasan 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 ulasan aplikasi atau memerlukan bantuan yang personal? Bukukanlah panggilan konsultasi dengan tim kami untuk dukungan yang dedikasi dengan:

  • Ulasan dan Optimasi Implementasi IAP
  • Persiapan dan Strategi Ulasan App Store
  • Ulasan Checklist Pengiriman
  • Pengembalian Revisi dan Pengadilan
  • Pengujian dan Validasi Lengkap

Ahli kami telah berhasil membantu ratusan aplikasi melewati ulasan!

Lanjutkan dari Pedoman Ulasan iOS App Store untuk IAP

Bagian berjudul “Teruskan dari Pedoman Ulasan Aplikasi iOS untuk IAP”

Jika Anda menggunakan Pedoman Ulasan Aplikasi iOS untuk IAP untuk merencanakan persetujuan dan distribusi toko, hubungkannya dengan Menggunakan @capgo/native-purchases untuk kemampuan native di Menggunakan @capgo/native-purchases, @capgo/capacitor-in-app-review untuk detail implementasi di @capgo/capacitor-in-app-review, Menggunakan @capgo/capacitor-in-app-review untuk kemampuan native di Menggunakan @capgo/capacitor-in-app-review, @capgo/capacitor-native-market untuk detail implementasi di @capgo/capacitor-native-market, dan Menggunakan @capgo/capacitor-native-market untuk kemampuan asli di Menggunakan @capgo/capacitor-native-market.