Lebih lanjut ke konten

Pedoman Ulasan App Store iOS untuk IAP

GitHub

Mengapa Anda perlu memperhatikan peraturan Apple dengan teliti untuk mendapatkan aplikasi Anda disetujui di App Store, terutama ketika mengimplementasikan pembelian dalam aplikasi dan langganan. Petunjuk ini mencakup segala yang Anda butuhkan untuk melewati tinjauan pada submission pertama Anda.

Proses Tinjauan App Store iOS

Selesai Mengatur Setup App Store Connect

Bab berjudul “Selesai Mengatur Setup App Store Connect”

Sebelum Apple meninju aliran pembelian Anda, pastikan catatan aplikasi itu sendiri sudah lengkap:

  • Tambahkan URL Kebijakan Privasi di App Store Connect
  • Tambahkan sebuah URL Bantuan yang mengarah ke informasi kontak nyata bagi pengguna
  • Lengkapi peringkat usia Kategori: Halaman/Sektor: Halaman contoh aplikasi solusi. Peran: Label UI singkat atau item navigasi. Dilihat di: komponen solusi/SolutionAppExample.astro. Kunci pesan `solution_app_examples_rating` (Rating Contoh Aplikasi Solusi).
  • kuesioner sehingga aplikasi dapat dipublikasikan Tambahkan Detail Kontak Ulasan Aplikasi
  • dan catatan reviewer yang jelas akun demo yang tidak berakhir selama tinjauan
Metadata daftar aplikasi App Store dengan tautan ke kebijakan dan dukungan
  • Gunakan screenshot saat ini dari build asli yang sedang dalam tinjauan
  • Untuk iPhone 1290 x 2796 (6,7 inci) adalah ukuran default yang paling mudah
  • Jika aplikasi Anda dapat berjalan di iPad, unggah screenshot iPad juga
  • Ukuran iPad yang diterima saat ini termasuk 2064 x 2752 (13-inch) dan 2048 x 2732 (12.9-inch)
  • Jangan memanjangkan layar iPhone untuk memalsukan dukungan iPad

Lakukan Tes Perjalanan Peninjau di TestFlight

Bagian berjudul “Lakukan Tes Perjalanan Peninjau di TestFlight”

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

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

Apple memerlukan pengungkapan 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 oleh pengguna dengan uang mereka
  • Indikasikan kapan tagihan akan terjadi

Penolakan Umum:

“Harga langganan harus jelas dan terbuka.”

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

  • Daftar Metadata App Store
  • Antarmuka Pembelian Aplikasi
  • Antarmuka Pengelolaan Langganan

Ketidaksesuaian sekecil $1 antara daftar toko ($4.99) dan aplikasi ($5.99) akan memicu penolakan otomatis.

Klarifikasi yang Diperlukan:

  • Tunjukkan semua tingkat langganan yang tersedia secara bersamaan
  • Perbandingan yang jelas fitur per tingkat
  • Tidak ada auto-default ke tingkat premium melalui trik UI
  • Instruksi pembatalan yang mudah ditemukan

Petunjuk 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>

1. Aplikasi Mengalami Crash atau Fungsi yang Rusak

Bagian berjudul “1. Aplikasi Mengalami Crash atau Fungsi yang Rusak”

Mengapa Gagal:

  • Aplikasi bermasalah saat diluncurkan
  • Alur pembelian gagal untuk diselesaikan
  • Fitur yang ditampilkan dalam sketsa tidak berfungsi

Pencegahan:

  • Test pada perangkat nyata (bukan hanya simulator)
  • Test semua alur langganan dari awal hingga akhir
  • Verifikasi validasi strukturnya berfungsi
  • Periksa penanganan kesalahan jaringan

Mengapa Gagal:

  • Tampak Screenshot 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 disembunyikan di beberapa halaman
  • Penjelasan izin yang tidak jelas atau umum

Pencegahan:

Perbarui dengan penjelasan yang jelas: Info.plist Salinan izin yang terlalu umum untuk tinjauan

Salinan izin dengan penjelasan yang lebih jelas Salin ke clipboard
<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>

Bab yang berjudul “4. Pemasaran yang Menipu”

Mengapa Gagal:

Klaim seperti “Aplikasi #1 di dunia” tanpa bukti

  • Fitur-fitur yang “Tidak Terbatas” dengan batasan yang tersembunyi
  • Taktik kebutuhan darurat palsu (“Hanya 2 tempat yang tersedia!”)
  • Mengapa Gagal:

Deskripsi Pedoman Contoh

Deskripsi Pedoman Tambahan

Pencegahan:

  • Beri deskripsi yang spesifik dan faktual
  • Hindari superlatif tanpa bukti
  • Jangan tekan 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 tertutup
  • Proses pembatalan multi-langkah tanpa alur native 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 (kasus 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:

  • Sejarah Pembelian
  • Alamat Email (untuk bukti pembelian)
  • ID Perangkat (untuk pencegahan penipuan)
  • Data Penggunaan (untuk analisis)

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

Daftar Periksa Sebelum Pengiriman

Daftar Pemeriksaan Sebelum Pengiriman

Pemeriksaan Sebelum Pengiriman

  1. Tes Semua Aliran Pembelian

    • Belilah setiap tingkat langganan
    • Tes uji coba gratis
    • Pastikan penawaran intro berlaku dengan benar
    • Tes pembelian kembali
    • Pastikan Family Sharing (jika diaktifkan)
    • Tes pada perangkat yang berbeda
  2. Pastikan Konsistensi Harga

    • Periksa metadata App Store sesuai dengan harga dalam aplikasi
    • Pastikan semua mata uang benar
    • Konfirmasi durasi percobaan gratis sesuai dengan deskripsi
    • Periksa syarat-syarat penawaran awal yang akurat
  3. Ulangi Semua Konten

    • Hapus teks tempat
    • Pastikan klaim dapat diuji
    • Periksa tata bahasa dan ejaan
    • Pastikan deskripsi sesuai dengan versi saat ini
    • Hapus pengacuan kompetitor
  4. Uji Izin

    • Hanya minta izin yang diperlukan
    • Tunjukkan penjelasan yang jelas sebelum meminta
    • Uji aliran “Tolak” (aplikasi masih harus berfungsi)
    • Verifikasi Deskripsi Info.plist Jelas
  5. Siapkan Akun Uji

    • Buat Akun Tinjauan yang Tetap Aktif Selama Tinjauan
    • Dokumentasi Kredensial Login di Informasi Tinjauan Aplikasi
    • Verifikasi Pengguna Tinjauan dapat Mencapai Paywall dan Menyelesaikan Alur Pembelian
    • Masukkan Akun Tambahan atau Switch Aplikasi Khusus di Bidang Catatan jika Diperlukan
  6. Periksa Metadata

    • Gambar Layar Screenshot Cocok dengan UI Saat Ini
    • URL Support Termasuk Informasi Kontak yang Nyata
    • URL Kebijakan Privasi diisi
    • Rating Usia Cocok dengan Konten di 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 di 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.

Jadwal Ulasan App Store

Ulasan Standar: 24-48 jam Masa Sibuk: 3-5 hari (rilis aplikasi liburan App Store) Mingguan: No review yang diproses Ulasan Cepat: Tersedia untuk perbaikan bug kritikal (minta 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 yang diperlukan
  • Tidak ada “pola gelap” yang menyembunyikan opsi yang lebih murah
  • Rute penurunan/peningkatan yang jelas

2. Akurasi Metadata

  • Gambar layar harus sesuai dengan build yang sedang dinilai
  • Gambar layar iPad diperlukan jika dukungan iPad diaktifkan
  • URL dukungan dan kebijakan privasi harus sudah aktif sebelum pengajuan

3. Kualitas Detail Tinjauan dan Privasi

  • Pengungkapan privasi harus sesuai dengan apa yang dikumpulkan oleh SDK Anda
  • Info kontak tinjauan aplikasi dan catatan harus lengkap pada pengajuan pertama
  • Kredensial demo harus tetap valid selama jendela tinjauan penuh

4. Kesiapan Pengajuan

  • 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 mengirimkan

Praktik Terbaik untuk Plugin Pembelian Asli

Judul Bagian “Praktik Terbaik untuk Plugin Pembelian Asli”

Implementasikan Pengelolaan Kesalahan yang Tepat

Judul Bagian “Implementasikan 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>
);
}

Tampilkan Ketentuan dengan Jelas

Salin ke clipboard
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 penolakan dengan teliti

    • 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

    • Tidak hanya perbaiki - perbaiki penyebab akar
    • Uji perbaikan secara ekstensif
    • Dokumentasikan apa yang Anda ubah
  3. Balas di Pusat Resolusi

    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. Resubmit dengan segera

    • Resubmisi biasanya diperiksa lebih cepat
    • Biasanya dalam waktu 24 jam

Jika Anda percaya bahwa penolakan itu salah:

Proses Penjelasan App Store

  1. Klik “Banding” di App Store Connect
  2. Berikan bukti yang jelas:
    • Gambar layar menunjukkan kelayakan
    • Referensi pada Pedoman Spesifik
    • Penjelasan tentang bagaimana Anda memenuhi persyaratan
  3. Jadilah profesional dan faktual
  4. Termasuk akun uji jika fungsi sulit ditemukan

Contoh Permintaan Dokumen

Bantuan

Bantuan

Bila Anda masih mengalami masalah:

Membutuhkan Bantuan Ahli?

Bantuan Ahli

Mengalami kesulitan dengan tinjauan aplikasi atau membutuhkan bantuan pribadi? Buat janji konsultasi dengan tim kami untuk dukungan yang dedikasi dengan:

  • Ulasan dan optimasi implementasi IAP
  • Persiapan dan strategi ulasan App Store
  • Ulasan checklist pengiriman
  • Pengembalian penolakan dan banding
  • Pengujian dan validasi lengkap

Para ahli kami telah membantu ratusan aplikasi melewati ulasan dengan sukses!

Lanjutkan dari Pedoman Ulasan App Store iOS untuk IAP

Judul bagian “Lanjutkan dari Pedoman Ulasan App Store iOS untuk IAP”

Jika Anda menggunakan Pedoman Ulasan App Store iOS untuk IAP Mengatur persetujuan dan distribusi toko, hubungkannya dengan Menggunakan @capgo/native-purchases untuk kemampuan asli dalam Menggunakan @capgo/native-purchases, @capgo/capacitor-ulasan-dalam-aplikasi untuk detail implementasi dalam @capgo/capacitor-ulasan-dalam-aplikasi, Menggunakan @capgo/capacitor-ulasan-dalam-aplikasi untuk kemampuan asli dalam Menggunakan @capgo/capacitor-ulasan-dalam-aplikasi, @capgo/capacitor-pasar-asing untuk detail implementasi dalam @capgo/capacitor-pasar-asing, dan Menggunakan @capgo/capacitor-pasar-asing untuk kemampuan asli dalam Menggunakan @capgo/capacitor-pasar-asing.