Under IAP-testing før lansering støtte vi på eit klassisk, men svært forvirrande problem:
- Brukaren trykkjer «Hald fram kjøp»
- Knappen går til «Handsamar»
- Etter nokre sekund går han tilbake til «Hald fram kjøp»
- Ingen kjøpsstadfesting frå App Store blir vist
Denne artikkelen dokumenterer heile feilsøkingsløpet, nøkkelloggar, rotårsak og ei praktisk løysing som kan brukast før release.
1. Symptom
Produktlista på kjøpssida lasta normalt, men etter trykk på kjøp:
purchase()blei kalla- Ingen systemdialog dukka opp
- UI enda tilbake i ikkje-kjøpt tilstand
Ved første augekast såg det ut som om kjøpsflyten aldri starta, men loggane viste noko anna.
2. Fyrste runde: verifiser at kjøpsflyten faktisk køyrer
Vi la inn loggar på alle kritiske sjekkpunkt i kjøpsflyten:
- Parameter frå knappetrykk
- Inngang til
purchaseSelectedProduct()ogguard-greiner - Før/etter
product.purchase() Transaction.updatesrefreshEntitlements()Transaction.currentEntitlementsTransaction.latest(for:)
Resultat:
purchase()returnerte.success- Transaksjonsverifisering lukkast, og
transaction.finish()blei også køyrd - Men
entitledIDsvar framleis tom
Dette tyder: problemet var ikkje «kjøpet starta ikkje», men «rettar blei ikkje kjende att etter kjøp».
3. Avgjerande funn etter djupare analyse
Etter meir detaljert logging kom fleire tydelege signal fram:
Transaction.currentEntitlementshadde iterasjonstal0Transaction.latest(for: monthly)hadde ein gyldig post, men han var utgått- Viktigast: før kjøpet fanst gamle transaksjonar i
Transaction.unfinished - Den noverande
purchase()returnerte ein transaksjon frå ei gamal kjede, ikkje frå ein ny interaktiv kjøpsflyt
Dette forklarar kvifor det ikkje kom popup:
- StoreKit returnerte fyrst ein gamal, prosesserbar transaksjon (unfinished / historisk kjede)
- Koden fullførte han med
finish() - Kjøpet såg «vellukka» ut, men gjekk ikkje gjennom den nye stadfestingsflyten brukaren ventar
4. Oppsummering av rotårsak
Dette var ikkje éin enkeltfeil, men ein kombinasjon av to faktorar:
- Uferdige transaksjonar (
unfinished transaction) forstyrrar kjøpsflyten - Sandbox-abonnementskjeda er i utgått tilstand (sjølv med
latest transactioner det ikkje nødvendigvis ein aktiv entitlement)
Sluttresultatet blei: ingen popup, tilsynelatande suksess, tomme rettar.
5. Løysingsstrategi (verifisert i praksis)
5.1 Rydd unfinished-transaksjonar proaktivt før kjøp
Ved app-start og før kjøp: skann Transaction.unfinished og køyr finish() på verifiserte transaksjonar, slik at gamle transaksjonar ikkje kaprar den nye kjøpsflyten.
5.2 Behald og styrk diagnostiske loggar (tilrådd før lansering)
Desse loggane bør haldast aktive fram til release:
- Snapshot av
unfinished transaction subscription status(state, renewal info)- Iterasjonstal for
currentEntitlements transaction/expiration-detaljar ilatest(for:)
5.3 Bruk dobbel kanal for rettsvurdering (valfri herding)
Om currentEntitlements er mellombels tom i enkelte miljø, kan latest(for:) brukast som fallback (med framleis validering av aktiv status).
6. IAP-sjekkliste før lansering
- Før kvar test: stadfest abonnementstilstand for sandbox-kontoen (utgått eller ikkje)
- Logg talet på
unfinishedi kritiske stiar - Test tre scenario: fyrstegongskjøp / fornying etter utløp / gjenopprett kjøp
- Sjekk konsistens mellom
currentEntitlementsoglatest - Om «ingen popup» oppstår, sjekk fyrst om gamal transaksjonssti blei treft
7. Konklusjon
«Trykk på kjøp utan popup» betyr ikkje nødvendigvis eit UI-problem eller timing-problem i kalla.
I StoreKit 2 påverkar transaksjonstilstand, unfinished-kø og livssyklusen til abonnementet sluttåtferda direkte.
Ved å leggje inn desse loggane og ryddeprosedyrene før lansering kan du redusere mange IAP-problem som er vanskelege å gjenskape i produksjon.