Saat pengujian IAP menjelang rilis, kami menemukan masalah yang umum tetapi sangat membingungkan:
- Pengguna menekan “Lanjutkan Pembelian”
- Tombol berubah ke status “Memproses”
- Beberapa detik kemudian kembali ke “Lanjutkan Pembelian”
- Dialog konfirmasi pembelian App Store tidak muncul
Artikel ini merangkum jalur investigasi lengkap, log penting, akar masalah, dan strategi perbaikan yang bisa diterapkan sebelum peluncuran.
1. Gejala
Daftar produk di halaman pembelian termuat normal, tetapi setelah tombol beli ditekan:
purchase()terpanggil- Tidak ada dialog sistem yang muncul
- UI akhirnya kembali ke status belum membeli
Sekilas terlihat seperti alur pembelian tidak berjalan, tetapi log menunjukkan hal yang berbeda.
2. Pemeriksaan awal: apakah alur pembelian benar-benar berjalan?
Kami menambahkan log di semua titik kritis alur pembelian:
- Parameter saat tombol ditekan
- Entry
purchaseSelectedProduct()dan cabangguard - Sebelum/sesudah
product.purchase() Transaction.updatesrefreshEntitlements()Transaction.currentEntitlementsTransaction.latest(for:)
Hasil:
purchase()mengembalikan.success- Verifikasi transaksi berhasil, dan
transaction.finish()juga dieksekusi - Tetapi
entitledIDstetap kosong
Artinya: masalahnya bukan “pembelian tidak dimulai”, melainkan “entitlement tidak dikenali setelah pembelian”.
3. Temuan kunci setelah investigasi lebih dalam
Setelah menambah log lebih detail, muncul beberapa sinyal penting:
- Jumlah iterasi
Transaction.currentEntitlementsadalah0 Transaction.latest(for: monthly)punya record valid, tetapi sudah kedaluwarsa- Yang paling krusial: sebelum pembelian ada transaksi lama di
Transaction.unfinished purchase()saat ini mengembalikan transaksi dari rantai lama, bukan dari alur pembelian interaktif baru
Ini menjelaskan kenapa “tidak ada pop-up”:
- StoreKit lebih dulu mengembalikan transaksi lama yang bisa diproses (unfinished / historical chain)
- Kode Anda menutupnya dengan
finish() - Request terlihat “sukses”, tetapi tidak melewati jalur konfirmasi pembelian baru yang diharapkan pengguna
4. Ringkasan akar masalah
Masalah ini bukan satu titik kegagalan, melainkan kombinasi dua faktor:
- Unfinished transaction mengganggu alur pembelian
- Rantai langganan sandbox berada dalam status kedaluwarsa (meskipun ada
latest transaction, belum tentu merupakan entitlement aktif)
Perilaku akhirnya: tidak ada pop-up, sukses semu, entitlement tetap kosong.
5. Strategi perbaikan (terbukti efektif)
5.1 Bersihkan unfinished transaction secara proaktif sebelum pembelian
Saat app startup dan sebelum pembelian, scan Transaction.unfinished lalu jalankan finish() untuk transaksi yang verified, agar transaksi lama tidak “membajak” alur pembelian baru.
5.2 Pertahankan dan perkuat log diagnostik (disarankan sebelum rilis)
Log penting yang sebaiknya dipertahankan sampai rilis:
- Snapshot
unfinished transaction subscription status(state, renewal info)- Jumlah iterasi
currentEntitlements - Detail transaction/expiration dari
latest(for:)
5.3 Gunakan validasi entitlement jalur ganda (opsional)
Jika pada environment tertentu currentEntitlements sempat kosong, gunakan latest(for:) sebagai fallback (tetap wajib memvalidasi status aktif).
6. Checklist IAP sebelum rilis
- Sebelum tiap pengujian, cek status langganan akun Sandbox (kedaluwarsa atau tidak)
- Catat jumlah
unfinisheddi jalur kritis - Uji tiga skenario: pembelian pertama / perpanjangan setelah kedaluwarsa / pemulihan pembelian
- Cek konsistensi antara
currentEntitlementsdanlatest - Jika terjadi “tanpa pop-up”, cek dulu apakah alur transaksi lama yang terpicu
7. Penutup
“Tekan beli tapi tidak muncul pop-up” tidak selalu berarti masalah UI atau timing pemanggilan.
Di StoreKit 2, status transaksi, antrean unfinished, dan siklus hidup langganan semuanya memengaruhi perilaku akhir.
Menambahkan log dan langkah pembersihan ini sebelum rilis dapat mengurangi banyak masalah IAP yang sulit direproduksi di production.