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 ésguardágakproduct.purchase()előtt/utánTransaction.updatesrefreshEntitlements()Transaction.currentEntitlementsTransaction.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
entitledIDstová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:
- A
Transaction.currentEntitlementsiterációszáma0volt - A
Transaction.latest(for: monthly)érvényes rekordot adott, de az már lejárt - Ennél is fontosabb: vásárlás előtt régi tranzakciók voltak a
Transaction.unfinishedlistában - 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 transactionsnapshotsubscription status(state, renewal info)currentEntitlementsiterációszámlatest(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
- Minden teszt előtt ellenőrizd a sandbox fiók előfizetési állapotát (lejárt-e vagy sem)
- A kritikus útvonalakon logold az
unfinishedelemek számát - 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”
- Ellenőrizd, hogy a
currentEntitlementsés alatestkonzisztens-e - 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.