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() og guard-greiner
  • Før/etter product.purchase()
  • Transaction.updates
  • refreshEntitlements()
  • Transaction.currentEntitlements
  • Transaction.latest(for:)

Resultat:

  • purchase() returnerte .success
  • Transaksjonsverifisering lukkast, og transaction.finish() blei også køyrd
  • Men entitledIDs var 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:

  1. Transaction.currentEntitlements hadde iterasjonstal 0
  2. Transaction.latest(for: monthly) hadde ein gyldig post, men han var utgått
  3. Viktigast: før kjøpet fanst gamle transaksjonar i Transaction.unfinished
  4. 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 transaction er 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 i latest(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

  1. Før kvar test: stadfest abonnementstilstand for sandbox-kontoen (utgått eller ikkje)
  2. Logg talet på unfinished i kritiske stiar
  3. Test tre scenario: fyrstegongskjøp / fornying etter utløp / gjenopprett kjøp
  4. Sjekk konsistens mellom currentEntitlements og latest
  5. 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.