Semasa ujian integrasi IAP sebelum pelancaran, kami menemui masalah yang biasa tetapi sangat mengelirukan:
- Pengguna menekan “Teruskan Pembelian”
- Butang bertukar kepada “Memproses”
- Beberapa saat kemudian kembali kepada “Teruskan Pembelian”
- Dialog pengesahan pembelian App Store tidak muncul
Artikel ini merakamkan laluan siasatan penuh, log penting, punca utama, dan strategi pembetulan yang boleh terus digunakan sebelum release.
1. Gejala
Senarai produk pada halaman pembelian dimuatkan dengan baik, tetapi selepas menekan beli:
purchase()dipanggil- Tiada dialog sistem muncul
- UI akhirnya kembali ke status belum dibeli
Pada pandangan awal, ia kelihatan seperti aliran pembelian tidak bermula langsung, tetapi log menunjukkan cerita yang berbeza.
2. Siasatan awal: adakah aliran pembelian benar-benar berjalan?
Kami menambah log pada semua titik kritikal dalam aliran pembelian:
- Parameter klik butang
- Titik masuk
purchaseSelectedProduct()dan cabangguard - Sebelum/selepas
product.purchase() Transaction.updatesrefreshEntitlements()Transaction.currentEntitlementsTransaction.latest(for:)
Keputusan:
purchase()memulangkan.success- Pengesahan transaksi berjaya, dan
transaction.finish()turut dilaksanakan - Tetapi
entitledIDskekal kosong
Ini bermaksud: masalahnya bukan “pembelian tidak bermula”, tetapi “entitlement tidak dikenali selepas pembelian”.
3. Penemuan penting selepas analisis mendalam
Selepas menambah log dengan lebih terperinci, beberapa isyarat penting muncul:
- Bilangan iterasi
Transaction.currentEntitlementsialah0 Transaction.latest(for: monthly)ada rekod yang sah, tetapi sudah tamat tempoh- Lebih penting: sebelum pembelian terdapat transaksi lama dalam
Transaction.unfinished purchase()semasa memulangkan transaksi daripada rantaian lama, bukan daripada aliran pembelian interaktif baharu
Ini menjelaskan kenapa “tiada popup”:
- StoreKit terlebih dahulu memulangkan transaksi lama yang boleh diproses (unfinished / rantaian sejarah)
- Kod anda menamatkannya dengan
finish() - Permintaan nampak “berjaya”, tetapi tidak melalui laluan pengesahan pembelian baharu yang dijangka pengguna
4. Ringkasan punca utama
Ini bukan kegagalan satu titik, tetapi gabungan dua faktor:
- Unfinished transaction mengganggu aliran pembelian
- Rantaian langganan sandbox berada dalam status tamat tempoh (walaupun ada
latest transaction, ia belum tentu entitlement aktif)
Tingkah laku akhir: tiada popup, kejayaan semu, entitlement tetap kosong.
5. Strategi pembetulan (terbukti berkesan)
5.1 Bersihkan unfinished transaction secara proaktif sebelum pembelian
Semasa app startup dan sebelum pembelian, imbas Transaction.unfinished dan jalankan finish() pada transaksi yang verified supaya transaksi lama tidak “merampas” aliran pembelian baharu.
5.2 Kekalkan dan perkuat log diagnostik (disyorkan sebelum pelancaran)
Log penting yang wajar dikekalkan sehingga release:
- Snapshot
unfinished transaction subscription status(state, renewal info)- Bilangan iterasi
currentEntitlements - Butiran transaction/expiration dalam
latest(for:)
5.3 Gunakan semakan entitlement dwi-laluan (opsyen pengukuhan)
Jika dalam sesetengah persekitaran currentEntitlements sementara kosong, gunakan latest(for:) sebagai fallback (dengan syarat status aktif tetap disahkan).
6. Senarai semak IAP sebelum pelancaran
- Sebelum setiap ujian, semak status langganan akaun Sandbox (tamat tempoh atau tidak)
- Log bilangan
unfinishedpada laluan kritikal - Uji tiga senario: pembelian pertama / pembaharuan selepas tamat tempoh / pulih pembelian
- Semak konsistensi antara
currentEntitlementsdanlatest - Jika “tiada popup” berlaku, semak dahulu sama ada laluan transaksi lama telah dipadankan
7. Kesimpulan
“Tekan beli tetapi tiada popup” tidak semestinya isu UI atau isu timing panggilan.
Dalam StoreKit 2, status transaksi, barisan unfinished, dan kitar hayat langganan semuanya mempengaruhi tingkah laku akhir.
Menambah log dan langkah pembersihan ini sebelum pelancaran boleh mengurangkan banyak isu IAP yang sukar direplikasi di production.