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 cabang guard
  • Sebelum/selepas product.purchase()
  • Transaction.updates
  • refreshEntitlements()
  • Transaction.currentEntitlements
  • Transaction.latest(for:)

Keputusan:

  • purchase() memulangkan .success
  • Pengesahan transaksi berjaya, dan transaction.finish() turut dilaksanakan
  • Tetapi entitledIDs kekal 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:

  1. Bilangan iterasi Transaction.currentEntitlements ialah 0
  2. Transaction.latest(for: monthly) ada rekod yang sah, tetapi sudah tamat tempoh
  3. Lebih penting: sebelum pembelian terdapat transaksi lama dalam Transaction.unfinished
  4. 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

  1. Sebelum setiap ujian, semak status langganan akaun Sandbox (tamat tempoh atau tidak)
  2. Log bilangan unfinished pada laluan kritikal
  3. Uji tiga senario: pembelian pertama / pembaharuan selepas tamat tempoh / pulih pembelian
  4. Semak konsistensi antara currentEntitlements dan latest
  5. 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.