Az indulás előtti IAP tesztelés során egy tipikus, mégis nagyon zavaró problémába futottunk:

  • A felhasználó a „Vásárlás folytatása” gombra koppint
  • A gomb „Feldolgozás” állapotba vált
  • Néhány másodperc múlva visszaáll „Vásárlás folytatása” állapotba
  • Nem jelenik meg az App Store vásárlási megerősítő ablaka

Ez a cikk bemutatja a teljes hibafeltárási útvonalat, a kulcsfontosságú logokat, a gyökérokot és a kiadás előtt alkalmazható javítási stratégiát.

1. Jelenség

A vásárlási oldalon a terméklista rendben betöltődött, de a vásárlás gomb megnyomása után:

  • A purchase() meghívódott
  • Nem jelent meg rendszerablak
  • A felület végül visszaállt nem vásárolt állapotba

Első ránézésre úgy tűnt, mintha a vásárlási folyamat el sem indult volna, de a logok mást mutattak.

2. Első kör: tényleg lefut-e a vásárlási folyamat?

Minden kritikus ponton részletes logolást vezettünk be:

  • Gombkattintás paraméterei
  • purchaseSelectedProduct() belépési pont és guard ágak
  • product.purchase() előtt/után
  • Transaction.updates
  • refreshEntitlements()
  • Transaction.currentEntitlements
  • Transaction.latest(for:)

Eredmény:

  • A purchase() .success értékkel tért vissza
  • A tranzakció ellenőrzése sikeres volt, és a transaction.finish() is lefutott
  • De az entitledIDs továbbra is üres maradt

Ez azt jelenti: nem az volt a gond, hogy „nem indult el a vásárlás”, hanem hogy „a vásárlás utáni jogosultságokat nem ismerte fel a rendszer”.

3. Döntő megállapítások mélyebb elemzés után

További logokkal több kulcsjel is láthatóvá vált:

  1. A Transaction.currentEntitlements iterációszáma 0 volt
  2. A Transaction.latest(for: monthly) érvényes rekordot adott, de az már lejárt
  3. Ennél is fontosabb: vásárlás előtt régi tranzakciók voltak a Transaction.unfinished listában
  4. A mostani purchase() egy régi tranzakciós láncból adott vissza tranzakciót, nem új interaktív vásárlásból

Ez magyarázza, miért nincs felugró ablak:

  • A StoreKit először egy feldolgozható régi tranzakciót ad vissza (unfinished / történeti lánc)
  • A kód ezt finish() hívással lezárja
  • A kérés „sikeresnek” tűnik, de nem megy végig azon az új megerősítési úton, amit a felhasználó várna

4. Gyökérok összefoglaló

Nem egyetlen hiba állt a háttérben, hanem két tényező együtt:

  • Befejezetlen tranzakciók (unfinished transaction) zavarják a vásárlási folyamatot
  • A sandbox előfizetési lánc lejárt állapotban van (akkor is, ha van latest transaction, az nem feltétlenül aktív entitlement)

A végeredmény: nincs felugró ablak, látszólagos siker, üres jogosultságok.

5. Javítási stratégia (gyakorlatban bevált)

5.1 Unfinished tranzakciók proaktív tisztítása vásárlás előtt

App induláskor és vásárlás előtt járd be a Transaction.unfinished elemeit, és a hitelesített tranzakciókra hívd meg a finish()-t, hogy a régi tranzakciók ne térítsék el az új vásárlási folyamatot.

5.2 Diagnosztikai logok megtartása és erősítése (kiadás előtt ajánlott)

Ezeket a logokat érdemes a rajtig aktívan tartani:

  • unfinished transaction snapshot
  • subscription status (state, renewal info)
  • currentEntitlements iterációszám
  • latest(for:) transaction/expiration adatok

5.3 Kettős csatornás entitlement-ellenőrzés (opcionális megerősítés)

Ha bizonyos környezetekben a currentEntitlements átmenetileg üres, fallbackként használható a latest(for:) (de az aktív státuszt továbbra is ellenőrizni kell).

6. IAP ellenőrzőlista kiadás előtt

  1. Minden teszt előtt ellenőrizd a sandbox fiók előfizetési állapotát (lejárt-e vagy sem)
  2. A kritikus útvonalakon logold az unfinished elemek számát
  3. Tesztelj három forgatókönyvet: „első vásárlás / megújítás lejárat után / vásárlások visszaállítása”
  4. Ellenőrizd, hogy a currentEntitlements és a latest konzisztens-e
  5. Ha „nincs felugró ablak”, először nézd meg, hogy egy régi tranzakciós útvonal aktiválódott-e

7. Összegzés

A „vásárlásra koppintás felugró ablak nélkül” nem feltétlenül UI- vagy időzítési probléma.
StoreKit 2-ben a tranzakciók állapota, az unfinished sor és az előfizetés életciklusa közvetlenül befolyásolja a végeredményt.

Ezeknek a logoknak és tisztítási lépéseknek a bevezetése kiadás előtt jelentősen csökkenti azokat az IAP hibákat, amelyeket produkcióban nehéz reprodukálni.